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日志格式/