Documentation Home
MySQL 8.0 参考手册  / 第十七章复制  / 17.5 复制注意事项和技巧  / 17.5.1 复制特性和问题  /  16.4.1.19 复制和 max_allowed_pa​​cket

16.4.1.19 复制和 max_allowed_pa​​cket

max_allowed_packet为 MySQL 服务器和客户端(包括副本)之间的任何单个消息的大小设置上限。如果您正在复制大列值(例如可能在 TEXTBLOB列中找到)并且 max_allowed_packet在源上太小,则源会因错误而失败,并且副本会关闭复制 I/O 线程。如果 max_allowed_packet在副本上太小,这也会导致副本停止复制 I/O 线程。

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

在多线程副本 ( slave_parallel_workers > 0) 上,确保系统变量 slave_pending_jobs_size_max设置为等于或大于 max_allowed_packet源系统变量设置的值。的默认设置 128M是 64Mslave_pending_jobs_size_max的默认设置的两倍 。限制源可以发送的数据包大小,但是添加事件标头会产生超过此大小的二进制日志事件。另外,在基于行的复制中,单个事件的大小可以明显大于 ,因为 的值 只限制了表的每一列。 max_allowed_packetmax_allowed_packetmax_allowed_packetmax_allowed_packet

副本实际上接受的数据包达到其 slave_max_allowed_packet 设置的限制,默认为最大设置 1GB,以防止由于大数据包而导致复制失败。但是,值slave_pending_jobs_size_max 控制副本上可用的内存以保存传入的数据包。指定的内存在所有副本工作队列之间共享。

的值 slave_pending_jobs_size_max是一个软限制,如果一个异常大的事件(由一个或多个数据包组成)超过这个大小,事务将被暂停,直到所有的副本工作者都有空队列,然后再处理。所有后续交易都将暂停,直到大笔交易完成。因此,尽管异常事件大于 slave_pending_jobs_size_max可以处理的范围,但清除所有副本工作者队列的延迟和等待后续事务排队可能会导致副本滞后并降低副本工作者的并发性。 slave_pending_jobs_size_max 因此应设置得足够高以适应大多数预期的事件大小。