Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Replication and max_allowed_packet

19.5.1.20 复制和max_allowed_packet

max_allowed_packet 设置了 MySQL 服务器与客户端之间的单个消息大小的上限,包括复制的副本。如果您正在复制大型列值(例如可能出现在TEXTBLOB列)并且max_allowed_packet在源上太小,源将以错误停止,并且副本将停止复制 I/O(接收)线程。如果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变量控制副本可用的内存,以容纳 incoming 包。指定的内存将被所有副本工作队列共享。

replica_pending_jobs_size_max 的值是一个软限制,如果一个 unusually 大的事件(由一个或多个数据包组成)超过这个大小,事务将被保持,直到所有副本工作线程的队列为空,然后处理。所有后续事务都将被保持,直到大事务完成。因此,虽然可以处理大于replica_pending_jobs_size_max 的事件,但是在清空所有副本工作线程队列和等待后续事务队列的延迟可能会导致副本的延迟和副本工作线程的并发性下降。因此,replica_pending_jobs_size_max 应该设置为可以容纳大多数预期事件大小。