コマンド
pt-table-sync [ オプション ] [ 同期元DSN ] [ 同期先DSN ]
【必須項目】
- ・ –execute or –dry-run : –executeを指定すると変更が実行され、–dry-runは変更を実行しません
- ・ [ 同期元DSN ] : h=ホスト名,u=ユーザー名,p=パスワード (D=データベース名,t=テーブル名)
- ・ [ 同期先DSN ] : h=ホスト名,u=ユーザー名,p=パスワード
※[ 同期先DSN ]にはSUPER権限のあるユーザを指定する必要があります
【主なオプション】
- ・ –sync-to-master : 同期先DSNで指定したホスト(スレーブ)のマスタを同期元DSNとすることができます
※このオプションを使用する場合、[ 同期元DSN ] を書く必要はありません
目的
ホスト間でテーブルの同期を行うことができます
シナリオ
今回は、レプリケーション環境で、マスタ(同期元)とスレーブ(同期先)のテーブルを同期させます
スレーブ側でレプリケーションを停止します
mysql> STOP SLAVE;
マスタ側に以下のようなテーブルを用意し、レコードを挿入します
mysql> CREATE TABLE test (id INT);
mysql> ALTER TABLE test ADD UNIQUE (id);
mysql> INSERT INTO test (id) VALUES(1),(2),(3);
mysql> SHOW MASTER STATUS;
スレーブ側にもマスタと同じ定義の空テーブルを用意し、改めてマスタとレプリケーションを組みます
> RESET SLAVE ALL;
> CHANGE MASTER TO …
> START SLAVE;
マスタ側とスレーブ側でデータが異なっていることを確認します
mysql> SELECT * FROM test;
マスタ側
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.01 sec)
スレーブ側
Empty set (0.00 sec)
スレーブ側でpt-table-syncを実行します
# pt-table-sync --execute --sync-to-master u=root,p=password
結果
スレーブ側のテーブルにマスタのテーブルが同期されます
mysql> SELECT * FROM test;
マスタ側
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.01 sec)
スレーブ側
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.01 sec)
良い点
テーブル間の同期を簡単に行うことができます
注意点
双方に同じ定義のテーブルが存在している必要があります
–sync-to-masterを使う場合、ユニークキーの設定されていないテーブルを同期することはできません
その他
ホスト名を指定することで、任意のホスト間でテーブルを同期させることができます
# pt-table-sync --execute h=host1,D=database,t=table h=host2
※host1(同期元)のテーブルをhost2(同期先)に同期します