Mysql日志格式

概述

MySQL 的日志主要包括二进制日志(Binary Log)错误日志慢查询日志一般查询日志中继日志。其中,二进制日志的格式直接影响主从复制和数据恢复。本文重点介绍二进制日志的三种格式:Statement (SBR)Row (RBR)Mixed,并简述其他日志类型。

二进制日志格式

1. Statement(基于语句的复制,SBR)

  • 描述:记录执行的 SQL 语句,如 INSERT INTO table VALUES (…);。
  • 特点
    • 日志文件较小,仅记录 SQL 语句。
    • 非确定性操作(如 NOW()、RAND())可能导致主从复制不一致。
    • 触发器、存储过程等可能无法正确复制。
    • 日志可读性高,适合人工分析。
  • 适用场景
    • 存储空间有限。
    • 数据一致性要求不高,或操作多为确定性。
    • 需要审计 SQL 执行历史。
  • 配置:binlog_format = STATEMENT

2. Row(基于行的复制,RBR)

  • 描述:记录每行数据的实际变化(插入、更新、删除),而非 SQL 语句。
  • 特点
    • 日志文件较大,记录具体数据变化。
    • 保证数据一致性,适合非确定性操作。
    • 对复杂查询(如多表联接)效率较高。
    • 日志可读性低,不便于人工分析。
  • 适用场景
    • 高一致性的主从复制。
    • 涉及非确定性操作(如 UUID()、RAND())。
    • 数据更新频繁,复杂查询较多。
  • 配置:binlog_format = ROW

3. Mixed(混合模式)

  • 描述:结合 Statement 和 Row 格式,MySQL 根据操作类型自动选择。
  • 特点
    • 默认使用 Statement 格式,记录 SQL 语句。
    • 非确定性操作或特定场景(如 INSERT … SELECT)切换为 Row 格式。
    • 兼顾日志大小和一致性,但行为可能不够明确。
    • 可读性取决于记录格式。
  • 适用场景
    • 需要平衡一致性和存储空间。
    • 不确定操作类型,依赖 MySQL 自动优化。
  • 配置:binlog_format = MIXED

其他日志类型

  • 错误日志(Error Log)
    • 记录 MySQL 启动、停止及运行错误,格式为纯文本。
  • 慢查询日志(Slow Query Log)
    • 记录执行时间超阈值的查询,格式为文本,包含 SQL 和执行时间。
  • 一般查询日志(General Query Log)
    • 记录所有客户端连接和 SQL 语句,格式为文本,适合调试但开销大。
  • 中继日志(Relay Log)
    • 用于主从复制,存储从主库接收的二进制日志,格式与二进制日志一致。

格式对比

特性 Statement (SBR) Row (RBR) Mixed
记录内容 SQL 语句 每行数据变化 自动选择 Statement 或 Row
日志大小 较小 较大 中等
一致性 可能不一致(非确定性操作) 高一致性 较高(视情况切换)
可读性 高(SQL 语句易读) 低(数据变化难读) 视记录格式而定
适用场景 审计、简单操作、空间受限 高一致性、复杂查询 折中场景
性能影响 主库执行快,日志小 主库记录开销大,复制可靠 平衡性能与一致性

配置与查看

  • 查看当前日志格式

    1
    SHOW VARIABLES LIKE 'binlog_format';
  • 设置日志格式(需 SUPER 权限):

    1
    SET GLOBAL binlog_format = 'STATEMENT'; -- 或 ROW, MIXED

    或在 my.cnf 中配置:

    1
    2
    [mysqld]
    binlog_format = ROW

注意事项

  • 版本差异:MySQL 5.7 起推荐 Row 格式,因其复制一致性更高。
  • 复制环境:Row 格式适合高可用、高一致性场景。
  • 存储空间:Row 格式日志文件较大,需确保足够磁盘空间。
  • 非确定性操作:如 LIMIT 无 ORDER BY、触发器等,推荐 Row 或 Mixed 模式。

Mysql日志格式
https://blog.t-ao.cn/2025/07/07/Mysql日志格式/
作者
TAO
发布于
2025年7月7日
许可协议