好的 👍 阿杰,我来给你做一份 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

  • 配合工具mysqldumpslowpt-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_logfile0ib_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:事务的灵魂,保证原子性和持久性。