MySQLレプリケーション 1062エラーの対処
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する方法でもよい。
オートインクリメントしていても、不整合にはならないとのこと。