MySQLにおけるスレーブのマスターへの昇格の手順メモ
ちょっとやる機会があったのでメモ。
前提
- サーバA(元々マスター。現スレーブ。新サーバと交換した)
- サーバB(元々スレーブ。昇格して現マスター)
- サーバC(スレーブ)
※my.cnfにはMasterの情報は書かない派。
- サーバAを再度マスターに、サーバBをスレーブに落とす。
旧サーバA、サーバB、Cともに稼働年数同じぐらいで、「逝くときはぁ一緒だよーっ☆」されても困るので
- マスターに更新がかからないように、プログラムなど止めておく
手順
# サーバBのプロセスが流れていないか確認 svB# mysql mysql> SHOW PROCESSLIST; # 念の為サーバBの更新停止 mysql> FLUSH TABLES WITH READ LOCK; ※ロックが外れるのでmysqlから出ない事。 mysql> SHOW MASTER STATUS\G;; ※Fileの値とPositionの値をメモ # サーバAでSTOP SLAVE svA# mysql mysql> STOP SLAVE IO_THREAD; mysql> SHOW SLAVE STATUS\G; mysql> SHOW PROCESSLIST; ※Has read all relay logが出るまで待機 mysql> STOP SLAVE; mysql> SHOW SLAVE STATUS\G; ※Master_Log_FileとRead_Master_Log_Posをメモ # サーバCでSTOP SLAVE(別ターミナルとかscreenとかで) svC# mysql mysql> STOP SLAVE IO_THREAD; mysql> SHOW SLAVE STATUS\G; mysql> SHOW PROCESSLIST; ※Has read all relay logが出るまで待機 mysql> STOP SLAVE; mysql> SHOW SLAVE STATUS\G; ※サーバBのFileの値とPositionの値と、A、CのMaster_Log_FileとRead_Master_Log_Posが同じか確認 # サーバBのレプリケーション系の設定を初期化 mysql> RESET SLAVE; mysql> RESET MASTER; ※余計なファイル(binログやrelayログ)残したくないので両方やる mysql> SHOW MASTER STATUS\G; mysql> SHOW SLAVE STATUS\G; ※初期化されてるか確認 # サーバAのレプリケーション系の設定を初期化 mysql> RESET SLAVE; mysql> RESET MASTER; ※こちらも余計なファイル残したくないので両方やる mysql> SHOW MASTER STATUS\G; mysql> SHOW SLAVE STATUS\G; ※初期化されてるか確認 # サーバBでレプリケーション設定 mysql> CHANGE MASTER TO MASTER_HOST = 'サーバA', MASTER_USER = 'repl', MASTER_PASSWORD = 'pass', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106; ※STOP SLAVEしてないと効かないし怒られるよ mysql> SHOW SLAVE STATUS\G; ※2台ともposが同じか確認 # サーバCでレプリケーション設定 svC# mysql mysql> CHANGE MASTER TO MASTER_HOST = 'サーバA', MASTER_USER = 'repl', MASTER_PASSWORD = 'pass', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106; ※こちらもSTOP SLAVEしてないと効かないし怒られるよ mysql> SHOW SLAVE STATUS\G; ※2台ともposが同じか確認 # サーバBでロック解除 mysql> UNLOCK TABLES; # 問題なければサーバB、サーバBでレプリケーション開始 mysql> START SLAVE; # サーバAで何か更新してみて、サーバB、サーバBに反映されているか確認
ほんとにこんな手順で良かったのかな。。