MySQL bin日志分成多个块

时间:2019-07-18 14:09:10

标签: mysql mysqlbinlog binlog

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

DELETE * FROM table WHERE x=1 LIMIT 200000;

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

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

这在我的复制中造成峰值。有什么主意为什么要对数分解成小块?对于我正在使用laravel的框架

1 个答案:

答案 0 :(得分:0)

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

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

除非您要在Laravel as described here中进行分块,否则没有理由应该得到这种行为。可能发生的情况是您的行和very small max_allowed_packet_size很大,因此服务器正在按块发送删除消息以使其适合数据包:

  

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

另一方面,表上的RBR和删除(除非它具有主索引)是复制的大屠杀;到那里去做,看到奴隶无动于衷的样子吓坏了。您想要删除块;可能需要调整块大小或添加延迟。

有关某些方法,请参见this answer