===== レプリケーションのエラー対応 =====
==== Query caused different errors on master and slave. ====
エラー内容を見て、エラーになったSQLがスキップして問題なければスキップする
mysql> stop slave;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; (エラーをスキップ)
mysql> start slave;
mysql> show slave status \G
==== Last_IO_Errno: 1236 ====
システムリブート時などの発生することが多いエラー。
『スレーブがマスターの情報読み出しを行ったが、マスターに存在しない位置情報をもとに読み込もうとしている』という状況で、
* スレーブの設定ミス
* マスターがログ情報破棄、破損
など。
他の問題が発生していない前提で、スレーブの情報を再設定するのが簡単。
マスター側で
mysql> SHOW MASTER STATUS;
+----------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------+-----------+--------------+------------------+
| bin-log.000069 | 228146254 | | |
+----------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
スレーブ側で
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.10.21',
MASTER_USER='root',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000069',
MASTER_LOG_POS=228146254;
==== Last_IO_Errno: 1594 ====
> Last_Errno: 1594
> Last_Error: Relay log read failure: 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.
* マスタサーバのバイナリログが破損した
* スレーブサーバのリレーログが破損した
など。
マスタサーバのバイナリログが破損した場合は、仕方がないので、ダンプから再構築。
スレーブサーバのリレーログが破損した場合は、再設定で復旧可能。
マスタログのファイル名、ポジションを確認。
mysql>show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 1.2.3.4
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000230
Read_Master_Log_Pos: 618693587
レプリケーションを停止する。
mysql> stop slave;
レプリケーションを再設定する。
mysql> reset slave all;
mysql> CHANGE MASTER TO
MASTER_HOST='1.2.3.4',
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000230',
MASTER_LOG_POS=618693587;
レプリケーションを再開する。
mysql> start slave;