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


9

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

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

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

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

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

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

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

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

回答:


11

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

私はそうは思いません

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

一緒に属しています。

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

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

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

replicate-rewrite-dbMySQLドキュメントでさえこう言っています:

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

replicate-wild-do-table書き換え後に施行されます。この順序付けが、すでにデータを持っているテーブルに何らかの方法でINSERTを課したとしても、それは当然のことです。

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

側面#2:mysqldump

mysqldump --single-transactionデータのポイントインタイムダンプを行うには、実行するのが最もよい方法のようです。残念ながら、mysqldump --single-transactionにはアキレス腱がありますALTER TABLE。テーブルには、任意の対象となる場合ALTER TABLEなど、コマンドDROP TABLECREATE TABLE、それは、mysqldumpをのでダンプを行うにしようとしていたトランザクションの整合性を破ることができる。することができます(MySQLの宇宙のDDLである)、テーブルの切捨てとインデックスの削除と追加します破壊的でもあります。

詳細については、MySQLパフォーマンスブログのベストキープMySQLDump Secretを参照してください。私は実際に、mysqldumpのトランザクションの整合性を壊す可能性のある12のコマンドを説明する過去の質問でこの点に対処しました。MySQLバックアップInnoDB

警告

エピローグ

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

提案

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ツールをダウンロードする

必要なツールは

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


0

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


質問を振り返ってください。スレーブは読み取り専用で、再同期中に書き込みはありません。
RolandoMySQLDBA 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.