LoginSignup
170

More than 5 years have passed since last update.

稼働中のMySQLを無停止でレプリケーション環境を構築する

Last updated at Posted at 2017-05-27

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
170