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
设置得足够高,以适应大多数预期的事件大小。