どのmax_allowed_pa​​cketが十分な大きさであり、なぜそれを変更する必要があるのですか?


14

マスタースレーブ設定でMySQL(5.5)を使用し、別のスレーブサーバーを作成しました。

元のスレーブを停止し、データをダンプし、コピーして再インポートしたところ、正常に機能しました。元のスレーブのmaster_log posを書き留め、これらのコマンドを使用して新しいスレーブに設定しました

CHANGE MASTER TO MASTER_HOST='<ipaddress>', 
MASTER_USER='<username>', MASTER_PASSWORD='<password>', 
MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000851', 
MASTER_LOG_POS=15824150, 
MASTER_CONNECT_RETRY=10;

新しいスレーブを開始したとき

Last_IO_Error:バイナリログからデータを読み取るときに、マスターから致命的なエラー1236が発生しました: 'ログイベントエントリがmax_allowed_pa​​cketを超えました。マスターのmax_allowed_pa​​cketを増やす

しかし、元のスレーブを開始したとき、それはうまく追いつき、現在同期しています。

質問:

  • 現在の値は16Mですが、どのくらいの大きさにすればよいのかを知るには (本番サーバーでの試行錯誤は避けたいです)。

  • 元のスレーブがうまく処理されたときに、マスターの値を増やす必要があるのはなぜですか、本当に新しいスレーブに問題があるのでしょうか?

更新

Rolandoがマスター、古いスレーブ、および新しいスレーブで提案したように、max_allowed_pa​​cketを1073741824に増やし、それらを再起動しました(SET GLOBAL max_allowed_packet = 1073741824;何らかの理由でとらえられなかったようです)

今、最後のIOエラーは以前と同じですが、今では

Last_SQL_Error:リレーログ読み取りエラー:リレーログイベントエントリを解析できませんでした。考えられる理由は次のとおりです。マスターのバイナリログが破損している(バイナリログで「mysqlbinlog」を実行すると確認できます)、スレーブのリレーログが破損しています(リレーログで「mysqlbinlog」を実行すると確認できます)、ネットワークの問題、またはマスターまたはスレーブのMySQLコードのバグ。マスターのバイナリログまたはスレーブのリレーログを確認したい場合、このスレーブで「SHOW SLAVE STATUS」を発行することにより、それらの名前を知ることができます。

マスターのファイルでmysqlbinlogを実行すると、コマンドを使って何年も前にスクロールします-ファイルは722Mです-スレーブリレーログでそれを実行すると、

エラー:Log_event :: read_log_event()のエラー: '健全性チェックに失敗しました'、data_len:38916267、event_type:69

エラー:オフセット253のエントリを読み取ることができませんでした:ログ形式のエラーまたは読み取りエラー。

変数を確認しましたが、変更は機能しました

mysql>変数LIKE '%max_allowed_pa​​cket%'を表示します。

新しいスレーブ上でmax_allowed_packetAND slave_max_allowed_packetが示され、マスター上ではmax_allowed_packet

だから私はマスターでバージョンチェックをしました:

mysql> show variables LIKE '%version%';
+-------------------------+--------------------------------------+
| Variable_name           | Value                                |
+-------------------------+--------------------------------------+
| innodb_version          | 1.1.6                                |
| protocol_version        | 10                                   |
| slave_type_conversions  |                                      |
| version                 | 5.5.11-log                           |
| version_comment         | MySQL Community Server (GPL) by Remi |
| version_compile_machine | x86_64                               |
| version_compile_os      | Linux                                |
+-------------------------+--------------------------------------+

そして新しい奴隷に

mysql> show variables LIKE '%version%';
+-------------------------+--------------------------------------+
| Variable_name           | Value                                |
+-------------------------+--------------------------------------+
| innodb_version          | 5.5.32                               |
| protocol_version        | 10                                   |
| slave_type_conversions  |                                      |
| version                 | 5.5.32-log                           |
| version_comment         | MySQL Community Server (GPL) by Remi |
| version_compile_machine | x86_64                               |
| version_compile_os      | Linux                                |
+-------------------------+--------------------------------------+

これらの2つのバージョンは離れすぎていますか?


ここにおもしろいことがあります。これが役立つことを願っています。
サティシュD

回答:


18

max_allowed_packet1G を最大化しても問題ありません。MySQLパケットが作成されるたびに、最初から1Gにジャンプしません。どうして?

最初に、MySQLパケットとは何かを知る必要があります。本の99ページ

MySQL内部の理解

以下のようにパラグラフ1〜3で説明します。

MySQLネットワーク通信コードは、クエリは常に合理的に短いため、MySQL用語ではパケットと呼ばれる1つのチャンクでサーバーに送信および処理できるという仮定の下で作成されました。サーバーは、パケットを格納するための一時バッファにメモリを割り当て、完全に収まるのに十分な量を要求します。このアーキテクチャでは、サーバーのメモリ不足を回避するための予防措置が必要です。このオプションでは、パケットサイズの上限を設定しています。

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

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

次のMySQLドキュメントと比較してくださいmax_allowed_packet

1パケットの最大サイズ、生成/中間文字列、またはmysql_stmt_send_long_data()C API関数によって送信されるパラメーター。デフォルトは、MySQL 5.6.6の時点で4MB、その前の1MBです。

パケットメッセージバッファーはnet_buffer_lengthバイトに初期化されますが、必要に応じてmax_allowed_pa​​cketバイトまで大きくなる可能性があります。デフォルトでは、この値は小さく、大きな(おそらく正しくない)パケットをキャッチします。

大きなBLOB列または長い文字列を使用している場合は、この値を増やす必要があります。使用する最大のBLOBと同じ大きさである必要があります。max_allowed_pa​​cketのプロトコル制限は1GBです。値は1024の倍数である必要があります。非倍数は最も近い倍数に切り捨てられます。

max_allowed_pa​​cket変数の値を変更してメッセージバッファーサイズを変更する場合、クライアントプログラムで許可されている場合は、クライアント側のバッファーサイズも変更する必要があります。クライアント側では、max_allowed_pa​​cketのデフォルトは1GBです。mysqlやmysqldumpなどの一部のプログラムでは、コマンドラインまたはオプションファイルでmax_allowed_pa​​cketを設定することにより、クライアント側の値を変更できます。

この情報があれば、MySQLが必要に応じてMySQLパケットを拡大および縮小できることを嬉しく思います。したがって、先に進み、

マスターとスレーブは、データ、特にBLOBデータを送信する相手に関して一致する必要があります。

更新2013-07-04 07:03 EDT

リレーログに関するメッセージから、次のように見えます

  • 破損したリレーログ
  • 良いマスターログ

提案

SHOW SLAVE STATUS\G
STOP SLAVE;
CHANGE MASTER TO
MASTER_LOG_FILE='(Relay_Master_Log_File from SHOW SLAVE STATUS\G)',
MASTER_LOG_POS=(Exec_Master_Log_Pos from SHOW SLAVE STATUS\G);
START SLAVE;

実行CHANGE MASTER TOすると、すべてのリレーログがクリアされ、新しいログから開始されます。スレーブで実行された最後のマスターBinLogイベント(BinLog、Position)から複製します。

試してみる !!!


おかげで、安全だというのは素晴らしいことです。しかし、現在の値がマスターと完全に動作している他のスレーブと一致するときに、なぜそれを変更する必要があるのか​​まだわかりませんか?
CodeMonkey

他に何かが起こっているので、詳細を追加しました
-CodeMonkey

1
ご参考までに:これは、レプリケーションプロセスをリセットし、誤って間違ったMASTER_LOG_FILE名前を入力したときに発生しました。たとえば、から使用mysql-bin.000001するべきだったときに使用mysql-bin.000003SHOW MASTER STATUSCHANGE MASTER TOます。
ミッコオタマー

7

むしろ恥ずかしいことに、問題はログのファイル名が間違っていて、奇妙な結果を引き起こし、正しいファイル名で再インポートされ、すべてがうまくいっ恥ずかしがっていました


どうもありがとう!この間違いをしているのはあなただけではありません。
ミッコオタマー

2
馬鹿げていても、答えを投稿する価値は常にあります。私たちはすべて人間なので、誰もが愚かな間違いを犯します。私たちのロボットは別として。
ジョンハント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.