製品

Percona

pt-table-sync

コマンド

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(同期先)に同期します