稼働中のMySQLを無停止でレプリケーション環境を構築する
個人メモです。稼働中のサービスを停止できないけど、スレーブを増やしたい(増殖したい)なんて場合に使える技になります。
マスターのバックアップ
まず、スレーブ側のホストでマスターのスキーマ(例では、schema1 schema2のバックアップをとります。この際に、--master-data と --single-transaction は必須です。
--master-data を指定しますと、master側のバイナリログファイルとポジションを取得することができます。
--single-transaction を指定しますと、innodbの場合は、マスターサーバ側のデータベースをロックせずに、dumpすることが可能です
mysqldump -h remote_host --databases schema1 schema2 -u myuser -pmypasswd --master-data --single-transaction --routines > /tmp/myDB.dump
ポジションの取得
上記にて、バックアップが完了したファイルから、CHANGE MASTER TOが含まれる行をgrepして、メモしておきます。
# cat myDB.dump | grep -i "CHANGE MASTER TO"
-----
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000052', MASTER_LOG_POS=12345678;
バックアップしたファイルをリストアします
リストア先に対象のデータベースが既に存在する場合は、すべて消えてしまいますので注意してください
mysql -f -umyuser -pmypasswd < /tmp/myDB.dump
スレーブ側の設定
ヒアドキュメントを使って、書き込んでいますが、別にコピペでMySQLに直接張ってもいいかと思います。また、MASTER_LOG_FILEとMASTER_LOG_POSは、上記で取得した値をセットします
mysql -umyuser -pmypasswd << '_EOT_'
CHANGE MASTER TO
MASTER_HOST='remote_host',
MASTER_USER='slave',
MASTER_PASSWORD='slavepasswd',
MASTER_LOG_FILE='mysql-bin.000052',
MASTER_LOG_POS=12345678;
start slave ;
select sleep(1) ;
show slave status\G
_EOT_
以上、こんな感じになります。そこそこ時間はかかりますが、稼働中のMySQLを無停止でレプリケーションが構築できるって魅力的です