MySQL バイナリ ログ レプリケーション:エラーを無視するように設定できますか?

StackOverflow https://stackoverflow.com/questions/30660

質問

マスター/スレーブの MySQL バイナリ ログ レプリケーション システム (ふぅ!) を実行していますが、一部のデータが同期していません (つまり、マスターがスレーブよりも多くのデータを保持しています)。しかし、スレーブはわずかな MySQL エラーで頻繁に停止します。これを無効にすることはできますか?(おそらく、複製スレーブの my.cnf 設定、ignore-replicating-errors またはその類のものです ;))

これは、スレーブが存在しないアイテムを複製しようとすると、スレーブがただ死んでしまうということが時々起こることです。で簡単なチェック スレーブのステータスを表示 \G; 与える

       Slave-IO-Running: Yes
      Slave-SQL-Running: No
        Replicate-Do-DB: 
             Last-Errno: 1062
             Last-Error: Error 'Duplicate entry '15218' for key 1' on query. Default database: 'db'. Query: 'INSERT INTO db.table ( FIELDS ) VALUES ( VALUES )'

これは、(スレーブが停止したことに気づいたら)次の手順ですぐに修正します。

STOP SLAVE;
RESET SLAVE;
START SLAVE;

...最近これは面倒になってきているので、これを行う PHP を吐き出す前に、最初のエラーでスレーブを強制終了しない my.cnf エントリがあるかどうか疑問に思っていました。

乾杯、

/mp

役に立ちましたか?

解決

はい、my.cnf に --slave-skip-errors=xxx を指定します。xxx は「all」またはカンマ区切りのエラー コードのリストです。

他のヒント

スレーブを停止します。グローバル sql_slave_skip_counter=1 を設定します。スレーブを開始します。

現在のエラーのみを無視して、レプリケーション プロセスを続行できます。

まず、本当にエラーを無視しますか?エラーが発生した場合は、データが同期していない可能性があります。おそらく、エラーが発生したときにスレーブ データベースを削除し、同期プロセスを再開したいと考えています。

次に、発生するエラーは、存在しない項目をレプリケートする場合ではないと思います (そもそも、どういう意味でしょうか?)。スレーブ データベースにすでに存在する項目をレプリケートしているようです。

この問題は主に、クリーンなデータ コピーから開始しないことが原因であると思われます。マスターがスレーブにコピーされたようです。レプリケーションがオフになっている (または失敗している)。そして再び起動しましたが、スレーブに見逃したものに追いつく機会を与えませんでした。

データベースを複製してスレーブにインポートするのに十分な時間、書き込みアクセスのためにマスターを閉じることができる時間があれば、問題が解決する可能性があります。

モダンな mysqldump コマンドには、一貫性のあるレプリケーションのセットアップに役立つオプションがいくつかあります。チェックアウト --master-data これにより、バイナリ ログ ファイルと位置がダンプ内に配置され、スレーブにロードされるときに自動的に設定されます。また --single-transaction はトランザクション内でダンプを実行するため、一貫性のあるダンプを実行するために書き込みロックは必要ありません。

スレーブがレプリケーション以外の書き込みに使用されない場合、High Performance MySQL の作成者は追加することを推奨しています。 read_only ユーザーがスレーブ上のデータを誤って変更するのを防ぐためにスレーブ サーバー上で設定すると、あなたが経験したのと同じエラーが発生します。

データベースを同期せずにレプリケーションを実行していると思います。まずデータベースを同期してレプリケーションを試行し、サーバーが同じ一意のIDを生成して自動挿入オフセットを設定しようとします

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top