167
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
167
Help us understand the problem. What are the problem?