【问题标题】:MySQL bin log breaking in chunksMySQL bin 日志分块
【发布时间】:2019-07-18 14:09:10
【问题描述】:

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

DELETE * FROM table WHERE x=1 LIMIT 200000;

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

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

这在我的复制中造成了峰值。有什么想法为什么 bin-log 会以较小的块破坏事物?对于我使用 laravel 的框架

【问题讨论】:

  • DELETE * 不是东西

标签: mysql mysqlbinlog binlog


【解决方案1】:

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

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

除非你在 Laravel as described here 中进行分块,否则你没有理由得到这种行为。可能发生的情况是您有非常大的行和very small max_allowed_packet_size,因此服务器正在分块发送删除消息以将它们放入数据包中:

基于行的复制当前发送所有列和列值 对于从主机到从机的更新行,包括 更新实际上并未更改的列。这意味着, 当您使用基于行的方式复制大列值时 复制,您必须注意将max_allowed_packet 设置得足够大 容纳要复制的任何表中的最大行,即使 您只是在复制更新,或者您只是相对插入 小值。

另一方面,对表进行 RBR 和删除(除非它具有主索引)是复制的血腥洗礼;去过那里,做到了,当奴隶没有反应时,惊恐地看着。你想要块删除;可能需要调整块大小或添加延迟。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    相关资源
    最近更新 更多