1. 服务层日志 (Server Level Logs)
1.1 错误日志 (Error Log)
- 作用:这是 MySQL 最重要的日志之一。它记录了 mysqld 服务在启动、运行和关闭过程中遇到的所有严重错误、警告以及一些重要的诊断信息。
- 应用场景:
- 当数据库无法启动时,首先就应该查看错误日志,它会告诉你原因。
- 排查运行中的疑难杂症,比如某个查询导致服务器崩溃,相关的堆栈信息会记录在这里。
- 配置:通过
log_error 参数指定文件路径。
1.2 通用查询日志 (General Query Log)
- 作用:它会记录所有到达 MySQL 服务器的连接和执行的每一条 SQL 语句。
- 应用场景:
- 用于审计,可以完整地回溯某个时间段内数据库的所有操作。
- 用于问题复现,当某个操作导致问题但无法确定是哪条 SQL 时,可以开启它来捕获。
- 注意事项:这个日志会记录海量信息,对服务器的 IO 性能影响非常大。因此,除非是在调试或审计的特殊情况下,生产环境通常是关闭的。
- 配置:通过
general_log 开关和 general_log_file 路径来控制。
1.3 慢查询日志 (Slow Query Log)
- 作用:这是我们后端工程师最常打交道的日志。它记录了执行时间超过指定阈值的所有 SQL 查询。
- 应用场景:
- 性能优化的主要入口。通过分析慢查询日志,我们可以找到系统中效率最低的 SQL 语句,然后针对性地进行优化(比如加索引、改写 SQL 等)。
- 核心配置:
slow_query_log: 开关。
long_query_time: 定义“慢”的时间阈值,单位是秒。
log_queries_not_using_indexes: 一个非常有用的选项,开启后,即使查询不慢,但只要它没有使用索引,也会被记录下来,帮助我们主动发现潜在的性能问题。
1.4 二进制日志 (Binary Log / Binlog)
- 作用:这是 MySQL 的逻辑日志,它记录了所有对数据库进行修改的操作(如 INSERT, UPDATE, DELETE),但不包括 SELECT。它以一种紧凑的二进制格式存储。
- 应用场景:
- 数据复制(Replication):主从同步的基石。从库(Slave)通过读取主库(Master)的 binlog 来重放主库上的数据变更,从而保持数据一致。
- 数据恢复(Point-in-Time Recovery):当数据库发生意外时,我们可以先用全量备份恢复到一个过去的时间点,然后利用 binlog 重放从那个时间点到故障发生前的所有操作,实现精准的数据恢复。
- 格式:有三种格式,STATEMENT(记录 SQL 语句,可能导致主从不一致)、ROW(记录每一行数据的变更细节,最安全,但日志量大)和 MIXED(混合模式,默认使用 STATEMENT,但在特定情况下会自动切换到 ROW)。现在 ROW 格式是主流和推荐的。
2. 引擎层日志 (Engine Level Logs)
2.1 重做日志 (Redo Log)
- 作用:这是 InnoDB 特有的物理日志,用于实现事务的持久性(Durability)和崩溃恢复(Crash Recovery)。
- 工作原理:当事务对数据进行修改时,InnoDB 会先把修改内容以物理变更的形式写入到 Redo Log Buffer,然后这个 Buffer 会适时地刷入到磁盘上的 Redo Log 文件。这个写入是顺序 IO,非常快。而真正的数据写入磁盘(随机 IO,较慢)则可以异步进行。
- 好处:它保证了即使数据库在数据页还未完全写入磁盘时宕机,重启后也可以通过重放 Redo Log 来恢复到宕机前的状态,确保已提交事务的修改不会丢失。这就是所谓的 WAL(Write-Ahead Logging)技术。
2.2 撤销日志 (Undo Log)
- 作用:它也是 InnoDB 特有的逻辑日志,主要有两个作用:
- 事务回滚(Rollback):当一个事务需要回滚时,InnoDB 会利用 Undo Log 中的信息来执行与原始操作相反的操作,从而将数据恢复到事务开始前的状态。
- 实现 MVCC(多版本并发控制):Undo Log 中保存了数据的历史版本。当一个读事务需要查看某个旧版本的数据时,InnoDB 会通过 Undo Log 来构建这个数据快照。
| 日志类型 |
所属层次 |
主要作用 |
| 错误日志 |
服务层 |
记录启动、运行、关闭的错误和诊断信息 |
| 通用查询日志 |
服务层 |
记录所有连接和 SQL 语句,用于审计和调试 |
| 慢查询日志 |
服务层 |
记录执行慢的 SQL,是性能优化的关键 |
| 二进制日志 (Binlog) |
服务层 |
记录数据修改,用于主从复制和数据恢复 |
| 重做日志 (Redo Log) |
引擎层 (InnoDB) |
保证事务持久性和崩溃恢复 |
| 撤销日志 (Undo Log) |
引擎层 (InnoDB) |
实现事务回滚和 MVCC |