MySQL 中主要的日志类型

MySQL 提供了多种日志类型,每种都有其特定的目的和格式。理解这些日志对于数据库管理、性能调优、数据恢复和故障排查至关重要。

下面我将详细介绍 MySQL 中主要的日志类型及其格式

总结概览

日志类型主要目的格式是否默认开启
错误日志记录 MySQL 启动、运行、停止时的错误、警告和提示信息。文本格式
二进制日志记录所有更改数据的语句,用于主从复制和数据恢复。STATEMENT, ROW, MIXED否 (8.0默认开启)
通用查询日志记录所有到达 MySQL 的客户端连接和执行的语句。文本格式 / CSV 格式
慢查询日志记录执行时间超过指定阈值的查询,用于性能优化。文本格式 / CSV 格式
重做日志InnoDB 特有的,用于保证事务的持久性和崩溃恢复。物理格式(二进制)
回滚日志InnoDB 特有的,用于保证事务的原子性和 MVCC。逻辑格式

详细解析

1. 错误日志

这是 DBA 首先需要查看的日志,当数据库出现任何异常时,它通常是排查问题的起点。

  • 内容:启动/关闭信息、错误信息、警告信息、在复制环境中从服务器线程的启动信息等。

  • 格式:纯文本格式,易于阅读。

  • 配置参数

    • log_error:指定错误日志文件的位置。
  • 示例内容

    2023-10-27T08:00:00.000000Z 0 \[Note\] Server started.
    2023-10-27T08:01:23.456789Z 5 \[Warning\] Aborted connection 5 to db: 'test' user: 'root' host: 'localhost'
    

2. 二进制日志

这是最重要的日志之一,它记录了所有对数据库进行更改的 DDL 和 DML 语句(如 CREATE, ALTER, INSERT, UPDATE, DELETE),但不包括 SELECTSHOW 这类不修改数据的操作。

  • 主要用途

    • 数据恢复:可以通过 mysqlbinlog 工具重放二进制日志,将数据库恢复到某个时间点。

    • 主从复制:主服务器将二进制日志发送给从服务器,从服务器重放这些日志以保持数据同步。

  • 格式:二进制日志有三种格式,通过 binlog_format 参数设置:

    • STATEMENT

      • 记录原始的 SQL 语句

      • 优点:日志文件小,节省 I/O 和存储空间。

      • 缺点:可能产生不确定性的结果,例如使用 UUID(), RAND(), NOW() 等函数的语句在主从服务器上可能产生不同的值。

    • ROW

      • 记录每一行数据是如何被修改的

      • 优点:非常安全,能精确复制数据的变化,是数据一致性最高的格式。

      • 缺点:日志文件非常大,尤其是批量更新或删除时。

    • MIXED

      • 混合模式。MySQL 会根据执行的语句,在 STATEMENTROW 之间自动选择。对于可能产生不一致结果的语句,使用 ROW 格式;否则使用 STATEMENT 格式。

      • 平衡点:在安全性和性能之间取得一个平衡。

  • 查看工具:使用 mysqlbinlog 工具可以解析和查看二进制日志的内容。

    mysqlbinlog \-v /var/lib/mysql/binlog.000001
    

3. 通用查询日志

这是一个“什么都记”的日志,它会记录所有客户端的连接请求和所有执行的 SQL 语句。对性能影响较大,通常只在需要深度调试或审计时才开启。

  • 内容:连接、断开、执行的所有查询。

  • 格式:纯文本格式或 CSV 格式。

  • 配置参数

    • general_log:是否开启通用查询日志。

    • general_log_file:指定日志文件路径。

  • 示例内容

    2023-10-27T08:02:01.123456Z     6 Connect   root@localhost on test using Socket
    2023-10-27T08:02:05.654321Z     6 Query     SELECT \* FROM users
    2023-10-27T08:02:10.111111Z     6 Quit
    

4. 慢查询日志

这是性能优化的利器。它会记录执行时间超过 long_query_time(默认10秒)的查询,以及未使用索引的查询(如果 log_queries_not_using_indexes 开启)。

  • 内容:执行时间长的 SQL、扫描行数、返回行数、用户等信息。

  • 格式:纯文本格式或 CSV 格式(CSV 格式更方便导入到分析工具中,如 pt-query-digest)。

  • 配置参数

    • slow_query_log:是否开启慢查询日志。

    • slow_query_log_file:指定日志文件路径。

    • long_query_time:定义“慢”的阈值时间。

  • 示例内容

    # Time: 2023-10-27T08:03:00.000000Z
    # User@Host: root[root] @ localhost []  Id:     7
    # Query_time: 12.345678  Lock_time: 0.000123 Rows_sent: 1  Rows_examined: 1000000
    use test;
    SELECT * FROM large_table WHERE non_indexed_column = 'value';
    

5. 重做日志

这是 InnoDB 存储引擎层的核心日志,用于保证事务的 ACID 特性中的持久性

  • 工作原理

    1. 当修改数据时,InnoDB 会先将修改内容(物理逻辑日志,描述页的修改)写入重做日志缓冲区

    2. 在事务提交时,将缓冲区内容按一定策略刷新到磁盘的重做日志文件中。

    3. 之后,InnoDB 才会在合适的时机将修改的数据页刷新到磁盘的数据文件中。

  • 为什么重要:即使数据库发生崩溃,在重启时 InnoDB 也会检查重做日志,将已经提交但尚未写入数据文件的事务重做一遍,从而保证数据不丢失。

  • 格式:物理格式的二进制日志,记录的是数据页的物理变化,效率极高。

  • 文件:通常是 ib_logfile0ib_logfile1 两个文件,以循环写入的方式工作。

6. 回滚日志

同样是 InnoDB 存储引擎层的日志,用于保证事务的 ACID 特性中的原子性 和实现 MVCC

  • 保证原子性:在事务修改数据之前,InnoDB 会先将数据的原始版本复制到回滚日志中。如果事务需要回滚,InnoDB 可以利用回滚日志中的信息,将数据恢复到事务开始前的状态。

  • 实现 MVCC:在事务执行过程中,其他事务可能需要读取数据的旧版本,这个旧版本就来自回滚日志。

  • 格式:逻辑格式的日志,存储的是与操作相反的逻辑记录(例如,对于 INSERT,回滚日志会记录一个 DELETE)。

总结与建议

  • 日常运维错误日志慢查询日志是必须经常关注的。

  • 数据安全与复制二进制日志是核心,务必理解其三种格式的差异。现代生产环境通常推荐使用 ROWMIXED 格式。

  • 深度调试:仅在必要时开启通用查询日志,因为它对性能影响很大。

  • 引擎核心重做日志回滚日志是 InnoDB 的基石,虽然不直接操作,但理解其原理对掌握数据库至关重要。