raymanです。
MySQLでレプリケーションを行うことはよくあるかと思います。
今回紹介するのはmaatkitでdatabaseの整合性チェックを行うツールです。

| 作業難易度 | ![]() ![]() ![]() ![]() ![]() |
|---|---|
| 作業危険度 | ![]() ![]() ![]() ![]() ![]() |
| 実績度 | ![]() ![]() ![]() ![]() ![]() |
| 作業Step数 | 3 Steps |
作業内容
まず大前提にMySQLでレプリケーションされているからデータの整合性がとれているとは限りません。
Slaveがread onlyになっていない場合はSlaveに書き込みができてしまい整合性がとれなくなってしまいます。「Slave_IO_Running」「Slave_SQL_Running」が「Yes」でも整合性が取れていない場合があるのです。
そこで今回はMaster側のデータとSlave側のデータの整合性がとれているかチェックを行う作業をします。
maatkitには色々ツールがあるのですが今回紹介するのはmk-table-checksumです。
下記図のように動作し、テーブル整合性チェックを行います。
1. Master側テーブルのハッシュ値をchecksumクエリにて取得します。

2. MasterからSlaveにレプリケーションされます。

3. レプリケーションされたクエリがSlave で実行され、 Slave側でのchecksumクエリ結果が更新されます。

作業手順
▼Step 0
MySQLのレプリケーションができている状態である事を前提とします。
またmaatkitのインストールは下記URLを参照してください。
http://www.maatkit.org/download
▼Step 1
まずMaster側にchecksumを行うデータベースとテーブルを作成します
mysql> create database maatkit;
Query OK, 1 row affected (0.03 sec)
mysql> use maatkit
Database changed
mysql> CREATE TABLE checksum (
-> db char(64) NOT NULL,
-> tbl char(64) NOT NULL,
-> chunk int NOT NULL,
-> boundaries char(100) NOT NULL,
-> this_crc char(40) NOT NULL,
-> this_cnt int NOT NULL,
-> master_crc char(40) NULL,
-> master_cnt int NULL,
-> ts timestamp NOT NULL,
-> PRIMARY KEY (db, tbl, chunk)
-> );
Query OK, 0 rows affected (0.57 sec)
mysql> show tables;
+-------------------+
| Tables_in_maatkit |
+-------------------+
| checksum |
+-------------------+
1 row in set (0.01 sec)
mysql>
▼Step 2
データーベース内の各テーブルのデータをMD5でハッシュをとります。
今回のテストではsample_databaseを対象にしています。
“–databases”を外せば全てのdatabaseを確認できます。
(SUPER 権限で作業を行うでread onlyのslaveでもslave側に書き込みができるようになります)
DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG
sample_database board 0 ***.***.***.*** MyISAM 1 9a812884 0 NULL NULL NULL
sample_database messages 0 ***.***.***.*** MyISAM 2 59602b5c 0 NULL NULL NULL
sample_database thread 0 ***.***.***.*** MyISAM 1 a7ccb2c3 0 NULL NULL NULL
▼Step 3
Master/Slaveのdiffを取り何も出力されなければ整合性がとれていることになります
user@RHEMS:#
作業検証者からの一言
今回はMasterのデーターベスの中身がSlaveと整合性がとれているか確認をしました。
mk-table-checksumではMasterの既存テーブルの整合性しか確認しません。なのでSlaveに新しくテーブルを作成しても不整合としては検知されません。

