5

私は MySQL を初めて使用し、長い検索の結果、マスター/スレーブ ROW ベースのレプリケーションを構成することができました。安全で、何度も再確認する必要はないと思いました。

しかし、今日SHOW SLAVE STATUS;スレーブで行ったとき、次のことがわかりました

テーブル mydatabasename.atable で Write_rows イベントを実行できませんでした。キー 'PRIMARY' の重複エントリ '174465'、Error_code: 1062; ハンドラー エラー HA_ERR_FOUND_DUPP_KEY; イベントのマスター ログ mysql-bin.000004、end_log_pos 60121977

マスターにそのようなエラーがなく、両方のサーバーのスキーマが同じである場合に、これがどのように発生するかを誰かに教えてもらえますか? そして、これを再び機能させるために修正する方法と、将来そのようなことを防ぐ方法。

また、これ以外に予想外のことを教えてください。

4

3 に答える 3

9

マスターでは決して起こらないのですが、なぜですか?

一連の SQL は master からレプリケートされ
、レコードが master に既に存在する場合、mysql は master で拒否されます

ただし、スレーブでは、失敗してレプリケーション位置が次の SQL に進まない場合 (停止しただけです)

理由?

そのレコードの挿入クエリは、マスターからのレプリケーションを使用せずにスレーブに直接書き込まれます

直し方?

次のように、スレーブのエラーをスキップします

SET GLOBAL sql_slave_skip_counter = N;

詳細 - http://dev.mysql.com/doc/refman/5.0/en/set-global-sql-slave-skip-counter.html

または、スレーブの重複レコードを削除し、スレーブを再度再開します (レプリケーションに挿入を行わせます)。

最悪のシナリオでは、スレーブでのデータの整合性を確保するためにセットアップをやり直す必要がありました。

防ぐ方法は?

アプリケーション レベルを確認し、スレーブに直接書き込まないようにし
ます。これには、コマンド プロンプトでの mysql への接続方法も含まれます。

書き込みと読み取りができる mysql ユーザーを分割します。
そのため、アプリケーションが書き込みを必要としない場合は、読み取りユーザー (マスターとスレーブ) を使用する必要があります。
データベースへの書き込みが必要なアクションには書き込みユーザー (マスターのみ) を使用します。

于 2011-01-17T10:32:51.127 に答える