面接問題:MySQL主従データが一致しない原因は?
生命は小川のようだ.風雨はもっと広がるだけ
主従の不一致の原因をもたらすプライマリ・ライブラリbinlog形式はStatementであり、ライブラリから実行されるまで同期するとプライマリ・スレーブが一致しない可能性があります.
メインライブラリ変更を実行する前にset sql_を実行するlog_bin=0では、メインライブラリにbinlogが記録されず、ライブラリからこのデータを変更することはできません. ノードから読み取り専用が設定、誤動作書き込みデータ .
プライマリ・ライブラリまたはスレーブ・ライブラリが予期せぬダウンタイムを発生し、ダウンタイムによりbinlogまたはrelaylogファイルが破損し、プライマリ・スレーブが一致しない
マスタスレーブインスタンスバージョンが一致しない、特に高バージョンがマスタであり、低バージョンがスレーブの場合、マスタデータベース上でサポートされている機能は、データベース上からサポートされていない可能性がある .
MySQL自身のバグによる 主従不一致修復方法
ライブラリから再実装これも解決策ですが、このスキームのリカバリ時間は遅く、ライブラリからもクエリー操作の一部を引き受けている場合があり、簡単に再構築できない場合があります.
percona-toolkitツールを使用してPTツールパッケージにpt-table-checksumとpt-table-syncの2つのツールが含まれています.主に主従が一致しているかどうか、データの不一致を修復するかどうかを検出するために使用されます.この案の利点は修復速度が速く、主従補助を停止する必要がないことであり、欠点は知識の蓄積が必要であり、学習、テスト、特に生産環境では、注意して使用する必要があることである.
不一致テーブルの手動再構築ライブラリから発見されたいくつかのテーブルはメインライブラリのデータと一致しないが、これらのテーブルのデータ量も比較的大きく、手作業でデータを比較するのは現実的ではなく、 である.
ライブラリ全体のやり直しも遅いので、このときはこの数枚のテーブルだけをやり直して主従の不一致 を修復することができます.
このシナリオの欠点は、インポートの実行中にライブラリからのレプリケーションを一時的に停止する必要があることですが、許容できます.
例:A,B,Cの3つのテーブルの主従データが一致しない
主従の不一致を回避する方法メインライブラリbinlogはROW形式 を採用
プライマリ・スレーブ・インスタンス・データベース・バージョンは、 の一貫性を維持します.
メインライブラリはアカウントの権限をしっかりとコントロールして、set sqlを実行することができませんlog_bin=0
ライブラリから読み取り専用をオンにし、 への人為的な書き込みは許可する.
定期的に主従一致性検査 を行う.
主従の不一致の原因をもたらす
ライブラリから再実装
percona-toolkitツールを使用してPTツールパッケージにpt-table-checksumとpt-table-syncの2つのツールが含まれています.主に主従が一致しているかどうか、データの不一致を修復するかどうかを検出するために使用されます.この案の利点は修復速度が速く、主従補助を停止する必要がないことであり、欠点は知識の蓄積が必要であり、学習、テスト、特に生産環境では、注意して使用する必要があることである.
不一致テーブルの手動再構築
このシナリオの欠点は、インポートの実行中にライブラリからのレプリケーションを一時的に停止する必要があることですが、許容できます.
例:A,B,Cの3つのテーブルの主従データが一致しない
1、 Slave
mysql>stop slave;
2、 dump , binlog POS
mysqldump -uroot -pmagedu -q --single-transaction --master-data=2 testdb A B
C >/backup/A_B_C.sql
3、 A_B_C.sql , binlog POS
head A_B_C.sql
:MASTERLOGFILE='mysql-bin.888888', MASTERLOGPOS=666666;
# , ,A,B,C
, ,
4、 A_B_C.sql Slave ,
mysql>start slave until MASTERLOGFILE='mysql-bin.888888',
MASTERLOGPOS=666666;
5、 Slave A_B_C.sql
mysql -uroot -pmagedu testdb
mysql>set sql_log_bin=0;
mysql>source /backup/A_B_C.sql
mysql>set sql_log_bin=1;
6、 , 。
mysql>start slave;
主従の不一致を回避する方法