非活性でマスターDBを移行する手順まとめ
古くなったマスターDBを捨てる必要があったため下のページを参考にして手順まとめ。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 5.3.6 フェイルオーバでのマスタ切り替え
ほぼ、同じこと書いてますけど、仕事の作業だったので少しそこに手を加えました。
- 前提
- マスターDBを停止してメンテナンスが行える
- 構成
- マスターDB:host00
- スレーブDB:host01,host02,host03
- この内、host01を新マスターDBにする
以下まとめ。
スレーブDBがレプリケーションを終えているかチェック
- マスターDBから遅れがないか、全てが0になるまで確認したいので以下のコマンドを叩く
for host in `echo host01 host02 host03`; do
echo -n "$host: ";
mysql -h $host -u replication --password=replication -e 'show slave status\G' | grep Seconds_Behind_Master:;
done
マスターDBの停止
- host00にログイン
- DBの更新が走らないよう念のため落としてしまう
/etc/init.d/mysql stop
host01をスレーブDBから新マスターDBへ昇格させる
- host01にログイン
- /etc/my.cnfを修正しbin-logを吐くようにする(マスターDBはこれが必要)
# for master log-bin=/var/lib/mysql/mysql-bin
- また、再起動したときにslaveとして起動しないようにskip-slave-startも書く
skip-slave-start
- mysqlへrootでログイン
# mysql -u root
- STOP SLAVE IO_THREADを発行してマスターDBのバイナリログを読みに行かないようにする
STOP SLAVE IO_THREAD;
- process listを見て「Has read all relay log」になっているかを確認
SHOW PROCESSLIST;
-
- なっていればrelay-logを読みきっているのでOK
- STOP SLAVEを実行してレプリケーションを止める
STOP SLAVE;
/etc/init.d/mysql stop
- my.cnfを変えているので念のためib_logfileを退避させてからmysqlを起動
- innodb_log_file_sizeの設定値を大きしている場合、ib_logfileがあるとエラーになるので
mv /var/lib/mysql/ib_logfile* /tmp/. /etc/init.d/mysql start
- エラーが出ていないか確認
# tail /var/lib/mysql/*err
- mysqlへrootでログイン
# mysql -u root
- マスターDBになるためにRESET MASTERを発行
RESET MASTER;
- host01がマスターDBになったかを確認
SHOW MASTER STATUS;
# yes | rm /local/ib_logfile*
スレーブDBに新マスターDBを認識させる設定
- host[02,03]lへログイン
- host[02,03]のmysqlへrootでログイン
# mysql -u root
- 新マスターDBを見にいくようにするために、STOP SLAVEをしてからCHANGE MASTERを発行
STOP SLAVE; CHANGE MASTER TO MASTER_HOST='host01', MASTER_USER='replication', MASTER_PASSWORD='replication';
- スレーブを再開するために、START SLAVEを発行
START SLAVE;
- 全てのスレーブDBがhost00(旧マスター)ではなく、host01(新マスター)を見ているか確認
SHOW SLAVE STATUS\G
-
- Master_Hostにhost00ではなくhost01が表示されていればOK
(念のため再起動)以前にmy.cnfいじってる可能性があるのでこのタイミングにib_logfileをmvして再起動しておく
- そのままhost[02,03]ld作業
- /etc/my.cnfを読み直したいのでmysqlを停止する
/etc/init.d/mysql stop
- ib_logfileを退避させてからmysqlを起動
mv /var/lib/mysql/ib_logfile* /tmp/. /etc/init.d/mysql start
- 最後にhost01(新マスターDB)にアクセスしているか再確認
# mysql -u root -e 'SHOW SLAVE STATUS\G'
- 確認ができたら退避しておいたib_logfileを削除
# yes | rm /local/ib_logfile*
- おつかれさまでした。