読者です 読者をやめる 読者になる 読者になる

非活性でマスター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;
  • mysqlからログアウトする
  • /etc/my.cnfを読み直したいのでmysqlを停止する
/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;
    • mysql-binのファイルが表示されればOK
  • mysqlからログアウト
  • 退避しておいたib_logfileを削除
# 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';
    • レプリケーション用のユーザ名とパスワードを忘れている場合は/var/lib/mysql/master.infoで確認できる
    • 今回は全てレプリケーションした後に旧マスターDBを止めて作業しているのでポジションなどは要らない
  • スレーブを再開するために、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*
  • おつかれさまでした。