通信パケットは、MySQL サーバーに送信される単一の SQL ステートメント、クライアントに送信される単一行、またはソースレプリケーションサーバーからレプリカに送信されるバイナリログイベントです。
MySQL 8.0 Server およびクライアント間で転送可能なパケットの最大サイズは 1G バイトです。
MySQL クライアントまたは mysqld サーバーが max_allowed_packet
バイトより大きいパケットを受け取ると、ER_NET_PACKET_TOO_LARGE
エラーが発行され、接続が失われます。 一部のクライアントでは、パケットが大きすぎる場合、「クエリー中に MySQL サーバーへの接続が失われました」
というエラーを受け取ることもあります。
クライアントとサーバーの両方にそれぞれ max_allowed_packet
変数があるため、大きなパケットを処理する場合は、クライアントとサーバーの両方のこの変数を増やす必要があります。
mysql クライアントプログラムを使用している場合、max_allowed_packet
変数のデフォルトは 16M バイトです。 大きな値を設定するには、mysql を次のように起動します。
shell> mysql --max_allowed_packet=32M
これにより、パケットサイズが 32M バイトに設定されます。
サーバーのデフォルトの max_allowed_packet
値は 64M バイトです。 サーバーが大きなクエリーを処理する必要がある場合 (たとえば、大きい BLOB
カラムを操作している場合) は、この値を増やすことができます。 たとえば、この変数に 128M バイトを設定するには、サーバーを次のように起動します。
shell> mysqld --max_allowed_packet=128M
オプションファイルを使用して max_allowed_packet
を設定することもできます。 たとえば、サーバー側のサイズを 128M バイトに設定するには、次の行をオプションファイルに追加します。
[mysqld]
max_allowed_packet=128M
追加のメモリーは必要なときにのみ割り当てられるため、この変数の値を増やしておくと安全です。 たとえば、mysqld が追加のメモリーを割り当てるのは、長いクエリーが発行された場合、またはmysqld が大きな結果行を返す必要がある場合のみです。 この変数のデフォルト値が小さいのは、クライアントとサーバーの間の不正なパケットを捕捉するための予防措置であり、誤って大きなパケットが使用されてメモリー不足にならないようにするためでもあります。
大きい BLOB
値を使用しているが、そのクエリーを処理するための十分なメモリーへのアクセスを mysqld に与えていない場合にも、大きいパケットに関する予期しない問題が発生することがあります。 これに当てはまると思われる場合は、mysqld_safe スクリプトの先頭に ulimit -d 256000 を追加して、mysqld を再起動してください。