何かしらの原因でMysqlのマスターとスレーブ間でのデータに不整合が出た際のレプリケーション再構築方法メモ。
今回2日連続でマスターのディスク容量が一杯になってレプリケーションの整合性が取れなくなってしまった。
レプリケーションの設定はたまにしかやらないので自分用に残しておくことにする。
mysql>となっているコマンドは全てmysqlにログインして実行するコマンドです。
広告
目次
スレーブの停止
不整合が出てしまっているので、スレーブは停止してDBの中を空にする。操作はコンソールから。
1 2 3 4 5 |
mysql> stop slave; mysql> drop database dbname; mysql> create database dbname; |
DBを消して空で作り直します。
マスターのデータをバックアップ
マスター側もコンソールから操作します。データのコピー方法はいろいろとありますが、今回はmysqldumpを使用します。
テーブルロック
コピー中にデータに変更が加わらないようにテーブルをロックします。
1 |
mysql> flush tables with read lock; |
mysqldump
mysqldumpを使用してデータを出力します。今回の環境は特定DBのみレプリケーションしているので、特定DBのみファイルに書き出しました。
上でロックをかけてるコンソールとは別コンソールを開いて作業します。
1 |
mysqldump -u root -p dbname > dbname.sql |
レプリケーションマスターの状態確認
dump作成時点でのマスターの状態を確認します。
1 |
mysql> show master status; |
ここで表示されるFileとPositionの値をメモしましょう。
今回の環境の場合は↓こんな感じでした。
+——————-+——-
| File | Position |
+——————-+——-
| mysqld-bin.000055 | 6980
+——————-+———-+
マスターDBのロック解除
ダウンタイムを少しでも短くしたい場合はここでロックを解除してマスターは通常動作に戻して問題ありません。
ロックをかけたコンソールで下記コマンドを実行します。
1 |
mysql> unlock tables; |
スレーブ側へファイルの転送
今回はSCPでファイル移動します。
1 |
scp dbname.sql user@slaveserver.com:/home/user/ |
上の例だとslaveserver.comというスレーブサーバーの/home/user/にdumpしたファイルを転送します。userは/home/user/に書き込み権限のあるスレーブサーバー上のユーザー名です。
スレーブにマスターのデータをコピー
マスターで作成したdumpをスレーブに流し込む
使用するのはmysqldumpコマンドではありません。私はよく間違えるので一応。
1 |
mysql -u roo -p dbname < dbname.sql |
データベースdbnameにマスターから移したdbname.sqlのSQLを流し込みます。
レプリケーション情報の更新
レプリケーションを開始する位置を指定します。上でメモしたマスターの情報を使用します。
1 |
mysql> change master to master_log_file='mysqld-bin.000055',master_log_pos=6980; |
ログファイル名と開始行を更新します。一応変更されているかshow slave status;で確認しましょう。
スレーブの開始
スレーブを開始します。
1 |
mysql> start slave; |