Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL binlog

MySQL binlog三种格式(STATEMENT / ROW / MIXED)的深度解析

作者:程序员卷卷狗

在使用 MySQL 做主从复制、高可用架构以及数据恢复时,你一定会遇到一个关键问题,即binlog 到底应该选择哪种格式,下面小编就和大家详细介绍一下吧

在使用 MySQL 做主从复制、高可用架构以及数据恢复时,你一定会遇到一个关键问题:

网上资料大多只讲概念,不讲“为什么这样设计、实际工程里应该怎么选”。

这篇文章蒜皮会从 原理机制 → 真实案例 → 实战选择 三条线讲透,让你彻底理解这三种格式的本质差异。

一、binlog 是什么?为什么格式如此重要?(应用视角理解)

binlog(Binary Log)是 MySQL 最重要的日志之一,用途包括:

而 binlog 的格式决定:

这就是 binlog 格式如此关键的原因。

MySQL 提供三种格式:

接下来我把每一种讲透,让你真正理解区别。

二、STATEMENT 格式:记录的是 SQL(轻量但风险最大)

STATEMENT binlog 记录的内容是 “你执行的 SQL 文本”

例如:

UPDATE user SET score = score + 1 WHERE id = 1;

binlog 内容类似:

statement: UPDATE user SET score = score + 1 WHERE id = 1;

优点(非常明显)

这在 数据量巨大、有大量写入 的系统中很有吸引力。

缺点(致命且不可忽视)

很多 SQL 是“不确定的”,比如:

例如:

UPDATE user SET last_login = NOW() WHERE id = 100;

主库时间与从库时间不一致,会造成:

主从数据不一致(fatal)。

这也是为什么 STATEMENT 已经 不推荐在生产环境使用

三、ROW 格式:记录的是行级变化(最安全)

ROW binlog 记录每一行的变动,而不是 SQL。

同样一条 SQL:

UPDATE user SET score = score + 1 WHERE id = 1;

ROW 格式 binlog 会生成:

before image: {id:1, score:99}
after image:  {id:1, score:100}

注意:并非一个 SQL 一条日志,而是每行变化一条日志。

这意味着:

从库只需要:

拿着 ROW 日志按顺序重放即可,100% 重现主库行为。

优点(强一致系统首选)

这就是支付、订单、核心交易系统统一使用 ROW 模式的原因。

缺点(唯一明显的缺点)

例如:

UPDATE user SET status=1 WHERE level in (1,2,3)

如果影响 50 万行 → row event 就会产生 50 万条。

对磁盘、网络、从库重放压力巨大。

四、MIXED 格式:两种模式的折中(让 MySQL 自动判断)

MIXED 模式是:

例如:

UPDATE user SET score = score + 1 WHERE id = 1;   → Statement
UPDATE user SET last_login = NOW();               → Row 

MIXED 本质上是一个“自动策略引擎”。

优点

缺点

五、怎么选择 binlog 格式

选择策略非常简单:

① 金融、支付、订单、交易系统 → 必须 ROW

原因:

这是行业硬规则。

② 大部分互联网业务 → MIXED 最合适

理由:

③ 写很少的系统 或 离线数据仓库 → STATEMENT

如:

原因:

六、总结:理解 binlog 格式,就是理解 MySQL 复制的底层逻辑

一句话总结全文:

STATEMENT 更轻但不安全,ROW 最安全但最大,MIXED 是折中策略。强一致用 ROW,一般业务用 MIXED,读多写少可考虑 STATEMENT。

binlog 格式不是一个简单参数,而是以下的关键设计点:

到此这篇关于MySQL binlog三种格式(STATEMENT / ROW / MIXED)的深度解析的文章就介绍到这了,更多相关MySQL binlog内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文