側面#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 TABLE
など、コマンドDROP TABLE
とCREATE 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ツールをダウンロードする
必要なツールは
これらを使用してスレーブの違いを見つけ、修正します