レプリケーションができていないのでログを見てみたら、「Client requested master to start replication from impossible position」というエラーが出力されていた。確かに、「show slave status」で表示されるポジションが、バイナリログ内に見つからない...。
不整合の度合いがハンパないのと、運用から切り離されているサーバだったので、スレーブをゼロから再構築することにした。以下、そのときの手順メモ。
まず、マスターの更新を止めてデータをdumpします。
mysql> FLUSH TABLES WITH READ LOCK;
スレーブ開始にそなえてポジションを確認。
mysql> SHOW MASTER STATUS \G File: db01-bin.010 Position: 5432 Binlog_Do_DB: db_name Binlog_Ignore: 1 row in set (0.00 sec)
データをdumpします。
$ mysqldump -uroot -hdb01 db_name > /tmp/db_name.dump
マスターの更新ロックを解除。
mysql> UNLOCK TABLES;
マスター側の操作はここまで。続いて、スレーブの再構築の作業に入ります。最初に、これまでのレプリ情報を削除してしまいます。
# /etc/rc.d/init.d/mysqld stop # rm /var/lib/mysql/master.info # rm /var/lib/mysql/relay-log.info # /etc/rc.d/init.d/mysqld start
データベースをゼロから作るため、今までのデータベースを削除して作り直し。
mysql> DROP DATABASE db_name; mysql> CREATE DATABASE db_name;
マスターのdumpデータをリストア。
# scp db01:/tmp/db_name.dump /tmp/ # mysql -uroot -hdb01 db_name < /tmp/db_name.dump
レプリケーションの設定を最新のものに。ポジションとログファイルは、先ほど「SHOW MASTER STATUS」した結果のものを使用します。
mysql> STOP SLAVE; mysql> CHANGE MASTER TO MASTER_HOST='db01', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='db01-bin.010', MASTER_LOG_POS=5432;
スレーブを開始します。
mysql> START SLAVE;
これでレプリケーションが正常に行われるはずです。「SHOW SLAVE STATUS」やログにエラーなど発生していないことを確認しましょう。うまくいかない場合は、しかるべきときに mysqld のプロセスがきちんと停止していなかったとか、dump がうまくいっていなかったとか、そういったところだと思います。手順が少ないので、問題になる場所も限られます。
ここまで書いて気付いたのですが、スレーブが複数ある場合は、何もマスターの更新を止めてやる必要がないですね。そして、もっとシンプルな手順でできそう。
お疲れさまでした。