#はじめに
MySQLでslaveを新しく追加する際、レプリケーションを設定するわけですが、ネット上では下記のように、
mysql > FLUSH TABLES WITH READ LOCK;
mysql > SHOW MASTER STATUS;
テーブルをロックしたうえで現在のログポジションを調べるという手順が多いような気がします。
この方法だと、短時間ではあってもサービスに影響してしまいます。
そこで、テーブルロックを可能な限り短くしてレプリケーションを定義する方法をまとめます。
#前提
データベースエンジンにInnoDBを使用していること
#概要
###1.masterにてmysqldump
下記オプションを指定することで、ダンプ時にバイナリログを切り替え、ダンプファイルにログポジション情報が記録されます(常に切り替えたバイナリログの最初のポジションとなる=間違えるリスクが小さい)。
また、トランザクションが有効になるため、オンライン状態でも一貫性を保持したダンプが可能となります。
--single-transaction
--flush-logs
--master-data=2
###2.slaveにインポート
###3.slaveにてレプリケーション定義
ダンプファイルの最初にログポジション情報が記録されているので、それをもとにレプリケーションを設定します。
##手順
###1. masterにてmysqldump
masterDBをダンプ
$ mysqldump -uroot -p**** \
--all-databases \
--opt \
--flush-logs \
--add-drop-table \
--single-transaction \
--master-data=2 \
| gzip > DUMPFILE.gz
####オプションの意味
--single-transaction
→ 一貫性を保持してダンプ
--flush-logs
→ バイナリログをダンプ時に切り替える
--master-data=2
→ ダンプ時点でのバイナリログポジション情報を記録
###2. slaveにインポート
$ zcat DUMPFILE.gz | head -n 25
dumpファイルのログポジションを確認
(以下の記述を確認。-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=YYY;)
masterのダンプデータをインポート
$ zcat DUMPFILE.gz | mysql -uroot -p****
###3. slaveにてレプリケーション設定
mysql> change master to
master_host='XXX.XXX.XXX.XXX', <-------- masterのIPアドレス
master_user='repl', <------------------- レプリケーション用に作成したアカウント
master_password='********', <----------- 上記アカウントのパスワード
master_log_file='mysql-bin.XXXXXX', <--- dumpfileのMASTER_LOG_FILE
master_log_pos=YYY; <------------------- dumpfileのMASTER_LOG_POS
レプリケーション開始
mysql> start slave;
スレーブの状態確認
mysql> show slave status\G
#注意
mysqldumpの--single-transactionオプションは、ロックを発行することなくdumpが可能ですが、本手順のように--master-dataオプションをつけるとFLUSH TABLES WITH READ LOCKが発行され、一瞬ですがロックが発生します。
しかし、手作業でロックを発行し、ログポジションを調べるのに比べてはるかに短い時間で済みます。
一瞬のロックも許容できないシステムはXtraBackupなどの利用をご検討ください。
#まとめ
稼働中のMaterDBに新たにslaveをぶら下げる時に有用と思われます。