web-dev-qa-db-ja.com

MySQLマスターマスターレプリケーション、両方のマスターの行を削除しても安全ですか?

2つのマスター(および2つのスレーブ)を持つMySQL(v5.1.61)クラスターがあります。テーブルlogsに主キー列logIDがあります。このログテーブルはかなり大きくなるので、そこからデータを削除します。それを行うスクリプトを作成しました。 —このスクリプトを両方のマスターで実行しても安全ですか?データのみを削除します。削除しようとしている行がすでに削除されている場合、MySQLレプリケーションモジュールは何を行うのでしょうか。レプリケーションは中断しますか、それとも両方のマスターの行を削除しても安全ですか?行ベースまたはステートメントベースのレプリケーションを使用するかどうかは重要ですか?

例:ログデータ削除スクリプトは、マスターAの行123を削除します。同時に、スクリプトはマスターBの同じ行を削除します。次に、マスターBはリレーログを読み取り、次のように表示されます"行123を削除する必要があります、マスターAで削除されたので、私はそのスレーブです。削除してみましょう... ... ...しかし、すでに削除されています! " —では、マスターBは何をしますか?重複キーエラーがあったかのように、レプリケーションが停止しますか?それとも"ファイン、私は何もする必要がない"と思いますか、そしてすべてが大丈夫です。

1
KajMagnus

あなたの質問はあなたの答えの鍵をすでに持っています。行ベースまたはステートメントベースのレプリケーションに依存します。

文ベースの複製

DELETE FROM tblname WHERE blahblahblah;を実行し、blahblahblahに一致する行が存在しない場合は、問題ありません。レプリケーションはそのまま続行されます。わずかな違いがあったとしても、スレーブ(または、あなたの場合はどちらかのマスター)でデータドラフトを実現するのにはるかに長い時間がかかります。

行ベースのレプリケーション

DELETE FROM tblname WHERE blahblahblah;を実行し、blahblahblahに一致する行が存在しない場合、正確な行情報がスレーブのリレーログに埋め込まれているため、レプリケーションが中断する可能性があります。その行は、削除が発生するために存在することが期待されています。エラーコードがあります

sh-4.1# perror 1032
MySQL error code 1032 (ER_KEY_NOT_FOUND): Can't find record in '%-.192s'

このようなエラーログメッセージが表示される可能性があります

2014-02-27 22:03:00 4070 [エラー]スレーブSQL:テーブルmydb.mytableでUpdate_rowsイベントを実行できませんでした。 'mytable'でレコードが見つかりません、Error_code:1032;ハンドラエラーHA_ERR_KEY_NOT_FOUND;イベントのマスターログmysql-bin.000166、end_log_pos 93114177、Error_code:1032

2014-03-17 10:50:15 11596 [エラー]スレーブSQL:テーブルmydb.mytableでDelete_rowsイベントを実行できませんでした。 'mytable'でレコードが見つかりません、Error_code:1032;ハンドラエラーHA_ERR_KEY_NOT_FOUND;イベントのマスターログmysql-bin.000337、end_log_pos 427881、Error_code:1032

これを論議する他のリンクはここにあります

詳細については、MySQLドキュメントの 長所と短所のステートメントベースおよび行ベースのレプリケーション を参照してください。

1
RolandoMySQLDBA