max_allowed_packet
设置了 MySQL 服务器和客户端之间的单个消息的大小上限,包括副本。如果您正在复制大型列值(例如在 TEXT
或 BLOB
列中找到的那样),并且 max_allowed_packet
在源上太小,那么源将失败并出现错误,并且副本将关闭复制 I/O(receiver)线程。如果 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
应该设置足够高,以容纳大多数预期的事件大小。