MySQL日志系统:类型、作用与配置详解
概述
MySQL 的日志系统是其可靠性和数据一致性的基石。了解各类日志的作用和处理流程,是深入理解 MySQL 运行机制的关键。InnoDB 存储引擎结合 MySQL Server 层,构建了一套完整的日志体系。
日志类型概览
MySQL 的日志分为两大类:
Server 层日志
| 日志类型 | 作用 | 存储位置 |
|---|---|---|
| 二进制日志(Binlog) | 记录数据变更,用于复制和恢复 | 磁盘文件 |
| 慢查询日志(Slow Query Log) | 记录执行超过阈值的 SQL | 磁盘文件 |
| 错误日志(Error Log) | 记录启动、运行、关闭时的错误信息 | 磁盘文件 |
| 通用查询日志(General Log) | 记录所有客户端连接和 SQL(性能差,生产少用) | 磁盘文件 |
| 中继日志(Relay Log) | 从库从主库拉取的 binlog,用于回放 | 磁盘文件 |
InnoDB 引擎层日志
| 日志类型 | 作用 | 存储位置 |
|---|---|---|
| 重做日志(Redo Log) | 保证事务持久性(Durability),崩溃恢复用 | ib_logfile 文件 |
| 回滚日志(Undo Log) | 保证事务原子性(Atomicity),支持回滚和 MVCC | ibdata1(共享表空间)或独立 undo 表空间 |
| Doublewrite Buffer | 解决部分页面写入问题,防止数据损坏 | 共享表空间 |
日志写入流程
一条 UPDATE 语句执行时,日志的写入顺序如下:
UPDATE users SET name = 'new' WHERE id = 1;
- Undo Log:记录旧值,以便回滚
- Redo Log(Prepare):写入 redo log,标记为 prepare 状态
- Binlog:写入二进制日志
- Redo Log(Commit):将 redo log 标记为 commit 状态(两阶段提交)
关键配置速查
# Binlog
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
sync_binlog = 1
# Redo Log
innodb_log_file_size = 512M
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 1
# 慢查询
slow_query_log = ON
long_query_time = 2
slow_query_log_file = /var/log/mysql/slow.log
# 错误日志
log_error = /var/log/mysql/error.log
日志之间的关系
事务提交
│
├──→ Redo Log(持久化事务变更,崩溃恢复用)
│
├──→ Binlog(记录逻辑 SQL 或行变更,复制和 PITR 用)
│
└──→ Undo Log(记录旧版本数据,回滚和 MVCC 用)
│
└──→ Buffer Pool ← Redo Log 保护已提交的数据
面试要点
- Redo Log 是物理日志,记录”做了什么修改”;Binlog 是逻辑日志,记录”怎么修改的”
- Redo Log 是 InnoDB 特有的,Binlog 是 Server 层共有的
- 两阶段提交 保证 Redo Log 和 Binlog 的一致性
- Undo Log 同时服务事务回滚和 MVCC 快照读
- Redo Log 是循环写的(固定大小),Binlog 是追加写的(可无限增长)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容