认识Binlog

binlog(Binary Log)是 MySQL 或 MariaDB 等数据库系统中用来记录数据库变更操作的日志文件。它记录了所有对数据库的数据更改操作(比如 INSERTUPDATEDELETE 等),并且这个日志在主从复制、数据恢复、审计等方面都有广泛应用。

1. binlog 与 SQL 的关系

binlog 记录的是数据库中所有对数据的修改操作,它并不直接记录 SQL 语句,而是记录变更的事件。对于一个 UPDATE 语句,它不会直接记录 SQL 语句本身,而是记录更新数据的细节(比如哪些行的数据被修改了,修改前后的值等)。

所以,binlog 并不等同于 SQL,它是数据库变更事件的记录。它的记录粒度是事件级别的,而不是 SQL 语句级别。

2. UPDATE 操作在 binlog 中的表现

假设一条UPDATE 语句会修改 3 条数据,那么它在 binlog 中会有怎样的记录呢?通常情况下,MySQL 的 binlog 使用两种格式:

  • Statement-based Replication (SBR):这种方式下,binlog 会记录 SQL 语句本身,比如记录一个 UPDATE 语句,它的语法会被直接写入 binlog。在这种模式下,binlog 的内容会大致与你执行的 SQL 语句相同。

  • Row-based Replication (RBR):在这种方式下,binlog 会记录每一行的变化。假设一个 UPDATE 语句影响了 3 行数据,binlog 会记录每一行的变化,包括每个字段的旧值和新值。这种方式记录的内容更详细,但也会导致 binlog 文件更大。

  • Mixed-based Replication (MBR):这种方式是 SBR 和 RBR 的混合体,MySQL 会根据不同情况自动选择最合适的记录方式。

所以:

  • SQL 语句是 UPDATE,它修改了 3 条数据,如果你使用的是 Row-based Replication (RBR),那么 binlog 会记录这 3 条数据的详细变更,意味着每一条数据的修改都会作为一个单独的事件记录在 binlog 中。因此,binlog 会记录 3 条数据修改,每一条都作为一个独立的记录。
  • 如果你使用的是 Statement-based Replication (SBR)binlog 会记录一次 UPDATE 语句,不会区分 3 条数据,而是将整个 SQL 语句作为一个事件记录。

3. 基于 binlog 复制数据时的表现

当从主库将数据复制到从库时,binlog 会根据记录的方式将数据传输到从库。假设你执行了一个 UPDATE 操作,并且它影响了 3 条记录:

  • 如果使用 Row-based Replication (RBR),那么每一行数据的变动都会被作为一个单独的操作传输到从库。也就是说,在从库中,这 3 条数据将 逐条被更新,每一行的变动都被记录并且按顺序执行。因此,从库会看到每一条数据逐一更新。

  • 如果使用 Statement-based Replication (SBR),则 UPDATE 语句会被作为一个整体传递到从库,而从库会执行这个 UPDATE 操作,对 3 条记录进行一次批量更新。因此,从库更新这些记录时,会在同一时间执行这个 UPDATE 语句,3 条数据会 同时更新

总结

  • binlog 记录的是数据库变更事件,并不是直接等同于 SQL 语句本身。具体记录的内容取决于你选择的复制格式:是基于语句(SBR),还是基于行(RBR)。

  • 如果是 UPDATE 语句修改了 3 条数据,Row-based Replication (RBR) 会将这 3 条数据分别作为独立的事件记录,而 Statement-based Replication (SBR) 会将整个 UPDATE 语句作为一个事件。

  • 在主从复制中,binlog 会按照记录的方式将变更数据同步到从库:如果是 RBR,则会逐条同步每一行的数据;如果是 SBR,则是一次性同步整个 SQL 语句。

所以依靠从库做业务,需要考虑从库的事务的『完整性』问题,主库的数据是由事务控制的,而从库有可能是一条条更新的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧之~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值