binlog 三种格式对比
面试官问:"MySQL binlog 有哪几种格式?有什么区别?"
小李说:"有 STATEMENT 格式和 ROW 格式。"
面试官追问:"那 MIXED 格式是什么?"
小李说:"...混合模式?"
面试官继续追问:"为什么大厂推荐用 ROW 格式?STATEMENT 格式有什么问题?"
小李开始答不上来。
binlog 格式是 MySQL 主从复制的核心。这道题能说清楚三种格式的区别、优缺点和适用场景的候选人,对 MySQL 复制的理解已经相当深入。
一、三种 binlog 格式 🔴
1.1 格式概览
1.2 STATEMENT 格式
Slave 重放:执行相同的 SQL 语句。
问题:
1.3 ROW 格式
Slave 重放:执行相同的行变更操作。
优点:精确到每一行,不受函数影响。
缺点:批量更新时,binlog 体积可能是 STATEMENT 的 10 倍甚至 100 倍。
1.4 MIXED 格式
1.5 ❌ 错误示范
候选人原话:"ROW 格式总是最好的,所以所有场景都用 ROW。"
问题诊断:ROW 格式虽然精确,但 binlog 体积大,在高并发写入时可能撑爆磁盘。应根据业务场景选择。
候选人原话 2:"STATEMENT 格式记录的是执行结果。"
问题诊断:混淆了 STATEMENT 和 ROW。STATEMENT 记录的是 SQL 语句,不是执行结果。
【面试官心理】 这道题我能从 STATEMENT 格式的问题切入。比如我会问:"为什么 NOW() 函数在 STATEMENT 格式下会导致主从不一致?"能说清楚非确定性函数问题的候选人,说明他对 binlog 格式有深入理解。
二、STATEMENT 格式的坑 🔴
2.1 非确定性函数
2.2 自增列和序列
2.3 触发器和存储过程
三、ROW 格式的优缺点 🟡
3.1 ROW 格式的优势
- 精确性:每一行变更有完整的变更前后值
- 一致性:不受函数、触发器、存储过程影响
- 可回滚:可以精确回滚任意一行数据
- 审计友好:可以看到每行的具体变更
3.2 ROW 格式的劣势
问题:
- binlog 体积膨胀,磁盘 IO 压力大
- 主从复制时网络传输量大
- 归档日志占更多空间
3.3 binlog_row_image 参数
四、MIXED 格式的选择逻辑 🟡
4.1 MIXED 的判断规则
4.2 如何选择格式
五、生产配置 🟢
5.1 设置 binlog 格式
5.2 监控 binlog 大小
【面试官心理】
问 binlog 格式的候选人很多,但能说出 binlog_row_image 参数和 expire_logs_days 配置的是少数。生产环境中的 binlog 管理是一个重要的运维知识点。