web-dev-qa-db-ja.com

MySQLレプリケーション:「PRIMARYキーの重複したエントリ」

完全に再同期した後、スレーブサーバーで「PRIMARYキーの重複したエントリ」が表示される理由を教えてください。

基本的に、「mysqldump」はほぼ一晩実行されていたため、復元プロセスには数時間かかったため、スレーブを起動したとき、マスターから約63874秒遅れていました。

スレーブサーバーは読み取り専用(read_only)であり、再同期プロセス中に書き込みがなかったため、重複したキーがある理由がわかりません。

マスターでバイナリログ形式がMIXEDに設定されています。

DBのバックアップに使用されるコマンド:

mysqldump --opt --single-transaction -Q --master-data=2 db | bzip2 -cz > db.sql.bz2

スレーブは、次のオプションを使用して、マスターから1つのデータベースのみを複製しています(db-> db_backup)。

replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup
9
HTF

側面#1:レプリケーション

私はそうは思いません

replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup

一緒に属しています。

他の人もこれについて疑問に思っています

この問題は、複製ルールが処理される順序に起因します。 レプリケーションルールに関するMySQLのドキュメント によると:

--replicate-rewrite-dbオプションが指定されている場合、それらは--replicate- *フィルタリングルールがテストされる前に適用されます。

replicate-rewrite-dbのMySQLドキュメント でもこう言っています:

--replicate- *ルールがテストされる前に、データベース名の変換が行われます。

replicate-wild-do-tableは、書き換え後に適用されます。この順序付けが、何らかの方法で、すでにデータを持っているテーブルにINSERTを課したとしても、驚くことではありません。

データはどのようにしてそこに到達したのでしょうか?

側面#2:mysqldump

mysqldump --single-transactionを実行することは、データのポイントインタイムダンプを行うための最良の方法のようです。残念ながら、mysqldump --single-transactionにはアキレス腱:ALTER TABLEがあります。テーブルがALTER TABLEDROP TABLEなどのCREATE TABLEコマンドの影響を受ける場合、mysqldumpがダンプを実行しようとしたトランザクションの整合性を破壊する可能性があります。テーブルの切り捨て(これはMySQLユニバースのDDLです)、インデックスの削除と追加も混乱を招く可能性があります。

詳細については、MySQL Performance Blogの MySQLDumpの秘密保持 を参照してください。 mysqldumpのトランザクションの整合性を壊す可能性のある12のコマンドを説明する過去の質問で、私は実際にこの点に対処しました: MySQL backup InnoDB

警告

エピローグ

書き換え規則またはmysqldumpの分離がオーバーライドされているために存在していなかったはずのmysqldumpの実行中に、1つまたは両方の側面が原因でmysqldumpが実行された可能性があります。

提案

Mysqldumpの開始以降、すべてのリレーログのmysqlbinlogダンプを実行して、スレーブが処理するすべてのINSERTを確認し、それらの行がスレーブにすでに存在するかどうかを確認します。もしそうなら、あなたはおそらく2つのことをすることができます:

1:すべての重複キーエラーをスキップします

これをスレーブのmy.cnfに追加するだけです

[mysqld]
slave-skip-errors=1062
skip-slave-start

mysqlを再起動します。次に、START SLAVE;を実行します

すべての重複キーエラーはバイパスされます。 Seconds_Behind_Masterが0になったら、それらの行を削除してmysqlを再起動します。

2:perconaツールをダウンロードする

必要なツールは

これらを使用してスレーブの違いを見つけ、修正します

11
RolandoMySQLDBA

スレーブに直接挿入するコードで挿入クエリを確認します。スレーブからのみ読み取ることができます。書き込みクエリはマスターに送信する必要があります。

0
Umair Anwar