MySQL调优实战:MySQL日志机制深入解析,redo/undo/binlog/slow/error日志底层全通透
一、MySQL五大日志总览(全局认知)
MySQL 日志严格分为两层:Server层日志 + InnoDB引擎层日志。
这是90%人混淆的根源:
1.1 Server层日志(所有引擎通用)
-
Binlog(二进制日志):主从复制、数据恢复、逻辑日志
-
Slow Query Log(慢查询日志):SQL性能优化
-
Error Log(错误日志):启动、崩溃、异常排查
1.2 InnoDB引擎层日志(仅InnoDB独有)
-
Undo Log(回滚日志):事务回滚 + MVCC多版本
-
Redo Log(重做日志):崩溃恢复 + 事务持久性
总结:
Binlog管逻辑、Redo管物理;Undo管版本与回滚,Slow管性能,Error管异常。
二、Undo Log 回滚日志(MVCC核心)
2.1 核心作用(必背)
Undo Log 只有两个作用:
-
事务回滚:保证事务原子性
-
MVCC多版本快照:保存历史数据版本,实现无锁读
2.2 存储内容
记录 修改前的旧数据。
每次 update/delete 不会覆盖数据,而是把旧数据存入 undo log,通过行隐藏字段 DB_ROLL_PTR 串联成 版本链。
2.3 管理方式
InnoDB对undo log文件的管理采用段的方式,也就是回滚段(rollback segment) 。每个回滚段记录了 1024 个 undo log segment ,每个事务只会使用一个undo log segment。
在MySQL5.5的时候,只有一个回滚段,那么最大同时支持的事务数量为1024个。在MySQL 5.6开始,InnoDB支持 最大 128个回滚段,故其支持同时在线的事务限制提高到了 128*1024
2.4 常用参数

2.5 生命周期
-
事务执行:生成 undo log
-
事务回滚:用 undo 恢复数据
-
事务提交:undo 不会立刻删除,针对新增的记录,在事务提交后就可以删除
-
等待没有事务引用该版本后,后台线程 purge 清理
2.6 生产致命坑点
长事务 = undo 版本链无法清理 = 磁盘暴涨 + 查询变慢
长事务不提交,会导致大量 undo 堆积,MVCC 构造数据可视图时需要回溯超长版本链,SQL 越来越慢。
三、Redo Log 重做日志(崩溃恢复核心)
3.1 诞生目的
解决磁盘随机写太慢 的问题。
MySQL 修改数据先改内存,不会立刻刷磁盘,依靠 redo log 保证宕机不丢数据。
3.2 核心特性
-
物理日志:记录「数据页第几偏移量、改成了什么」
-
环形循环写入:ib_logfile0、ib_logfile1 循环覆盖
-
只属于InnoDB
-
保证 事务持久性
3.3 写入流程(核心)
WAL机制:先写日志,后写数据
-
修改 Buffer Pool 内存数据
-
写入 Log Buffer
-
按策略刷盘到 redo log 文件
-
后台线程空闲时刷盘真实数据页
3.4 崩溃恢复原理
重启 MySQL 时,扫描 redo 日志,区分事务状态:
-
已提交事务:redo 重做,把没刷盘的数据补上
-
未提交事务,未有prepare标志位:直接丢弃,保证数据一致性
-
未提交事务,有prepare标志位,且无binlog日志:直接丢弃,保证数据一致性
-
未提交事务,有prepare标志位,且有binlog日志:redo 重做,把没刷盘的数据补上
3.5 核心参数:innodb_flush_log_at_trx_commit
-
1(默认、最安全):每次提交必刷盘,金融、支付必须用
-
2:写系统缓存、定时落盘,性能折中
-
0:每秒刷盘,性能最高、断电丢数据
3.6 关键参数
-
innodb_log_buffer_size:设置redo log buffer大小参数,默认16M ,最大值是4096M,最小值为1M。
-
innodb_log_group_home_dir:设置redo log文件存储位置参数,默认值为"./",即innodb数据文件存储位置,其中的 ib_logfile0 和 ib_logfile1 即为redo log文件。
-
innodb_log_files_in_group:设置redo log文件的个数,命名方式如: ib_logfile0, iblogfile1... iblogfileN。默认2个,最大100个。
-
innodb_log_file_size:设置单个redo log文件大小,默认值为48M。最大值为512G,注意最大值指的是整个 redo log系列文件之和,即(innodb_log_files_in_group * innodb_log_file_size)不能大于最大值512G。
3.7 redo log 写入磁盘过程分析
3.8 redo log写入策略参看下图:

四、Binlog 二进制日志(主从&恢复核心)
4.1 基本定位
Server层逻辑日志,所有存储引擎通用。
binlog二进制日志记录保存了所有执行过的修改操作语句,不保存查询操作,不是物理页修改。

4.2 两大核心作用
-
主从复制:从库拉取 binlog 回放同步数据
-
数据恢复:误删数据可通过 binlog 时间点恢复
4.3 Binlog三种格式
-
Statement:记录SQL语句,节省空间,但是对于一些执行过程中才能确定结果的函数,比如UUID()、 SYSDATE()等函数如果随sql同步到slave机器去执行,可能主从数据不一致
-
Row(生产推荐):记录行变更,精准、无误差、数据安全
-
Mixed:混合模式,自动适配,在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种,如果sql里有函数或一些
在执行时才知道结果的情况,会选择Row,其它情况选择Statement,推荐使用这一种。
4.4 Binlog写入磁盘机制
- 服务器启动或重新启动
- 服务器刷新日志,执行命令flush logs
- 日志文件大小达到 max_binlog_size 值,默认值为 1GB
4.5 删除 Binlog 日志文件

4.6 查看 Binlog 日志文件
4.7 Binlog数据恢复实操
少量数据删除恢复
- 定位误删的 binlog 区间(时间 / 位置)
-
--base64-output=decode-rows -v:把行级事件翻译成可读伪 SQL(能看到被删行的完整数据)。 - 打开
delete_log.sql查询对应的删除语句,找到事务的起止位置

- 把delete语句反写成insert语句,在数据库执行
如果是批量数据误删或者是删表删库
则需要通过最新的全量备份+备份时间点到当前的binlog来恢复数据,执行如下sql:
4.8 Redo Log vs Binlog 面试终极区别
|
维度 |
Redo Log |
Binlog |
|---|---|---|
|
层级 |
InnoDB引擎层 |
Server服务层 |
|
类型 |
物理日志(页变更) |
逻辑日志(SQL/行变更) |
|
作用 |
崩溃恢复、持久化 |
复制、备份、恢复 |
|
引擎 |
仅InnoDB |
所有引擎通用 |
|
写入方式 |
环形循环覆盖 |
追加写入,永不覆盖 |
4.9 为什么会有redo log和binlog两份日志呢?
4.10 两阶段提交(2PC)核心原理
为了保证 redo log 和 binlog 数据一致,InnoDB 使用 2PC:
-
Prepare阶段:写 redo log(状态prepare)、写 binlog
-
Commit阶段:redo log 打上 commit 标记
宕机恢复判断:
-
有 prepare 无 commit:判断 binlog 是否完整
-
binlog 完整则提交,不完整则回滚
保证主从数据绝对一致
五、Slow Query Log 慢查询日志(性能优化核心)
5.1 作用
记录执行时间超过阈值的SQL,是慢SQL优化、排查数据库卡顿的核心依据。
5.2 核心参数
-
slow_query_log=ON:开启慢日志 -
long_query_time=1:超过1秒即为慢SQL -
log_queries_not_using_indexes:记录未走索引SQL
5.3 生产价值
线上数据库 CPU 高、IO 高、接口超时,90%都能从慢日志找到根源。
六、Error Log 错误日志(故障排查核心)
6.1 记录内容
-
MySQL启动、关闭、重启信息
-
崩溃宕机原因
-
参数错误、权限错误、文件损坏
-
连接异常、引擎报错
数据库莫名其妙挂掉、启动失败,优先看 error log
七、通用查询日志
八、五大日志联动全局总结(终极闭环)
一条更新SQL完整日志流程:
-
执行更新,先写入 undo log(用于回滚、MVCC)
-
修改内存数据,写入 redo log prepare
-
写入 binlog
-
redo log 标记 commit
-
后台刷盘数据页
-
SQL过慢则记录 slow log
-
出现崩溃则记录 error log
九、面试极简总结(背诵版)
MySQL 包含五大日志:undo log 实现事务回滚与MVCC多版本;redo log 基于WAL机制实现崩溃恢复,保障事务持久性;binlog 是Server层逻辑日志,支撑主从复制与数据恢复,通过两阶段提交保证与redo log一致;slow log 用于慢SQL性能排查;error log 用于故障定位。其中 redo/undo 为InnoDB独有,binlog/slow/error 为全局通用日志。
十、全文终极口诀
Undo回滚存版本,MVCC靠它撑场;
Redo重做防宕机,WAL机制保高强;
Binlog复制做恢复,逻辑日志主从帮;
Slow查慢优性能,Error排错救故障;
两层日志分清楚,底层通透不慌张。
更多推荐

所有评论(0)