文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  复制和 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 的值控制在副本上用于保存传入包的可用内存。指定的内存在所有副本工作线程队列之间共享。

replica_pending_jobs_size_max 是一个软限制。如果一个异常大的事件(包含一个或多个数据包)超过了这个大小,该事务将被保留,直到所有副本工作器都清空队列后才会被处理。所有后续事务将被保留,直到该大型事务完成。因此,虽然可以处理大于 replica_pending_jobs_size_max 的异常事件,但清除所有副本工作器队列的延迟以及等待后续事务入队的延迟会导致副本延迟和副本工作器并发性降低。 因此,应将 replica_pending_jobs_size_max 设置得足够高,以适应大多数预期的事件大小。