我正在尝试从表中删除记录,例如
DELETE * FROM table WHERE x=1 LIMIT 200000;
当我检查我的 bin 日志时,它显示此删除语句被分解为更小的块,例如:
sql(0):
336 records
sql(1):
336 records
这在我的复制中创造了一个高峰。任何想法为什么 bin-log 会以较小的块破坏事物?对于我正在使用 laravel 的框架
我正在尝试从表中删除记录,例如
DELETE * FROM table WHERE x=1 LIMIT 200000;
当我检查我的 bin 日志时,它显示此删除语句被分解为更小的块,例如:
sql(0):
336 records
sql(1):
336 records
这在我的复制中创造了一个高峰。任何想法为什么 bin-log 会以较小的块破坏事物?对于我正在使用 laravel 的框架
MySQL DELETE 不会分块,这就是手动完成分块的原因。
您正在使用基于行的复制;基于语句的复制不会引起这个问题,尽管它可能有其他缺点 - 手册中讨论了 RBR 与 SBR 的优缺点。
除非您按照此处所述在 Laravel中进行分块,否则您没有理由获得这种行为。可能发生的情况是您有非常大的行和非常小的 max_allowed_packet_size ,因此服务器正在以块的形式发送删除消息以将它们放入数据包中:
基于行的复制当前将更新行的所有列和列值从主服务器发送到从服务器,包括实际上没有被更新更改的列的值。这意味着,当您使用基于行的复制复制大列值时,您必须注意设置
max_allowed_packet
足够大以容纳要复制的任何表中的最大行,即使您仅复制更新,或者您仅插入相对较小的值。
另一方面,对表进行 RBR 和删除(除非它具有主索引)是复制的血洗;到过那里,做到了,看到奴隶没有反应时惊恐万分。你想要块删除;可能需要调整块大小或添加延迟。
有关如何执行此操作的一些方法,请参阅此答案。