web-dev-qa-db-ja.com

十分な大きさのmax_allowed_pa​​cketはどれですか。なぜ変更する必要があるのですか。

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_packet AND 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つのバージョンは離れすぎていますか?

14
CodeMonkey

むしろ恥ずかしいことに、問題はログのファイル名が正しくないことであり、奇妙な結果を引き起こし、正しいファイル名で再インポートされ、すべてが正常でした恥ずかしくて頭を下げる

8
CodeMonkey

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

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

Understanding MySQL Internals

次のように段落1〜3で説明します。

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

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

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

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

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パケットを拡張および縮小できることをうれしく思います。したがって、先に行き、

  • マスターとスレーブの両方で max_allowed_packet を1Gに設定します
  • マスターとスレーブの両方で net_buffer_length を最大値の1Mに設定します

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

UPDATE 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)から複製します。

試してみる !!!

18
RolandoMySQLDBA