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_packetを超えました。マスターのmax_allowed_packetを増やしてください
ただし、元のスレーブを起動したときは、問題なく追いついて同期しています。
だから質問:
現在の値は16Mですが、どのくらいの大きさかを知るにはどうすればよいですか? (私はむしろ運用サーバーでの試行錯誤を避けたいです)。
元のスレーブが問題なく対処したのに、なぜマスターの値を増やす必要があるのですか?問題は本当に新しいスレーブにあるのでしょうか?
更新
Rolandoがマスター、古いスレーブ、新しいスレーブで提案したように、max_allowed_packetを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_packet%'を表示します。
新しいスレーブで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つのバージョンは離れすぎていますか?
むしろ恥ずかしいことに、問題はログのファイル名が正しくないことであり、奇妙な結果を引き起こし、正しいファイル名で再インポートされ、すべてが正常でした恥ずかしくて頭を下げる
max_allowed_packet
を1Gに最大化しても問題ありません。 MySQLパケットが構築されると、最初から1Gにジャンプしません。どうして?
最初に、MySQLパケットを知る必要があります。 本の99ページ
次のように段落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_packetバイトまで拡張できます。この値はデフォルトでは小さいため、大きな(おそらく正しくない)パケットをキャッチします。
大きなBLOB列または長い文字列を使用している場合は、この値を増やす必要があります。使用する最大のBLOBと同じ大きさにする必要があります。 max_allowed_packetのプロトコル制限は1GBです。値は1024の倍数である必要があります。非倍数は最も近い倍数に切り捨てられます。
Max_allowed_packet変数の値を変更してメッセージバッファーサイズを変更する場合、クライアントプログラムで許可されている場合は、クライアント側のバッファーサイズも変更する必要があります。クライアント側では、max_allowed_packetのデフォルトは1GBです。 mysqlやmysqldumpなどの一部のプログラムでは、コマンドラインまたはオプションファイルでmax_allowed_packetを設定することにより、クライアント側の値を変更できます。
この情報があれば、MySQLが必要に応じてMySQLパケットを拡張および縮小できることをうれしく思います。したがって、先に行き、
max_allowed_packet
を1Gに設定しますnet_buffer_length
を最大値の1Mに設定しますマスターとスレーブは、データ、特にBLOBデータを送信する相手が一致している必要があります。
リレーログに関するメッセージから、次のように見えます
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)から複製します。
試してみる !!!