好的 👍 阿杰,我来给你做一份 MySQL 日志体系的图解 + 说明。MySQL 的日志比较多,常常容易混淆,一般分为 错误日志、通用查询日志、慢查询日志、二进制日志(binlog)、中继日志(relay log)、InnoDB 日志(redo/undo log)。
1. MySQL 日志体系总览
┌───────────────────────┐
│ 客户端请求 │
└─────────┬─────────────┘
│
▼
┌───────────────────────┐
│ 通用查询日志 (General) │ ← 记录所有连接与 SQL
└───────────────────────┘
│
▼
┌───────────────────────┐
│ 慢查询日志 (Slow Log) │ ← 记录执行慢的 SQL
└───────────────────────┘
│
▼
┌────────────────────────────────────┐
│ 事务执行过程 │
│ │
│ InnoDB Undo Log ← 事务回滚用 │
│ InnoDB Redo Log ← 宕机恢复用 │
└────────────────────────────────────┘
│
▼
┌───────────────────────┐
│ 二进制日志 (binlog) │ ← 主从复制 & 数据恢复
└───────────────────────┘
│
▼
┌───────────────────────┐
│ 中继日志 (relay log) │ ← 从库复制用
└───────────────────────┘
2. 各日志详解
(1) 错误日志 (Error Log)
- 作用:记录 MySQL 启动、关闭过程中的信息,以及运行中的错误、警告。
- 文件位置:默认在
datadir
下,文件名一般是hostname.err
。 - 启用方式:MySQL 默认开启。
示例:
2025-09-19T10:01:23.456789Z 0 [ERROR] [MY-010268] Out of memory.
2025-09-19T10:01:25.123456Z 0 [System] [MY-010116] Shutting down.
(2) 通用查询日志 (General Query Log)
- 作用:记录所有客户端连接和执行的 SQL。
- 位置:默认关闭,需要手动开启。
- 配置:
[mysqld]
general_log=ON
general_log_file=/var/log/mysql/general.log
(3) 慢查询日志 (Slow Query Log)
- 作用:记录执行时间超过
long_query_time
的 SQL,常用于性能优化。 - 配置:
[mysqld]
slow_query_log=ON
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2
- 配合工具:
mysqldumpslow
、pt-query-digest
。
(4) 二进制日志 (Binlog)
- 作用:
- 主从复制(Master 把写操作写到 binlog,从库读取 binlog 应用)。
- 数据恢复(结合全量备份 + binlog,恢复到任意时间点)。
- 内容:只记录 数据更新语句(DML、DDL),不记录 SELECT。
- 配置:
[mysqld]
log_bin=/var/lib/mysql/mysql-bin
binlog_format=ROW # 推荐:ROW、STATEMENT、MIXED
expire_logs_days=7 # 过期清理
(5) 中继日志 (Relay Log)
- 作用:仅存在于 从库,记录从 Master 复制过来的 binlog,等待 SQL 线程应用。
- 位置:
relay-log
文件,自动生成。
(6) InnoDB Redo Log
- 作用:保证 事务的持久性 (D)。
- 流程:事务提交时,先写入 redo log,再写 binlog。
- 文件位置:
ib_logfile0
、ib_logfile1
(MySQL 8.0 之后改为#innodb_redo/#
)。
(7) InnoDB Undo Log
- 作用:事务回滚、MVCC(多版本并发控制)。
- 存储位置:默认在
undo tablespace
。 - 生命周期:事务提交后,旧版本数据可以被清理。
3. 日志与事务的关系(binlog + redo log)
MySQL 使用 两阶段提交 (2PC) 保证一致性:
1. 事务执行 → 先写 Undo Log (支持回滚)
2. 写 Redo Log (prepare 状态)
3. 写 Binlog
4. Redo Log 提交 (commit 状态)
这样能保证:
- Binlog 和 Redo Log 一致时:正常恢复。
- Redo 有、Binlog 无:回滚。
- Binlog 有、Redo 无:从库不会执行。
4. 图解总结
你可以把 MySQL 日志体系理解为:
- 错误日志:系统黑匣子。
- 通用日志 / 慢日志:开发调优利器。
- Binlog / Relay log:主从复制 & 数据恢复。
- Redo / Undo log:事务的灵魂,保证原子性和持久性。
发表回复