MySQLレプリケーション 1062エラーの対処

4月 17, 2010

MySQLレプリケーション 1062エラーの、簡単そうで意外と悩ましい対処。

MySQLのレプリケーションにおいて、本来あってはならないことだが、もし何らかの
タイミングでスレーブにデータが登録されてしまうとレプリケーションエラーが発生する。

この時SHOW SLAVE STATUSを実行すると、以下のようなメッセージが出力されるだろう。

mysql> SHOW SLAVE STATUS¥G
:
:
Last_Errno: 1062
Last_Error: Error ‘Duplicate entry ’15078′ for key 1′ on query. ・・・(略)”
:
:


上記の場合、”15078″レコードが二重に登録されようとして「それはできないよ」となり、
レプリケーションがストップする。
この時の対応としては、他所でいくらでも書かれていることではあるが・・・、
STOP SLAVEしてから以下のコマンドで不要なSQL文のレプリケートをスキップする。

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;


この後START SLAVEしてレプリケートが正常に再開されればOKなのだが、
続けて発生してしまったら以下のどれかで対応、、、かな。
(ちなみに3.は未検証)

1.上記を繰り返す。
2.またはスキップしたいレコード数、n行分指定する。
3.またはmy.cnfにslave-skip-errors=1062と記述し、サービスを再起動


スキップしたいレコード数がすぐに判別できるればよいのだが、そうでない場合の
対応は難しそうだ。一応エラーログにも不良レコード情報を出力してくれるが、
エラーログに吐かれた分のレコードをスキップさせたのに、まだ不良レコードが
残ってたことがある。一体どこまでやればいいんじゃ、と悩む。
べたなやり方だが、以下のようにしてmytable.txtの中身を確認し、スキップするべき
レコード数を調べてみるとか???

$ mysql -u mysql -pxxxxxx -e “select * from mydb.mytable” > mytable.txt


しかし、あまり時間をかけて調査できないシチュエーションだってあるだろうし。
そんな時は強引に「3.」をやるしかないのかな。

なにかいい方法があればよいが・・・、思いついたら追記。

追記
SET GLOBAL SQL_SLAVE_SKIP_COUNTER文発行ではなく、重複しているレコードを
スレーブ側でDELETEする方法でもよい。
オートインクリメントしていても、不整合にはならないとのこと。

Categories: MySQL

No Responses so far | Have Your Say!

Comments are closed.