4.1.20复制和max_allowed_packet

max_allowed_packet设置MySQL服务器和客户端之间任何单个消息的大小上限,包括副本。如果要复制较大的列值(例如可能在文本列),max_allowed_packet在源上太小,源出错,副本关闭复制I/O线程。如果max_allowed_packet在副本上太小,这也会导致副本停止I/O线程。

基于行的复制目前将源中更新行的所有列和列值发送到副本,包括未被更新实际更改的列的值。这意味着,在使用基于行的复制复制大型列值时,必须小心设置max_allowed_packet大到足以容纳任何要复制的表中最大的行,即使只复制更新,或者只插入相对较小的值。

在一个多线程副本上(使用replica_parallel_workers > 0slave_parallel_workers > 0),确保系统变量replica_pending_jobs_size_maxslave_pending_jobs_size_max的设置的值等于或大于max_allowed_packet系统变量的来源。的默认设置replica_pending_jobs_size_maxslave_pending_jobs_size_max, 128M,是默认设置的两倍max_allowed_packet,即64M。max_allowed_packet限制源可以发送的包大小,但添加事件头会产生超过此大小的二进制日志事件。此外,在基于行的复制中,单个事件可能比max_allowed_packet大小,因为值max_allowed_packet仅限制表的每一列。

该副本实际接受的数据包上限由其设置replica_max_allowed_packetslave_max_allowed_packet设置,默认为1GB的最大设置,以防止由于大数据包导致复制失败。然而,价值replica_pending_jobs_size_maxslave_pending_jobs_size_max控制副本上可用的内存来容纳传入的数据包。指定的内存在所有复制工作者队列中共享。

的价值replica_pending_jobs_size_maxslave_pending_jobs_size_max是一个软限制,如果一个异常大的事件(由一个或多个包组成)超过这个大小,事务将被持有,直到所有复制工作者都有空队列,然后处理。所有后续事务都将被保留,直到大型事务完成。所以尽管异常事件比replica_pending_jobs_size_maxslave_pending_jobs_size_max在可以处理的情况下,清除所有复制工作者队列的延迟和等待后续事务的队列会导致复制延迟和降低复制工作者的并发性。replica_pending_jobs_size_maxslave_pending_jobs_size_max因此应该设置足够高,以适应大多数预期的事件大小。