max_allowed_packet
設定 MySQL 伺服器與用戶端(包括副本)之間任何單一訊息大小的上限。如果您正在複製大型欄值(例如在 TEXT
或 BLOB
欄中可能找到的值),且來源上的 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
設定得足夠高,以容納大多數預期的事件大小。