web-dev-qa-db-ja.com

MySQLレプリケーションの主キーの重複エントリ

160523 13:07:29 [ERROR] Slave SQL: Error 'Duplicate entry '914166' for key
'PRIMARY'' on query. Default database: 'zo_dev_20121216'. Query: 'UPDATE    
   activity
SET
   activity_type_id = 9,
   subject = 'Send departure email',
   date_due = '2016-05-26 01:00',
   date_start = '2016-05-23 01:00',
   activity_status_id = 1,
   content = 'Send departure email'
WHERE
   id = 2888555', Error_code: 1062
160523 13:07:29 [Warning] Slave: Duplicate entry '914166' for key 'PRIMARY'     
Error_code: 1062
160523 13:07:29 [ERROR] Error running query, slave SQL thread aborted. Fix     
the problem, and restart the slave SQL thread with "SLAVE START". We stopped   
at log 'mysql-bin.000004' position 14847360

多くの人がslave-skip-errorオプションなどを使用することを提案していますが、それはクエリを完全に回避します。実際にエラーを引き起こすクエリをどのように続行しますか?また、なぜこれが正しく行われるのか、「914166」という数字が何を示しているのかについて、良い答えが見つかりませんでした。誰かが説明できますか?

3
Ravi

914166の数字は何を示していますか?

番号は、データを挿入しようとしているテーブルの行を示します。たとえば、いくつかの値を914166番目の行に挿入しようとしています。

なぜこのエラーが発生するのですか?

このエラーは、値が重複しているために発生します。 914166をテーブルactivityに主キーとして挿入/更新しようとしていますが、値914166がそのテーブルアクティビティにすでに存在しています。

エラーを引き起こすクエリを実際にどのように続行しますか?

主キー列は一意の列であるため、重複する値は受け入れられません。次のステートメントを使用して、このクエリをスキップし、次のクエリを続行できます。

stop slave;

set global sql_slave_skip_counter = 1;

start slave;

エラーをスキップすることは適切なオプションではないことに注意してください。MySQLによって提案されているように、問題を修正してスレーブを起動する必要があります。

回避策:

そのクエリは完全なステートメントですか?

指定されたクエリは挿入クエリではないようですが、更新ステートメントであり、アクティビティテーブルの主キーを更新していません。

マスターサーバーをチェックインし、前述の主キー(id)列がactivityテーブルに属しているかどうかを確認し、その列に値(id=914166)が存在することを確認します。

select * from zo_dev_20121216.activity where id = 914166;

そのアクティビティテーブルに値が存在する場合は、スレーブサーバーをチェックインし、特定の値(id=914166)が存在するかどうかを確認します。値がスレーブサーバーに存在する場合は、クエリをスキップできます。

select * from zo_dev_20121216.activity where id = 914166;

上記の2つのクエリで空の結果セットを取得している場合、クエリが不完全であるか、間違ったクエリをデバッグしていることがわかります。

重要なのは、クエリは、そのテーブルに既に存在するアクティビティテーブルに値を挿入/更新しようとしているです。

エラーのデバッグの開始点として役立つことを願っています。

7
Rathish

おそらくあなたはこの質問と答えをチェックすることができます: MySQLレプリケーション: 'PRIMARYキーの重複したエントリ'

1:すべての重複キーエラーをスキップするスレーブのmy.cnfにこれを追加するだけです

[mysqld] slave-skip-errors = 1062 skip-slave-startとmysqlを再起動します。次に、START SLAVEを実行します。

すべての重複キーエラーはバイパスされます。 Seconds_Behind_Masterが> 0になったら、それらの行を削除してmysqlを再起動します。

1
CP3O