mysql主従データ不一致問題解決


に質問
問題を解決するには、どのように一致しないかを比較し、業務に影響を与えない場合に、データの一致しない問題を修復し、ライブラリから欠落したデータを補う以下に考えられるいくつかの案を見つけることができます1新しい0から同期し、メインライブラリの使用に影響はありませんが、そんなに大きなデータ量は、性能、ネットワークに影響が少し大きいです.データが失われたのは少ないはずです2メインライブラリdumpデータ、ロックライブラリ、そして同期、よくありません.影響業務は3 percona-toolkitのツールを使用して検証と同期を行い、紹介から見ると現在の状況に合致し、使用上は学習と認識が必要である.
以下にいくつかの参照リンクを示します.
percona-toolkitツール公式アドレスMySQL主従サーバデータ整合性の照合と修復簡単説明下プロセスpt-table-checksum検査データ整合性記述ツール原理pt-table-sync修復不一致データ記述ツール原理操作プロセス
プロセスと使用するものだけを説明し、パラメータオプションなどドキュメントを参照する必要があるものもあります.2台の機械はcentos 6です.5 mysqlバージョンはすべて5.6で、オンライン環境なので、ここでipやパスワードなどの機密情報を修正しました.
主192.168.1.100は192.168から.1.98データベース名radius修復ツールのインストール
マスター・ライブラリ・サーバへのインストール
#依存パッケージのインストール
yum install perl-DBI perl-DBD-MySQL perl-TermReadKey perl-Time-HiRes
#インストールツール
wget percona.com/get/percona-toolkit.tar.gz
tar zxvf percona-toolkit-2.2.14.tar.gz
cd percona-toolkit-2.2.14
perl Makefile.PL && make && make install
データ整合性の検証
ユーザーの確立と承認
ここでは、プライマリ・スレーブで同じ名前のユーザーを作成するには、プライマリ・ライブラリからスレーブ・ライブラリにアクセスできます.プライマリ・ライブラリはローカルでプライマリ・ライブラリにアクセスできます.ツールの使用はすべてメインライブラリのサーバで行い,pt-table-checksumを用いてデータ整合性を検証する.
ライブラリmysqlからの操作
GRANT SELECT,PROCESS, SUPER, REPLICATION SLAVE ON . TO 'checksums'@'192.168.1.100' IDENTIFIED BY 'slavecheck';
flush privileges
メインライブラリmysql操作
GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON . TO 'checksums'@'192.168.1.100' IDENTIFIED BY 'slavecheck';
GRANT SELECT,INSERT,UPDATE,DELETE ON radius.checksums TO 'checksums'@'192.168.1.100';
flush privileges;
検証には、プライマリmysqlにテーブルを新規作成する必要があります.新規ユーザーには読み書き権限が必要です.ここでは、radiusライブラリに検証テーブルを作成します.
pt-table-checksum検査
検証は、プライマリ・ライブラリ・サーバ上で行われます.
メインライブラリshellでpt-table-checksum h='192.168を実行する.1.100',u='checksums',p='slavecheck',P=3306 -d radius --nocheck-replication-filters --replicate=radius.checksums
--nocheck-replication-filters:レプリケーションフィルタをチェックしないで、有効にすることをお勧めします.チェックするデータベースを--databasesで指定できます.--No-check-binlog-format:コピーされたbinlogモードはチェックされず、binlogモードがROWであればエラーが報告されます.--replicate-check-only:非同期の情報のみが表示されます.--Replicate=:checksumの情報を指定したテーブルに書き込み、チェックされたデータベースに直接書き込むことをお勧めします.--Databases=:チェックするデータベースを指定し、複数はカンマで区切られます.--tables=:チェックするテーブルを指定し、h=192.168をカンマで区切る.1.100:Masterのアドレスu=checksums:ユーザ名p=slavecheck:パスワードP=3306:ポート
このスクリプトは、プライマリ・ライブラリ・マシンで実行され、自動的にセカンダリ・ライブラリ・アドレスが見つかり、同じユーザーでログインして比較されます.
-replicateオプションは、比較情報を格納するためのテーブルを作成することです.このテーブルは必ずスレーブ・ライブラリに同期できます.checksumsユーザーがテーブルを作成する権限がない場合は、自分でテーブルを作成してください.
テーブル文
CREATE TABLE IF NOT EXISTS radius . checksums (db CHAR(64) NOT NULL,tbl CHAR(64) NOT NULL,chunk INT NOT NULL,chunk_time FLOAT NULL,chunk_index VARCHAR(200) NULL,lower_boundary TEXT NULL,upper_boundary TEXT 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 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (db, tbl, chunk),INDEX ts_db_tbl (ts, db, tbl)) ENGINE=INNODB;
ここで手動でテーブルを作成した後、次のエラーが発生しました.
6-16T16:10:48 The --replicate table radius . checksums exists on the master but but it has problems on these replicas:Table radius.checksums does not exist on replica localhost.localdomain 12の前のエラーで、プライマリ・セカンダリ・レプリケーションに問題が発生し、ライブラリからアクティブ・ステータスを表示し、調整はプライマリ・セカンダリ・セカンダリ・セカンダリ・レプリケーションから正常に行われます.
エラー解決完了実行継続(結果は省略)
次はメインライブラリのshellでチェックを続けます[root@localhost portal]# pt-table-checksum h='192.168.1.100',u='checksums',p='slavecheck',P=3306 -d radius --nocheck-replication-filters --replicate=radius.checksumsTS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE06-16T16:50:21 0 1 8379 4 0 0.322 radius.account_account06-16T16:50:21 0 1 11429 1 0 0.278 radius.account_mac06-16T16:50:21 0 1 63747 1 0 0.329 radius.account_smslog06-16T16:50:21 0 0 0 1 0 0.016 radius.auth_group06-16T16:50:21 0 0 0 1 0 0.013 radius.auth_group_permissions06-16T16:50:22 0 0 27 1 0 0.265 radius.auth_permission06-16T16:50:22 0 1 8384 1 0 0.273 radius.auth_user......
この結果、checkが完了したことを説明し、diffsの欄が異なることは、それらのテーブルデータが一致していないことを説明する.ライブラリからmysqlにログインし、次の文を実行します.
mysql> select * from radius.checksums where master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)\G 1. row db: radiustbl: account_accountchunk: 2chunk_time: 0.028065chunk_index: PRIMARYlower_boundary: 1847upper_boundary: 9225this_crc: 4f43a2this_cnt: 7336master_crc: 9235f7a2master_cnt: 7379ts: 2015-06-16 17:00:31
全部で8つの記録があり、この8つの表のデータは一致していません.どれだけのデータが欠けているかなどが見て取れるだろう.
矛盾データの修正
不一致データの修復pt-table-syncツール、pt-table-checksumツールの結果を使用します.しかし、ここにはまだ穴があります.修復する前に、プライマリmysqlデータをバックアップしたほうがいいです.プライマリ・ライブラリに書き込み操作があり、リスクがあります.
プライマリ・ライブラリ・サーバの実行
[root@localhost portal]# pt-table-sync --execute --replicate radius.checksums --sync-to-master h="192.168.1.98",P=3306,u="checksums",p="slavecheck"--ignore-tables radacct,django_sessionDBI connect(';host=124.88.52.100;port=3306;mysql_read_default_group=client','checksums',...) failed: Access denied for user 'checksums'@'124.88.52.100'(using password:YES)at/usr/local/bin/pt-table-sync line 2220ただしmysqlで直接接続すれば問題ありません
最後にドキュメントを調べてみると、まだユーザー権限の問題です.ライブラリからの操作
mysql> GRANT all ON radius.* TO 'checksums'@'192.168.1.100';Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)
マスターライブラリアクション
mysql> GRANT all ON radius.* TO 'checksums'@'192.168.1.100';Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)
削除権限を追加すればいいのに、私はサボっています.
エラーはほぼ解決した
データの修復
まず重要でないテーブルを修復して実験します(メインライブラリ操作)
pt-table-sync --execute --replicate radius.checksums --sync-to-master h=192.168.1.98,P=3306,u=checksums,p="slavecheck"--tables account_smslog,radcheck --print
修復完了checkメインライブラリ操作を1回実行
pt-table-checksum h='192.168.1.100',u='checksums',p='slavecheck',P=3306 -d radius --nocheck-replication-filters --replicate=radius.checksums
ライブラリmysqlからチェックする
mysql> select * from radius.checksums where master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)\G
確かに2枚の表が少なく、修復されたことを示しています.
次に他の表を修復し、問題がないかチェックすればOKです.
小結
ここで主な問題は,1スクリプトがそこで実行される(いずれもメインライブラリサーバであり,ライブラリから結果をチェックするだけである)2ユーザをどのように確立するか,ユーザにどのような権限を与えるべきかである.