#### 17.5.1.20 复制和最大值\_允许\_包

[](<>)[](<>)

[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)设置 MySQL 服务器和客户端之间任何单个消息的大小上限，包括副本。如果您要复制较大的列值（例如可能在[`文本`](blob.html)要么[`斑点`](blob.html)列）和[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)在源上太小，源因错误而失败，并且副本关闭复制 I/O（接收器）线程。如果[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)在副本上太小，这也会导致副本停止 I/O 线程。

基于行的复制将更新行的所有列和列值从源发送到副本，包括实际上没有被更新更改的列的值。这意味着，当您使用基于行的复制复制大列值时，您必须注意设置[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)大到足以容纳要复制的任何表中的最大行，即使您只复制更新，或者您只插入相对较小的值。

在多线程副本上（使用[`副本并行工作人员 > 0`](replication-options-replica.html#sysvar_replica_parallel_workers)要么[`slave_parallel_workers > 0`](replication-options-replica.html#sysvar_slave_parallel_workers))，确保系统变量[`replica_pending_jobs_size_max`](replication-options-replica.html#sysvar_replica_pending_jobs_size_max)要么[`slave_pending_jobs_size_max`](replication-options-replica.html#sysvar_slave_pending_jobs_size_max)设置为等于或大于设置的值[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)源上的系统变量。默认设置为[`replica_pending_jobs_size_max`](replication-options-replica.html#sysvar_replica_pending_jobs_size_max)要么[`slave_pending_jobs_size_max`](replication-options-replica.html#sysvar_slave_pending_jobs_size_max), 128M, 是默认设置的两倍[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)，即 64M。[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)限制了源可以发送的数据包大小，但是添加事件标头会产生超过此大小的二进制日志事件。此外，在基于行的复制中，单个事件可能远大于[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)大小，因为值[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)只限制表格的每一列。

副本实际上接受的数据包达到其设置的限制[`replica_max_allowed_pa​​cket`](replication-options-replica.html#sysvar_replica_max_allowed_packet)要么[`slave_max_allowed_pa​​cket`](replication-options-replica.html#sysvar_slave_max_allowed_packet)设置，默认最大设置为 1GB，以防止由于大数据包导致复制失败。然而，价值[`replica_pending_jobs_size_max`](replication-options-replica.html#sysvar_replica_pending_jobs_size_max)要么[`slave_pending_jobs_size_max`](replication-options-replica.html#sysvar_slave_pending_jobs_size_max)控制副本上可用的内存以保存传入的数据包。指定的内存在所有副本工作队列之间共享。

的价值[`replica_pending_jobs_size_max`](replication-options-replica.html#sysvar_replica_pending_jobs_size_max)要么[`slave_pending_jobs_size_max`](replication-options-replica.html#sysvar_slave_pending_jobs_size_max)是一个软限制，如果一个异常大的事件（由一个或多个数据包组成）超过这个大小，事务会一直保持，直到所有副本工作人员都有空队列，然后处理。所有后续交易都将保留，直到大笔交易完成。所以尽管不寻常的事件大于[`replica_pending_jobs_size_max`](replication-options-replica.html#sysvar_replica_pending_jobs_size_max)要么[`slave_pending_jobs_size_max`](replication-options-replica.html#sysvar_slave_pending_jobs_size_max)可以处理，清除所有replica Worker的队列的延迟和等待排队后续事务可能会导致replica延迟和replica Worker的并发性降低。[`replica_pending_jobs_size_max`](replication-options-replica.html#sysvar_replica_pending_jobs_size_max)要么[`slave_pending_jobs_size_max`](replication-options-replica.html#sysvar_slave_pending_jobs_size_max)因此，应该设置得足够高以适应大多数预期的事件大小。
