MySQL-日志类型详解

MySQL 中的日志类型

MySQL 提供多种日志类型,用于记录数据库运行中的各种信息,下面是常见的日志类型:

日志类型 功能 常见日志名称 适用场景
错误日志 记录服务器启动、关闭、运行中的错误和警告信息。 error.log 诊断服务器问题,例如启动失败、崩溃等。
查询日志 记录所有客户端请求(连接、查询、断开连接等)。 general_log 调试 SQL 查询语句,分析客户端行为。
慢查询日志 记录执行时间超过阈值的 SQL 语句。 slow.log 定位慢查询,优化查询性能和索引。
事务日志 记录事务执行相关信息,保证事务的 ACID 特性。 redo log / undo log 保证事务回滚、数据恢复、并发控制。
二进制日志 记录所有更改数据的操作,支持数据恢复和主从复制。 binlog 数据恢复、主从复制同步。
中继日志 从库存储主库的二进制日志,用于主从复制。 relay-log 从库重放主库的更改操作。
审计日志 记录用户的访问行为和操作,用于安全审计和合规性需求。 audit.log 数据安全监控与合规需求。
性能日志 记录数据库运行时的性能数据(如锁等待、内存使用)。 performance_schema 数据库性能分析和优化。

其中,binlog(二进制日志)、redo log(重做日志)、undo log(回滚日志)是 MySQL 中与事务和数据一致性密切相关的三大核心日志。

三大日志的区别 binlog、redo log、undo log

  1. Binlog:逻辑日志,用于备份恢复和主从复制。
  2. Redo Log:物理日志,保证事务的持久性(Crash-Safe)。
  3. Undo Log:支持事务回滚和 MVCC,实现事务的原子性和隔离性。

详细对比:

日志 binlog redo log undo log
作用层级 Server 层 InnoDB 存储引擎层 InnoDB 存储引擎层
作用 支持 备份恢复主从复制,记录所有数据变更操作。 保证事务的 持久性(Crash-Safe),支持故障恢复。 支持事务的 原子性多版本并发控制(MVCC)
记录内容 记录 逻辑操作 (如 SQL 语句或行数据的变化) 记录 物理修改 (数据页的具体更改) 记录事务修改前的数据,用于 回滚MVCC
写入方式 追加写入:文件写满后创建新文件,不覆盖旧日志。 循环写入:固定大小,写满后从头开始覆盖。 随事务变化按需生成,形成 版本链
主要用途 数据恢复到指定时间点;主从复制同步。 宕机后恢复已提交的事务,保证数据一致性。 支持事务回滚;基于 MVCC 实现快照读和隔离性。

三大日志的详细说明

Undo Log(回滚日志)

  • 作用:
    • 事务回滚:记录修改前的数据,用于回滚操作,保证事务的原子性。
    • MVCC 支持:通过版本链实现多版本并发控制。
  • 工作机制:
    • 每次修改数据前,记录旧值到 Undo Log。
    • 形成版本链(通过 trx_idroll_pointer),配合 Read View 实现 MVCC 快照读。
  • MVCC 隔离级别:
    • 读已提交(Read Committed):每次查询生成新的 Read View,可能导致多次查询结果不一致。
    • 可重复读(Repeatable Read):事务启动时生成 Read View,保证整个事务中查询结果一致。

工作流程示意

image-20250123154957055

版本链示意

image-20250123155041326

Redo Log(重做日志)

  • 作用:
    • 保证事务的 持久性,即使宕机也能恢复提交的数据。
    • 提升写性能:利用 WAL(Write-Ahead Logging) 技术,将随机写转化为顺序写。
  • 工作机制:
    • 更新操作先写内存(Buffer Pool),同时记录 Redo Log,标记为脏页。
    • 后台线程在合适时机将脏页刷入磁盘。
    • 若发生宕机,可通过 Redo Log 恢复未刷盘的修改。
  • 刷盘时机:
    • 事务提交时写入磁盘(由 innodb_flush_log_at_trx_commit 参数控制)。
    • 后台线程每秒刷盘一次。

innodb_flush_log_at_trx_commit 参数控制

含义 适用场景
0 Redo Log 保存在内存,每秒刷盘一次,可能丢失最近 1 秒数据。 性能优先的开发、测试环境。
1 事务提交时立刻刷盘,保证数据可靠性。 数据要求极高可靠性的核心生产环境。
2 提交时写入文件系统缓存,每秒刷盘一次,可能丢失操作系统崩溃前的数据。 性能与可靠性折中的业务场景。

安全性来说: 1 > 2 > 0 写入性能来说: 0 > 2 > 1

redo + undo log 工作示意图

image-20250123155124011

Binlog(二进制日志)

  • 作用:
    • 备份与恢复:支持通过 Binlog 恢复到指定时间点。
    • 主从复制:主库把 Binlog 传输给从库,从库重放 Binlog 更新自身数据。
  • 记录方式(三种格式):
    • STATEMENT:记录 SQL 语句(逻辑日志),但动态函数可能导致主从不一致。
    • ROW:记录行数据的变化(物理日志),避免动态函数问题,但日志量大。
    • MIXED:根据情况选择 STATEMENT 或 ROW 模式。

刷盘控制:通过 sync_binlog 参数控制刷盘频率:

含义 适用场景
sync_binlog = 0 事务提交时只写入缓存,由操作系统决定刷盘。 性能优先的开发、测试环境。
sync_binlog = 1 每次事务提交都会立刻刷盘,保证数据可靠性。 数据要求极高可靠性的核心生产环境。
sync_binlog = N 每提交 N 个事务后刷盘,性能和可靠性折中。 性能优先但需一定可靠性的业务场景。

三大日志工作简示图

其中

  • redo log 的刷盘机制由于 innodb_flush_log_at_trx_commit 设置的值存在不同
  • bin log 的刷盘机制由于 sync_binlog 设置的值存在不同

image-20250123155202464