2011-12-28 34 views
2

MySQLレプリケーションで「重複キー」エラーが発生する理由は何ですか?"DUPLICATE KEY"エラーの原因

master-master複製セットアップがあります。 2つのマスタmaster1とmaster2を仮定すると、データは常にmaster1に挿入されます。
私が使用するクエリは、temp_column1がauto_incrementカラムである "INSERT INTO temp(temp_column2、temp_column3、...)VALUES( 'XXX'、 'YYY'、...)」です。 私のセットアップでは、2人のデーモンがmaster1にデータを挿入し、重複するキーエラーを作成しています。

なぜ起こっているのかわかりません。ほとんどの場合、問題が発生すると、重複キーエラーは行とその次の行との競合です。例えば

#### on master1 #### 
     temp_column1, temp_column2, temp_column3, timestamp 
Row1:   1  'XXX',  'YYY',   2011-12-28 12:00:00 
Row2:   3  'AAA',  'BBB',   2011-12-28 12:00:00 

#### on master2 (replication mysql instance) #### 
     temp_column1, temp_column2, temp_column3, timestamp 
Row1:   1  'AAA',  'BBB',   2011-12-28 12:00:00 

Row2: (Duplicate key error) when trying to insert row1 ('XXX', 'YYY') 

だから、私はレプリケーションを修正するためにマスター2で行2 IDを更新しています。

なぜDUPLICATE KEYエラーが常に連続して発生していますか?これには何か解決策はありますか?それはMySQLのバグですか?

+0

AUTO_INCREMENTは複製用に正しく設定されていますか?...問題のテーブルのCREATE TABLEコマンドは何ですか? – BRFennPocock

答えて

0

テーブル内の既存のUNIQUEインデックスまたはPRIMARY KEY値を複製する行が重複キーエラーが発生

キーワードをIGNOREを使用している場合、INSERTステートメントの実行中に発生したエラーではなく警告として扱われます。たとえば、IGNOREを使用しない場合、テーブル内の既存のUNIQUEインデックスまたはPRIMARY KEY値を複製する行によって重複キーエラーが発生し、そのステートメントは中止されます。 IGNOREでは、行はまだ挿入されませんが、エラーは発行されません。

は、データベース内のすべてのノード間で一貫性のある状態を維持しようとしないのmysqlにhttp://dev.mysql.com/doc/refman/5.5/en/insert.html

+0

実際の問題に対処するのではなく、ユニークなキーが何をするのかという非常に一般的な説明に耳を傾けると思います。 –

+0

はい、テーブルの既存のユニークインデックス値が重複キーエラーを引き起こすことを理解しています。私はなぜユニークキーの競合が最初に発生するのかを知ることに興味があります。上記の私の例では、master1上で挿入の順序はRow1とRow2ですが、私の複製のインスタンスでは、挿入の順序はRow2とRow1です。なぜこうなった? –

2

レプリケーションを参照してください。これを実行しようとしたが、一般的に(IME)クラスタリングソリューションがあります。

  1. は、ノード

  2. の間で渡される同期データの膨大な量を必要とし、多くの場合、はるかに遅い結果

  3. としてあります彼らが失敗したとき、彼らは劇的にそうする。

基本的には、予測不可能なdel各ノードのDML操作の間にあります。

複数のノードに挿入を許可し、ノードに適切にsetting the increment and offsetを付けずに自動インクリメントフィールドを使用しているため、問題が発生しているようです。

+0

いいえ、常に1つのノードに常に行を挿入しています。しかし、まだ私は問題に直面しています。 –

0

多分それは、このバグのためです:値は、サーバー上auto_increment_offsetとinnodb_autoinc_lock_modeのためにあるか http://bugs.mysql.com/bug.php?id=61209

チェックして、このバグのための私のパッチがあります= 1

auto_increment_offsetでサーバーを使用しようと、 MySQL/Oracleからの応答を待っています。

関連する問題