はじめに
Percona Toolkitにはpt-table-checkusmと呼ばれる、レプリケーションの整合性を確認することができる機能が存在しています。この記事では、pt-table-checkusumを使用して、ソースとレプリカのデータが一致していることを確認していきましょう。
今回は以下のレプリケーション環境で検証を行いました。
OS version | MySQL version | pt-table-checksum version | 備考 |
---|---|---|---|
CentOS7.9 | 8.0.33 | 3.5.2 | レプリケーション ソース |
CentOS7.9 | 8.0.33 | 3.5.2 | レプリケーション レプリカ |
pt-table-checksumの使い方
pt-table-checksumのインストールと設定方法
Percona Toolkitをダウンロードします。
1 |
# wget https://downloads.percona.com/downloads/percona-toolkit/3.5.2/binary/redhat/7/x86_64/percona-toolkit-3.5.2-2.el7.x86_64.rpm |
percona-toolkitをインストールします。
1 |
# yum install percona-toolkit-3.5.2-2.el7.x86_64.rpm |
pt-table-checksumログインの簡略化のために設定ファイルを作成し、DSNを追加しておきます。
Percona Toolkitにおける設定ファイルの書き方について詳しくはマニュアルをご確認ください。
1 2 3 4 5 6 7 8 9 10 |
# vi /etc/percona-toolkit/pt-table-checksum.conf #ソースのIPアドレス h=localhost #MySQLのユーザー名 u=test #MySQLのパスワード p=MySQL8.0 |
DSNを設定ファイルに記載しておくと、pt-table-checksumのオプションを何度も入力する手間が省けます。必須項目ではないので、ご自身の環境に合わせて設定するようにしましょう。
pt-table-checksumを使用するための準備
pt-table-checksum接続ユーザー作成
ソースとレプリカでpt-table-checksumにて接続をするための、共通ユーザーを作成します。
注意点は以下の通りです。
- 今回はDSNで指定したtestユーザを作成します
- 同じユーザ名でソース・レプリカ両方に接続できる必要があるため、ホストを’%'(ワイルドカード)としました。
- 認証プラグインを mysql_native_password で指定していますが、これはCentOS7.8でインストールされるperl-DBD-MySQLのバージョンが古くcaching_sha2_passwordに対応していないためです。
※バージョンが比較的新しい場合(例としてperl-DBD-MySQL-4.050-4)はcaching_sha2_passwordに対応しています - ユーザには、REPLICATION SLAVE, PROCESS, SUPER, SELECT権限、及びperconaデータベースへのALL権限を付与する必要があります。
※ なお、マニュアルでは明示的に必要な権限を記載していません。Percona社のブログ から必要な権限を確認しています。
1 2 3 4 5 6 7 8 |
mysql> CREATE USER test@'%' IDENTIFIED WITH mysql_native_password BY 'MySQL8.0'; Query OK, 0 rows affected (0.01 sec) mysql> GRANT REPLICATION SLAVE,PROCESS,SUPER,SELECT ON *.* TO test; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> GRANT ALL PRIVILEGES ON percona.* TO 'test'; Query OK, 0 rows affected (0.00 sec) |
検証に使用するテーブルの作成
今回検証に使用するデータベース、テーブル、及びレコードを以下のように作成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mysql> CREATE DATABASE test; Query OK, 1 row affected (0.00 sec) mysql> CREATE TABLE test.t1(id INT, test VARCHAR(255)); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO test.t1 VALUES (1,'a'), (2,'b'), (3,'c'), (4,'d'); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM test.t1; +------+------+ | id | test | +------+------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | +------+------+ 4 rows in set (0.00 sec) |
pt-table-checksum実行前の注意点
現在の設定が binlog_format = ROW or MIXED
の場合に pt-table-checksum はエラー終了します。
1 2 3 4 |
$ pt-table-checksum --databases test Checking if all tables can be checksummed ... Starting checksum ... Replica xxxxx has binlog_format ROW which could cause pt-table-checksum to break replication. Please read "Replicas using row-based replication" in the LIMITATIONS section of the tool's documentation. If you understand the risks, specify --no-check-binlog-format to disable this check. |
pt-table-checksum を実行する際にレプリカのbinlog_formatがROWに設定されている場合のリスク喚起が上記のメッセージになります。
--no-check-binlog-format
オプションを付けて実行する事でこのチェックを抑止し、ツールを実行することができます。
binlog_format = ROW or MIXED
の場合にツールを実行することについては、以下のブログを参考にしてください。
pt-table-checksumを実行
準備段階で作成したtestデータベースを指定し、pt-table-checksumを実行します。
1 2 3 4 5 |
# pt-table-checksum --no-check-binlog-format --databases test Checking if all tables can be checksummed ... Starting checksum ... TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE 05-13T09:25:25 0 0 4 0 1 0 0.346 test.t1 |
pt-table-checksumの出力内容について
出力内容 | 説明 |
---|---|
TS | pt-table-checksumがテーブルのチェックサムを終了したときのタイムスタンプ |
ERRORS | テーブルのチェックサム中に発生したERRORの数とWarningの数 |
DIFFS | レプリカとマスターの1つ以上の異なるチャンク数 |
ROWS | テーブルから選択とチェックサムが計算された行の数 |
DIFF_ROWS | チャンクごとの差異の最大数 |
CHUNKS | テーブルが分割されたチャンクの数 |
SKIPPED | 1 つ以上の問題によりスキップされたチャンクの数 |
TIME | テーブルのチェックサム処理中に経過した時間 |
TABLE | チェックサムが計算されたデータベースとテーブル |
この時点ではDIFFS
,DIFF_ROWS
が0と出力されていることから、差分がないことがわかります。
次に、差分が出力される場合を確認してみましょう。
レプリカでtestテーブルの行を1行削除します。
1 2 |
mysql> DELETE FROM test.t1 WHERE id=4; Query OK, 1 row affected (0.01 sec) |
ソースでpt-table-checksumを実行してみます。
1 2 3 4 5 |
[root@localhost ~]# pt-table-checksum --no-check-binlog-format --databases test Checking if all tables can be checksummed ... Starting checksum ... TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE 05-13T09:29:19 0 1 4 1 1 0 0.357 test.t1 |
ソースとレプリカで1行分の差分が検出されたことがわかります。
まとめ
レプリケーションをする際にデータの整合性が取れているのかチェックできるツールはとても便利です。
特に、pt-table-checksum接続ユーザー作成時の注意点に関して、自身がつまったポイントをまとめてみましたが、こちらはマニュアルにも記載されていなかったので、ぜひこの記事を参考に皆様がpt-table-checksumを利用しやすくなれば幸いです。