max_allowed_packet
设置 MySQL 服务器和客户端(包括副本)之间任何单个消息的大小上限。如果复制大型列值(例如,可能在 TEXT
或 BLOB
列中找到),并且源上的 max_allowed_packet
太小,则源将出现错误并停止,副本会关闭复制 I/O(接收器)线程。如果副本上的 max_allowed_packet
太小,也会导致副本停止 I/O 线程。
基于行的复制将更新行的所有列和列值从源发送到副本,包括实际上未被更新更改的列的值。这意味着,当使用基于行的复制复制大型列值时,必须注意将 max_allowed_packet
设置得足够大,以容纳要复制的任何表中的最大行,即使只复制更新,或者只插入相对较小的值。
在多线程副本(replica_parallel_workers > 0
)上,确保系统变量 replica_pending_jobs_size_max
设置为等于或大于源上 max_allowed_packet
系统变量的设置。 replica_pending_jobs_size_max
的默认设置是 128M,是 max_allowed_packet
的默认设置(64M)的两倍。 max_allowed_packet
限制源可以发送的数据包大小,但添加事件头可能会生成大小超过此限制的二进制日志事件。此外,在基于行的复制中,单个事件可能比 max_allowed_packet
大小大得多,因为 max_allowed_packet
的值只限制表的每个列。
副本实际上接受大小不超过 replica_max_allowed_packet
设置(默认值为 1GB 的最大值)的数据包,以防止由于数据包过大而导致复制失败。但是, replica_pending_jobs_size_max
的值控制副本上为保存传入数据包而分配的内存。指定的内存由所有副本工作队列共享。
replica_pending_jobs_size_max
的值是一个软限制,如果一个异常大的事件(包含一个或多个数据包)超过了这个大小,则该事务会被保留,直到所有副本工作者都清空了队列,然后才会被处理。所有后续的事务都会被保留,直到该大型事务完成。因此,尽管可以处理大于 replica_pending_jobs_size_max
的异常事件,但清空所有副本工作者队列的延迟以及等待排队后续事务的等待时间会导致副本出现延迟,并降低副本工作者的并发性。因此,应该将 replica_pending_jobs_size_max
设置得足够高,以容纳大多数预期的事件大小。