MySQL 8.0 リファレンスマニュアル


17.5.1.20 レプリケーションと max_allowed_packet

max_allowed_packet は、MySQL サーバーとクライアント間の単一のメッセージ (レプリカを含む) のサイズに上限を設定します。 大規模なカラム値 (TEXT または BLOB カラムにある可能性がある) をレプリケートしていて、max_allowed_packet がソース上で小さすぎる場合、ソースはエラーで失敗し、レプリカはレプリケーション I/O スレッドを停止します。 レプリカ上の max_allowed_packet が小さすぎると、レプリカは I/O スレッドを停止します。

現在、行ベースのレプリケーションでは、更新によって実際に変更されなかったカラムの値を含め、更新された行のすべてのカラムおよびカラムの値がソースからレプリカに送信されます。 これは、行ベースレプリケーションを使用して大きなカラム値を複製するときに、複製されるテーブル内でもっとも大きい行を格納できるだけの大きさに max_allowed_packet を設定するように気をつける必要があります (更新だけを複製したり、比較的小さい値だけを挿入したりする場合でも)。

マルチスレッドレプリカ (slave_parallel_workers > 0 を使用) では、slave_pending_jobs_size_max システム変数がソースの max_allowed_packet システム変数の設定以上の値に設定されていることを確認します。 slave_pending_jobs_size_max のデフォルト設定 128M は、max_allowed_packet のデフォルト設定の 64M の 2 倍です。max_allowed_packet は、ソースが送信できるパケットサイズを制限しますが、イベントヘッダーを追加すると、このサイズを超えるバイナリログイベントを生成できます。 また、行ベースのレプリケーションでは、max_allowed_packet の値によってテーブルの各カラムのみが制限されるため、単一のイベントが max_allowed_packet サイズより大幅に大きくなる可能性があります。

レプリカは、slave_max_allowed_packet 設定で設定された制限までパケットを実際に受け入れます。これは、大きなパケットによるレプリケーションの失敗を防ぐために、デフォルトで最大設定の 1GB に設定されています。 ただし、slave_pending_jobs_size_max の値によって、受信パケットを保持するためにレプリカで使用可能になるメモリーが制御されます。 指定されたメモリーは、すべてのレプリカワーカーキュー間で共有されます。

slave_pending_jobs_size_max の値は弱い制限であり、非常に大きなイベント (1 つまたは複数のパケットで構成される) がこのサイズを超えると、トランザクションはすべてのレプリカワーカーが空のキューを持つまで保持されてから処理されます。 後続のすべてのトランザクションは、大規模なトランザクションが完了するまで保持されます。 そのため、slave_pending_jobs_size_max より大きい異常なイベントを処理できますが、すべてのレプリカワーカーのキューをクリアする遅延および後続のトランザクションをキューに入れる待機によってレプリカが遅れ、レプリカワーカーの同時実行性が低下する可能性があります。そのため、slave_pending_jobs_size_max は、予想されるほとんどのイベントサイズに対応できる高さに設定する必要があります。


関連キーワード:  max, 設定, ソース, ベース, allowed, packet, トランザクション, バイナリ, GTID, 変数