2つのマスター(および2つのスレーブ)を持つMySQL(v5.1.61)クラスターがあります。テーブルlogs
に主キー列logID
があります。このログテーブルはかなり大きくなるので、そこからデータを削除します。それを行うスクリプトを作成しました。 —このスクリプトを両方のマスターで実行しても安全ですか?データのみを削除します。削除しようとしている行がすでに削除されている場合、MySQLレプリケーションモジュールは何を行うのでしょうか。レプリケーションは中断しますか、それとも両方のマスターの行を削除しても安全ですか?行ベースまたはステートメントベースのレプリケーションを使用するかどうかは重要ですか?
例:ログデータ削除スクリプトは、マスターAの行123を削除します。同時に、スクリプトはマスターBの同じ行を削除します。次に、マスターBはリレーログを読み取り、次のように表示されます"行123を削除する必要があります、マスターAで削除されたので、私はそのスレーブです。削除してみましょう... ... ...しかし、すでに削除されています! " —では、マスターBは何をしますか?重複キーエラーがあったかのように、レプリケーションが停止しますか?それとも"ファイン、私は何もする必要がない"と思いますか、そしてすべてが大丈夫です。
あなたの質問はあなたの答えの鍵をすでに持っています。行ベースまたはステートメントベースのレプリケーションに依存します。
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ドキュメントの 長所と短所のステートメントベースおよび行ベースのレプリケーション を参照してください。