Database JUNKY

MySQL,MariaDBを中心としたブログです

サービス無停止でMySQLのレプリケーション環境を構築する方法

サービス無停止で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を無停止でレプリケーションが構築できるって魅力的です