好的 👍 阿杰,我来给你做一份 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:事务的灵魂,保证原子性和持久性。
 
发表回复