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