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

17.5.1.20 复制和 max_allowed_pa​​cket

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

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

在多线程副本(带有 replica_parallel_workers > 0slave_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_packetmax_allowed_packetmax_allowed_packetmax_allowed_packet只限制表格的每一列。

副本实际上接受的数据包达到其 replica_max_allowed_packetslave_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_maxslave_pending_jobs_size_max 可以被处理,但清除所有副本工作者队列的延迟和等待后续事务排队可能会导致副本滞后并降低副本工作者的并发性。 replica_pending_jobs_size_max 或者slave_pending_jobs_size_max 因此应设置得足够高以适应大多数预期的事件大小。