MySQLの「max_allowed_pa​​cket」設定は実際に何を制御しますか?


8

mysqldump十分なエラーが発生しなかった故障のおかげで、データベースの問題を過去4時間クリーンアップしています。次のエラーが発生しました:

mysqldump: Error 2020: Got packet bigger than "max_allowed_packet" bytes when dumping table "search_dataset" at row: 68014

その設定は一体何をしていますか?現在32Mに設定しているので、それは明らかにIPパケットサイズではありません。なぜそれが存在するのですか?

回答:


7

「MySQLの内部を理解する」(ISBN 0-596-00957-7)の99ページによると、これはそれを説明する1〜3の段落です。

MySQLネットワーク通信コードは、クエリが常に適度に短く、したがって、MySQLの用語ではパケットと呼ばれる1つのチャンクでサーバーに送信および処理できるという前提で記述されています。サーバーは、パケットを格納するための一時バッファにメモリを割り当て、完全に収まるように要求します。このアーキテクチャでは、サーバーがメモリ不足になるのを防ぐための予防策が必要です。このオプションによって、パケットのサイズに上限が設けられます。

このオプションに関連するコードは sql / net_serv.ccにあります。my_net_read()を確認してから、my_real_read()の呼び出しに従い、net_realloc()に特に注意して ください

この変数は、多くの文字列関数の結果の長さも制限します。詳細については、sql / field.ccおよび sql / intem_strfunc.ccを参照してください。

これはおそらく、これまでに見たmax_allowed_pa​​cketの最も完全な説明です。私はそれらの3つの段落を本から直接入力しました。


投稿いただきありがとうございます。「パケット」は「IPパケット」を意味しているように思われます。
ランドルフリチャードソン2011

すばらしい答えです。これは、本当の答えに近づいていると思います。(私はこれがIPパケットを参照していないことを確信しています。IPについてはどこにも言及していません。また、通常、フラグメント化されたIPパケットでも実際の制限は65535バイトです。)
Plutor

1

ドキュメントはそれをここで完全に詳細に説明しています:

「1つのパケットまたは生成された/中間の文字列の最大サイズ。...」

ドキュメントでは、BLOBについても取り上げており、この設定とBLOBとの関連付けについても説明しています。


それは本当に私の質問に答えません。このコンテキストのパケットとは何ですか?それは実際にはIPパケットですか?不正なデータをキャッチするには、単純なバイト制限よりも良い方法はありませんか?
Plutor

「パケット」を別のものとして定義しない限り(ドキュメントではそうではないように見えます)、「パケット」がIPパケットを指すと期待するのは妥当です。
ランドルフリチャードソン2011

私が持っている本でその定義を見つけました。その本からの抜粋を私の回答として追加しました。
RolandoMySQLDBA 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.