Linux之MySQL日志
前言
数据库就像一个庞大的图书馆,而日志则是记录这个图书馆内每一本书的目录。正如在图书馆中找到特定书籍一样,数据库日志帮助我们追溯数据的变更、定位问题和还原状态。
在MySQL中,日志是非常重要的一个组成部分,它记录了数据库运行状态的各种信息,包括错误信息、查询信息、事务信息等等,是进行异常排查、性能优化、数据恢复和备份的关键基础。
MySQL日志分类及介绍
MySQL中的日志主要分为两种类型:Server层和引擎层的日志(本次课程主要介绍Server层日志)。
Server层日志简介
用于记录MySQL Server层的各种操作和异常情况
- Error Log (错误日志) :记录
MySQL服务的启动、运行或停止过程中出现的问题和错误信息。用于了解服务器的状态和故障排除。 - Binary Log (二进制日志):记录对
MySQL数据库执行的更改操作,包括语句的发生时间、执行时长等信息,主要用于数据库恢复和主从复制。 - Relay Log ( 中继日志):用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的中间文件,从服务器通过读取中继日志的内容来同步主服务器上的操作。
- **DDL Log **:记录数据定义语句执行的元数据操作。
- General Log(查询日志) :记录所有连接到数据库的客户端发送给数据库服务器的指令,包括连接和断开连接信息、执行的查询和
SQL语句等。 - Slow Query Log (慢查询日志):记录执行时间超过阈值的
SQL查询语句,用于识别性能瓶颈、定位慢查询并进行优化。
InnoDB层日志简介
-
重做日志(redo log):
InnoDB使用重做日志来确保事务的持久性。当事务提交时,InnoDB会将该事务对数据库的修改记录到重做日志中。在数据库发生崩溃或意外关闭时,InnoDB可以通过重做日志来恢复未提交的事务,以保持数据的一致性。 -
回滚日志(undo log):
InnoDB使用回滚日志来实现事务的原子性和隔离性。当事务执行时,InnoDB会为该事务创建一个回滚日志,记录事务执行前的数据状态。如果事务需要回滚,InnoDB可以使用回滚日志将数据恢复到事务执行前的状态。此外,回滚日志还用于支持多版本并发控制(MVCC),使不同事务可以同时读取和修改相同的数据而不会相互干扰。
Server层日志
错误日志
错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。
该日志是默认开启的,默认存放目录/var/log/,默认的日志文件名为mysqld.log。查看日志位置:
show variables like '%log_error%'

切换至root用户,然后编辑/var/lib/mysql/auto.cnf。随机修改server_uuid信息,然后再重启mysqld服务信息,最后通过查看错误日志信息。
sudo vim /var/lib/mysql/auto.cnf
# 修改成功之后,退出并保存
# 重启mysql服务
sudo systemctl restart mysql
设置拥有者为mysql
sudo chown mysql auto.cnf
注意:修改之前,先保存好原有的
server_uuid,防止忘记。
重启mysql服务之后,通过查看错误信息后发现是修改了server_uuid导致服务无法正常启动。
# 查看mysql日志
sudo tail -f /var/log/mysql/error.sql

二进制日志
- 介绍
二进制日志(BINLOG)记录了所有的DDL(数据定义语言)和DML(数据操作语言)语句,但不包括数据查询(SELECT、SHOW)语句。
作用:1)灾难时的数据恢复;2)
MySQL的主从复制。在MySQL8版本中,默认二进制是开启的;在MySQL5.7版本中需要手动开启。
查看命令如下:
show variables like '%log_bin%';

修改/etc/mysql/mysql.conf.d/mysqld.cnf,开启log_bin二进制日志功能。在[mysqld]配置中添加以下信息:
[mysqld]
...
# 开启log_bin
log_bin=mysql_bin
# 设置唯一id
server-id=1
# 设置log_bin的日志格式(默认ROW)
binlog_format=ROW
最后,保存并退出,重启mysql服务。再次登陆mysql查看修改情况:
# 重启mysql服务
sudo systemctl restart mysql
# 再次登陆mysql
mysql -u root -p
# 输入root密码

主要参数介绍
| 参数 | 说明 |
|---|---|
| log_bin | 是否开启log_bin日志,NO表示开启,OFF表示关闭 |
| log_bin_basename | binlog日志的基本文件名,产生的bin-log文件名即为bin-log.* |
| log_bin_index | binlog文件的索引文件,管理所有binlog文件 |
切换到/var/lib/mysql目录下,查看二进制日志文件。(注意:请使用root账号切换目录)
# 切换root账号
su root
# 切换目录
cd /var/lib/mysql
# 查看目录下的文件信息
ll

- 日志格式
MySQL服务器中提供了多种格式来记录二进制日志,具体格式及特点如下:
| 日志格式 | 说明 |
|---|---|
| STATEMENT | 基于SQL语句的日志记录,记录的是SQL语句,对数据进行修改的SQL都会记录在日志文件中。 |
| ROW | 基于行的日志记录,记录的是每一行的数据变更。(默认) |
| MIXED | 混合了STATEMENT和ROW两种格式,默认采用STATEMENT,在某些特殊情况下会自动切换为ROW进行记录。 |
查看binlog的日志格式命令如下:
show variables like '%binlog_format%';

创建一个数据库db1,并在数据库下创建t_score成绩表。
mysql> create database db1;
mysql> use db1;
mysql> create table t_score(id int primary key auto_increment,name varchar(20) not null,course varchar(20) not null,score float default 0);
mysql> insert into t_score(name,course,score) values('张三','语文',99),('张三','数学',98),('里斯','语文',90),('里斯','数学',87);
mysql> commit;

- 日志查看
由于日志是以二进制方式存储的,不能直接读取,需要通过二进制日志查询工具mysqlbinlog来查看,具体语法:
mysqldbinlog [参数选项] logfilename
参数选项说明:
| 参数 | 说明 |
|---|---|
| -d | 指定数据库名称,只列出指定的数据库相关操作 |
| -o | 忽略点日志中的前n行命令 |
| -v | 将行事件(数据变更)重构为SQL语句 |
| -w | 将行事件(数据变更)重构为SQL语句,并输出注释信息 |
示例1:查看上一步骤的操作日志
切换到/var/lib/mysql目录,执行以下命令,查看执行日志:
# 切换目录
cd /var/lib/mysql
# 通过mysqlbinlog命令查看日志信息(看不到有效信息)
mysqlbinlog mysql_bin.000001
# 通过配置指定参数再次查看(可以清晰的看到SQL语句)
mysqlbinlog -v mysql_bin.000001

示例2:更换日志格式为STATEMENT
修改/etc/mysql/mysql.conf.d/mysqld.cnf文件。
# 编辑mysql配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
将[mysqld]配置中binlog_format=ROW修改成binlog_format=STATEMENT,其他配置不变。
[mysqld]
...
# 设置log_bin的日志格式(默认ROW)
binlog_format=STATEMENT
修改完成之后,重启mysql服务。(重要!!!)
这时可以在/var/lib/mysql目录下看到一个新的二进制日志文件。

注意:这里因为修改了日志格式,重启
mysql服务之后,将重新产生一个全新的二进制日志文件,如图上所示mysql-bin.000002。
基于日志格式STATEMENT,修改t_score表中所有人的成绩后,再次查看日志情况。
mysql> update t_score set score=score+1;
mysql> commit;# 切换目录
cd /var/lib/mysql
# 查看日志
mysqlbinlog -v mysql-bin.000002

- 日志删除
对于比较繁忙的业务系统,每天生成的binlog数据巨大,如果长时间不清除,将会占用大量磁盘空间。可以通过以下几种方式清理日志:
| 指令 | 说明 |
|---|---|
| reset master | 删除全部binlog日志,删除之后,日志编号将从binlog.000001重新开发 |
| purge master logs to 'binlog.******************' | 删除 ****************** 编号之前的所有日志 |
| purge master logs before 'yyyy-mm-dd hh24:mi:ss' | 删除日志为 “yyyy-mm-dd hh24:mi:ss”之前产生的日志 |
示例1:删除指定编号之前的所有日志
mysql> purge master logs to 'mysql-bin.000002'

示例2:删除全部日志
mysql> reset master
mysql8.0以下版本查看当前数据库日志binlog保存时效 以天为单位,默认0永不过期,最多只能设置99天。
show variables like '%expire_logs_days%';
mysql8.0以上版本通过设置全局参数binlog_expire_logs_seconds修改binlog保存时间,以秒为单位;默认30天。
show variables like '%binlog_expire_logs_seconds%'
SHOW VARIABLES LIKE 'log_bin';
示例2:数据备份和恢复
数据备份
mysqldump -u root -p db1 t_score > backup_t_score.sqlroot:链接名
db1:数据库名
t_score:表名
backup_t_score.sql:备份文件名
查询日志
查询日志中记录了客户端的所有操作语句,而二进制日志不包含查询数据的SQL语句。默认情况下,查询日志是未开启的。
show variables like '%general%';
如果需要开启查询日志,修改/etc/mysql/mysql.conf.d/mysqld.cnf文件。可以设置以下配置:
[mysqld]
# 该选项用来开启查询日志,可选值:0或1,0代表关闭,1代表开启
general_log=1
# 设置日志的文件名,如果没有指定,默认的文件名为host_name.log
general_log_file=mysql_query.log
修改完毕之后,需要重启mysql服务。

使用tail命令实时查看mysql_query.log日志文件信息。
tail -f mysql_query.log
然后再登录到mysql,执行以下操作后,在切换到mysql_query.log日志文件中查看信息。
mysql> show databases;
mysql> use db1;
mysql> show tables;
mysql> select * from t_score;
mysql> select * from t_score where id = 1;
mysql> update t_score set score = score - 1;
....

慢查询日志
慢查询日志记录了所有执行时间超过参数long_query_time设置值并且扫描记录数不小于min_examined_row_limit的所有的SQL语句的日志,默认未开启。long_query_time默认为10秒,最小为0,精度可以到微秒。
show variables like '%slow_query%';

如果需要开启查询日志,修改/etc/mysql/mysql.conf.d/mysqld.cnf文件。可以设置以下配置:
[mysqld]
# 慢查询日志
slow_query_log=1
# 执行时间参数
long_query_time=2
修改完毕之后,需要重启mysql服务。
使用tail命令实时查看zking-slow.log日志文件信息。
tail -f zking-slow.log
然后再登录到mysql,切换至db1数据库并创建t_log表(参考资料db.txt)。将资料中t_log.sql上传至虚拟机并导入到数据库中。
# 上传t_log.sql
rz t_log.sql
# 导入数据
mysql -uroot -密码 数据库名 < t_log.sql
最后登录mysql,执行以下SQL语句并查看慢查询日志文件信息。
mysql> select * from t_log limit 120000,10;

默认情况下,不会记录管理语句,也不会记录不使用索引进行查找的查询。可以使用log_slow_admin_statements和更改此行为log_queries_not_using_indexes,如下所示:
[mysqld]
# 记录执行较慢的管理语句
log_slow_admin_statements=1
# 记录执行较慢的未使用索引的语句
log_queries_not_using_indexes=1相关文章:
Linux之MySQL日志
前言 数据库就像一个庞大的图书馆,而日志则是记录这个图书馆内每一本书的目录。正如在图书馆中找到特定书籍一样,数据库日志帮助我们追溯数据的变更、定位问题和还原状态。 在MySQL中,日志是非常重要的一个组成部分,它记录了数据…...
Redis集群模式—主从集群、哨兵集群、分片集群
主从集群 主从模式中,包括一个主节点(Master)和一个或多个从节点(Slave)。主节点负责处理所有写操作和读操作,而从节点则复制主节点的数据,并且只能处理读操作。当主节点发生故障时,…...
并发工具类(二):CyclicBarrier
1、CyclicBarrier 介绍 从字面上看 CyclicBarrier 就是 一个循环屏障,它也是一个同步助手工具,它允许多个线程 在执行完相应的操作后彼此等待共同到达一个屏障点。 CyclicBarrier可以被循环使用,当屏障点值变为0之后,可以在接下来…...
Spring Cloud全解析:负载均衡之Ribbon简介
Ribbon简介 Ribbon是一种客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起,提供了一系列完善的配置如连接超时、重试等,Ribbon会自动的帮助基于某种规则(如简单轮询、随机连接等)去连接那些机器,也可以自定义的负载均衡…...
Kettle安装与使用指南
1. 介绍 什么是Kettle? Kettle,全称Pentaho Data Integration (PDI),是Pentaho BI套件的一部分。它提供了一个可视化的ETL工具,允许用户通过图形界面设计复杂的数据集成流程。Kettle支持多种数据源,包括关系型数据库…...
教育行业解决方案:智能PPT在教育行业的创新应用
在信息化时代,教育行业面临着巨大的变革。随着人工智能技术的不断发展,传统教学方式正在被重新定义。彩漩科技作为 AI 技术的先行者,推出了歌者 PPT &彩漩 PPT,为教师、学生和家长提供了一种全新的教育体验,实现了…...
Matlab程序练习
Part1 1.求 [100,999] 之间能被 21整除的数的个数。 程序: 主文件:main.m clear; start_num 100; end_num 999; div_num 21; res div(start_num,end_num,div_num); fprintf("[%d,%d]之间能被%d整除的数的个数为%d个\n",start_num,end_…...
cesium可不可以改变影像底图颜色,如何给地球底图影像添加一层滤镜蒙版?
废话:你的球是不是很丑?是不是没有科技感?是不是没有好看的影像? 因果: 因:客户问,底图可不可以改变颜色,想让球更漂亮一些。 答:可以改变影像饱和度,透明度…...
MyBatis-MappedStatement什么时候生成?QueryWrapper如何做到动态生成了SQL?
通过XML配置的MappedStatement 这部分MappedStatement主要是由MybatisXMLMapperBuilder进行解析,核心逻辑如下: 通过注解配置的MappedStatement 核心逻辑就在这个里面了: 继承BaseMapper的MappedStatement 我们看看这个类,里…...
Netty系列-2 NioServerSocketChannel和NioSocketChannel介绍
背景 本文介绍Netty的通道组件NioServerSocketChannel和NioSocketChannel,从源码的角度介绍其实现原理。 1.NioServerSocketChannel Netty本质是对NIO的封装和增强,因此Netty框架中必然包含了对于ServerSocketChannel的构建、配置以及向选择器注册&am…...
智能客服的四大优势,提升企业服务效率
在这个信息化快速发展的时代,客户服务的重要性越来越凸显。传统的客服方式已经无法满足企业日益增长的服务需求,于是智能客服服务应运而生。智能客服服务不仅改变了企业与客户的互动方式,还提高了服务效率和客户满意度。本文将深入探讨智能客…...
AutoGPT开源项目解读
AutoGPT开源项目解读 (qq.com) AutoGPT旨在创建一个自动化的自我改进系统,能够自主执行和学习各种任务 项目基本信息 首先阅读项目的README.md,下述代理和智能体两个名词可互换 项目简介:一个创建和运行智能体的工具,这些智能体…...
Linux离线安装fontconfig
Linux离线下载yum包,安装字体库 一、下载安装包 以CentOS Linux release 7.9.2009下载fontconfig的rpm包的为例 http://mirror.centos.org/centos/7/按提示跳转历史库 找到对应版本的centos https://vault.centos.org/7.9.2009/os/x86_64/Packages/在Packages目…...
海山数据库(He3DB)+AI:(一)神经网络基础
文章目录 1 引言2 基本结构2.1 神经元2.2 模型结构 3 训练过程3.1 损失函数3.2 反向传播3.3 基于梯度的优化算法 4 总结 1 引言 神经网络可以被视为一个万能的拟合器,通过深层的隐藏层实现输入数据到输出结果的映射。神经网络的思想源于对大脑的模拟,在…...
CSS中选择器有哪些?(史上最全选择器)
CSS选择器是用来选择和应用样式到HTML元素上的工具。以下是所有主要的CSS选择器的详细分类和描述: 1. 基本选择器 通配符选择器 (*):选择所有元素。例如,* { color: red; } 会将所有元素的文字颜色设置为红色。元素选择器:选择指…...
本地部署 AI 智能体,Dify 搭建保姆级教程(下):知识库 RAG + API 调用,我捏了一个红楼解读大师
话接上篇: 本地部署 AI 智能体,Dify 搭建保姆级教程(上):工作流 Agent,把 AI 接入个人微信 相信大家已经在本地搭建好 Dify 了。 今日分享,继续介绍 Dify 的另外两项重要功能: 知…...
HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 答案纯享版
这篇文章是高级题库答案纯享版,只有需要选择的选项。如果需要查看所有选项,可以点击下方链接跳转。以考代学,还是推荐点击下方链接,查看完整的题库,边看边学习鸿蒙应用开发。此题库已更新完毕,笔者将不继续…...
基于PHP的文件包含介绍
引言:在实际开发过程中,经常会遇到部分模块功能需要重复使用的情况,比如数据库的增删改查,文件包含通过将需要重复使用的功能模块代码引入其他文件的内容,实现重用代码、分离配置等。然而,如果文件包含操作…...
K7系列FPGA多重启动(Multiboot)
Xilinx 家的 FPGA 支持多重启动功能(Multiboot),即可以从多个 bin 文件中进行选择性加载,从而实现对系统的动态更新,或系统功能的动态调整。 这一过程可以通过嵌入在 bit 文件里的 IPROG 命令实现上电后的自动加载。而…...
关于武汉芯景科技有限公司的RS232通信接口芯片XJ3243EEUI开发指南(兼容MAX3243EEUI)
一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、典型应用电路 三、功能描述 1.Transmitter 通过T1,T2可以将TTL电平转换为RS232电平 2.Receiver 通过R1,R2可以将RS232电平转换为TTL电平 3.工作模式控制 4.INVALID引脚...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
