この問題を解決するための決定的な解決策または一連の手順をグーグルで徹底的に検索しましたが、高品質の結果はあまりないようで、スタックオーバーフローに関する質問は見つかりませんでした. 1 つのスレーブを使用して MySQL レプリケーションをセットアップしようとしています。スレーブは正常に複製されているように見えますが、次のエラーが発生します。
リレー ログ イベント エントリを解析できませんでした。考えられる理由は次のとおりです: マスターのバイナリ ログが破損している (これは、バイナリ ログで 'mysqlbinlog' を実行することで確認できます)、スレーブのリレー ログが破損している (これは、リレー ログで 'mysqlbinlog' を実行することで確認できます)、ネットワークの問題、またはマスターまたはスレーブの MySQL コードのバグ。マスターのバイナリ ログやスレーブのリレー ログを確認したい場合は、このスレーブで 'SHOW SLAVE STATUS' を発行することでそれらの名前を知ることができます。
検索で必然的にこの質問に出くわす多くの人々に利益をもたらすために、回答者が何がうまくいかないのか、この問題を解決するためにどのような手順を踏むべきかについての概要を提供してくれると助かりますが、私はそうします.また、誰かが私が解決するのを手伝ってくれることを期待して、私の特定の状況に関連する詳細を以下に提供してください.
開始するためにスレーブにインポートしたダンプは、マスターで次のコマンドを使用して作成されました。
mysqldump --opt --allow-keywords -q -uroot -ppassword dbname > E:\Backups\dbname.sql
このバックアップを実行するスクリプトは、マスターの現在のバイナリ ログの位置も記録します。次に、スレーブでレプリケーションを開始するために次の手順を実行しました。
1. STOP SLAVE;
2. DROP DATABASE dbname;
3. SOURCE dbname.sql;
(... waited a few hours for the 10gb dump to import)
4. RESET SLAVE;
5. CHANGE MASTER TO MASTER_HOST='[masterhostname]', MASTER_USER='[slaveusername]', MASTER_PASSWORD='[slaveuserpassword]', MASTER_PORT=[port], MASTER_LOG_FILE='[masterlogfile]', MASTER_LOG_POS=[masterlogposition];
6. START SLAVE;
レプリケーションが正常に機能してから約 1 日後、午前 3 時 43 分に再び失敗しました。MySQL のエラー ログに最初に表示されたのは、上記のエラーでした。その後、同じタイムスタンプで別の一般的なエラーが表示されました。
Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log '[masterlogfile]' position [masterlogpos]
詳細なログ情報については、1 時間ごとに「SHOW SLAVE STATUS」と「SHOW FULL PROCESSLIST」を実行するバッチ スクリプトを設定しました。失敗の前後の結果は次のとおりです。
--Monitoring: 3:00:00.15
Slave Status:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.xxx.xxx
Master_User: slave_user
Master_Port: xxxx
Connect_Retry: 60
Master_Log_File: mysql-bin.000xxx
Read_Master_Log_Pos: 316611912
Relay_Log_File: dbname-relay-bin.00000x
Relay_Log_Pos: 404287513
Relay_Master_Log_File: mysql-bin.000xxx
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: dbname
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 316611912
Relay_Log_Space: 404287513
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
*************************** 1. row ***************************
Id: 98
User: system user
Host:
db: NULL
Command: Connect
Time: 60547
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 99
User: system user
Host:
db: NULL
Command: Connect
Time: 5
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
*************************** 3. row ***************************
Id: 119
User: root
Host: localhost:xxxx
db: NULL
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST
--Monitoring: 4:00:02.71
Slave Status:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.xxx.xxx
Master_User: slave_user
Master_Port: xxxx
Connect_Retry: 60
Master_Log_File: mysql-bin.000xxx
Read_Master_Log_Pos: 324365637
Relay_Log_File: dbname-relay-bin.00000x
Relay_Log_Pos: 410327741
Relay_Master_Log_File: mysql-bin.000xxx
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: dbname
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
Skip_Counter: 0
Exec_Master_Log_Pos: 322652140
Relay_Log_Space: 412041238
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
*************************** 1. row ***************************
Id: 98
User: system user
Host:
db: NULL
Command: Connect
Time: 64149
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 122
User: root
Host: localhost:3029
db: NULL
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST
私はエラーからの指示に従ってみました。スレーブのリレー ログで mysqlbinlog を実行し、数千前の start_position ステートメントと、数千個の障害ポイントの後の stop_position ステートメントを使用して、出力をテキスト ファイルにリダイレクトしました。コマンド ラインまたはログ ファイルに破損エラーは見られませんでした。これは、ログ ファイルが障害点付近で述べたことです。
...
# at 410327570
#120816 3:43:26 server id 1 log_pos 322651969 Intvar
SET INSERT_ID=3842697;
# at 410327598
#120816 3:43:26 server id 1 log_pos 322651997 Query thread_id=762340 exec_time=0 error_code=0
SET TIMESTAMP=1345113806
insert into LOGTABLENAME (UpdateDate, Description) values (now(), "Invalid floating point operation");
# at 410327741
#120816 3:44:26 server id 1 log_pos 322754486 Intvar
SET INSERT_ID=3842701;
# at 410327769
#120816 3:43:26 server id 1 log_pos 322754514 Query thread_id=762340 exec_time=0 error_code=0
SET TIMESTAMP=1345113866;
insert into LOGTABLENAME (UpdateDate, Description) values (now(), "Invalid floating point operation");
# at 410327912
...
その時点で無効な浮動小数点操作がログに記録されていることは興味深いですが、その位置でレプリケーションがどのように中断される可能性があるかはわかりません。上記の SHOW SLAVE STATUS で見つかったマスターのバイナリ ログで mysqlbinlog を実行しましたが、コマンド ラインにエラーは表示されませんでした (ただし、生成された 100 MB のログ ファイルを開く機会はありませんでした。本番サーバーを停止します)。
だから今、私は他に何を試すべきか途方に暮れています。私は基本的に、何がうまくいかないのか、次に取るべきステップについての提案についての洞察を探しているだけです. ありがとう!