MySQL bin 日志分成 block

标签 mysql mysqlbinlog binlog

我正在尝试从表中删除记录

DELETE * FROM table WHERE x=1 LIMIT 200000;

当我检查我的 bin 日志时,它显示此删除语句已分解为更小的 block ,例如:

sql(0):
  336 records
sql(1):
   336 records

这导致我的复制出现峰值。有什么想法为什么 bin-log 将东西分成更小的 block 吗?对于框架,我使用 Laravel

最佳答案

MySQL DELETE 不会分块,这就是手动完成分块的原因。

您正在使用基于行的复制;基于语句的复制不会出现这个问题,尽管它可能有其他缺点 - 手册中讨论了 RBR 与 SBR 的优缺点。

除非你在 Laravel 中进行分块 as described here ,没有理由让你得到这种行为。可能发生的情况是您有非常大的线路并且 very small max_allowed_packet_size ,因此服务器以 block 的形式发送删除消息以适合数据包:

Row-based replication currently sends all columns and column values for updated rows from the master to the slave, including values of columns that were not actually changed by the update. This means that, when you are replicating large column values using row-based replication, you must take care to set max_allowed_packet large enough to accommodate the largest row in any table to be replicated, even if you are replicating updates only, or you are inserting only relatively small values.

另一方面,表上的 RBR 和删除(除非它有主索引)对于复制来说是一场大屠杀;在那里,做了那件事,惊恐地看着奴隶失去了 react 。您想要删除 block ;可能需要调整 block 大小或添加延迟。

有关如何执行此操作的一些方法,请参阅 this answer .

关于MySQL bin 日志分成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57096510/

相关文章:

php - 显示 0000-9999 范围内的可用整数

MySql 添加联接会给出不正确的结果

mysql - 如何防止mysql创建mysql-bin.00000 x文件?

MySQL恢复,包括binlog位置MASTER_LOG_POS

mysql - 如何在启用二进制日志记录的安全模式下执行多表删除?

MySQL 二进制日志复制 : Can it be set to ignore errors?

mysql - 如何使用 T-SQL 获取所有 MySQL binlog 事件信息

php - 包括 JDatabaseDriver Joomla

MySQL 无效查询 : Too high level of nesting for select

MySQL 复制失败,错误为 "Could not parse relay log event entry."