问题:
假如库名叫做A库,表名叫B表,undo log,redo log和bin log,这些日志文件的生成的时间点是什么?是在mysql的哪一层生成的?哪些文件是有buffer的?哪些日志文件是存在磁盘上的?哪些存在内存中?另外如果有buffer,那这个buffer什么时候刷盘的,他会一直存在还是什么时候会被清除掉?如果存在磁盘上,那么它的名字叫什么?如果存在磁盘上,那他是会一直存在还是说什么时候会被清除掉?
答案:
涉及库名 A 和表名 B 的日志行为与全局日志机制一致,日志本身不按库表独立存储
MySQL 日志文件的生成时间点、层级归属、存储位置及生命周期详解
1. Undo Log
生成时间点:
存储位置 | 文件名/结构 | 生命周期 |
内存 | Undo Log Buffer | 事务执行期间暂存 Undo Log 条目,提交后可能保留(支持 MVCC) |
磁盘 | undo_001、undo_002(独立 Undo Tablespace,MySQL 8.0+ 默认)或 ibdata1(系统表空间,旧版本) | - 通过 Redo Log 间接保护持久性。 - 事务提交后,Undo Log 段可能被回收(若不被 MVCC 或长事务依赖)。 |
-
事务修改数据时:执行 INSERT/UPDATE/DELETE 前生成,用于事务回滚和 MVCC。
-
层级归属:存储引擎层(InnoDB)。
存储与生命周期:
Buffer 刷盘时机:
-
间接刷盘:Undo Log 的修改会先写入 Redo Log Buffer,事务提交时根据 innodb_flush_log_at_trx_commit 决定 Redo Log 刷盘,从而间接保证 Undo Log 的持久性。
-
清理机制:后台 Purge 线程异步清理不再需要的 Undo Log。
2. Redo Log
生成时间点:
存储位置 | 文件名/结构 | 生命周期 |
内存 | Redo Log Buffer | 事务执行期间暂存 Redo Log 条目,提交时根据配置刷盘。 |
磁盘 | ib_logfile0、ib_logfile1(默认文件名) | - 循环写入,日志空间重复利用。 - Checkpoint 推进后,旧日志可被覆盖。 |
-
数据页修改时:每次数据页变更(如 UPDATE)生成物理日志,确保崩溃恢复。
-
层级归属:存储引擎层(InnoDB)。
存储与生命周期:
Buffer 刷盘时机:
-
事务提交时:若 innodb_flush_log_at_trx_commit=1,提交时同步刷盘。
-
每秒异步刷盘:若 innodb_flush_log_at_trx_commit=0/2,由后台线程每秒刷盘。
-
Buffer 清理:刷盘后 Redo Log Buffer 空间可复用。
3. Bin Log
生成时间点:
存储位置 | 文件名/结构 | 生命周期 |
内存 | Binlog Cache(每个线程独立) | 事务执行期间暂存 Binlog 条目,提交时根据配置刷盘。 |
磁盘 | mysql-bin.000001(默认前缀) | - 按顺序写入,文件大小达 max_binlog_size 后切换新文件。 - 根据 expire_logs_days 自动清理过期文件。 |
-
事务提交时:记录逻辑操作(如 SQL 语句或行变更),用于主从复制和逻辑恢复。
-
层级归属:服务层(Server Layer)。
存储与生命周期:
Buffer 刷盘时机:
-
事务提交时:若 sync_binlog=1,提交时同步刷盘。
-
依赖 OS 刷盘:若 sync_binlog=0,由操作系统决定刷盘时机。
-
Buffer 清理:事务提交后 Binlog Cache 立即释放。
4. 日志文件总结
日志类型 | 生成时间点 | 生成层级 | 内存 Buffer | 磁盘文件 | Buffer 刷盘时机 | 磁盘文件清理机制 |
Undo Log | 事务修改数据时 | 存储引擎层(InnoDB) | Undo Log Buffer | undo_001 或 ibdata1 | 随 Redo Log 刷盘间接持久化 | Purge 线程清理(无长事务阻塞) |
Redo Log | 数据页修改时 | 存储引擎层(InnoDB) | Redo Log Buffer | ib_logfile0、ib_logfile1 | 提交时或每秒刷盘(依赖配置) | Checkpoint 推进后循环覆盖 |
Bin Log | 事务提交时 | 服务层 | Binlog Cache | mysql-bin.000001 等 | 提交时或依赖 OS(依赖配置) | 按 expire_logs_days 自动清理过期文件 |
5. 注意事项(可能存在版本差异)
-
Undo Log 存储位置:
-
MySQL 8.0+ 默认使用独立 Undo Tablespace(undo_001),旧版本可能存储在 ibdata1。
-
-
Bin Log 格式:
-
支持 Statement、Row、Mixed 格式,文件名固定前缀为 mysql-bin。
-
-
Redo Log 文件大小:
-
由 innodb_log_file_size 和 innodb_log_files_in_group 控制,默认 2 个文件循环使用。
-
6. 总结
-
Undo Log:事务修改时生成,存储引擎层管理,内存缓冲后通过 Redo Log 间接持久化,磁盘文件可独立或共享。
-
Redo Log:数据变更时生成,存储引擎层管理,内存缓冲后按配置刷盘,磁盘文件循环覆盖。
-
Bin Log:事务提交时生成,服务层管理,内存缓冲后按配置刷盘,磁盘文件按时间或大小清理。
建议配置:
-
高安全场景:innodb_flush_log_at_trx_commit=1 + sync_binlog=1。
-
高性能场景:innodb_flush_log_at_trx_commit=2 + sync_binlog=0(需容忍少量数据丢失风险)。