shimxmemo

メモをのこすよ!

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に反映されているか確認

ほんとにこんな手順で良かったのかな。。