MySQLダンプからの無停止スレーブ作成 はてなブックマーク - MySQLダンプからの無停止スレーブ作成

よく行うのでメモ。

マスタとスレーブのホスト名を以下と仮定する。

マスタ: masterdb スレーブ: slavedb

また、スレーブ対象のDBは以下とする。

some_db_production

マスタ上のMySQLでの作業

レプリケーション用ユーザーの作成

まだ無ければ作っておく。この例だとどのホストからでも接続できるので、 必要に応じてIPアドレスでの制限をかけること。

1
2
mysql> GRANT REPLICATION SLAVE ON *.* TO repl_user@"%" IDENTIFIED BY 'hogehoge';
mysql> FLUSH PRIVILEGES;

スナップショットの作成(取得しつつスレーブへ送る)

ダンプを取りながら圧縮しスレーブDBに送り込む。データが多いと数時間かかる。

ここでは転送速度を優先させるため、暗号化方式を軽量のものしている。

大容量ファイルのSCP転送を高速にする方法 – 元RX-7乗りの適当な日々

1
mysqldump some_db_production --master-data --single-transaction -uroot -phogehoge | gzip | ssh -c arcfour128 hoge@slavedb 'cat > /home/hoge/db_snapshot.gz'

スレーブでの作業

スナップショットのインポート

解凍しつつインポートする。スナップショットの作成よりもさらに時間がかかる。

1
gunzip < /home/hoge/db_snapshot.gz | mysql -u root -p some_db_production

スレーブ上のMySQLでの作業(インポート後)

マスタ情報の確認

後ほど、slaveに設定する情報。lessでgzの中を直接確認できる。

1
less /home/hoge/db_snapshot.gz

こんな感じで出力されているはず。

1
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.0123', MASTER_LOG_POS=9876;

master情報書換

スレーブDBのmysqlにログインし、以下のコマンドを実行。 MASTER_LOG_FILEとMASTER_LOG_POSは先に調べた情報に書き換える。

1
2
3
4
5
6
7
mysql> RESET SLAVE;
mysql> CHANGE MASTER TO
mysql> MASTER_HOST = 'masterdb',
mysql> MASTER_USER = 'repl_user',
mysql> MASTER_PASSWORD = 'hogehoge',
mysql> MASTER_LOG_FILE = 'mysql-bin.0123',
mysql> MASTER_LOG_POS = 9876;

スレーブ再開

同じくスレーブのmysqlでコマンド実行

1
mysql> start slave;

Comments