このブログを検索

2011年2月10日木曜日

[MySQL]readonlyスレーブなのにduplicateエラーが出る

readonlyスレーブなのにDuplicateエラーが発生する時の暫定的な対処。
本来は根本原因を探るべき。
例えば次のようなエラーが発生し、SQLスレッドが停止したとします。
110209 21:08:45 [ERROR] Slave SQL: Error 'Duplicate entry '49-2147483647-49' for key 'PRIMARY'' on query. Default database: 'quest001i'. Query: 'INSERT INTO
        tbl_quest_user_stage1 
        (quest_id, user_id, stage_id, finish_flg, last_access_dt, finish_dt, delete_flg, regist_dt, update_dt)
VALUES
        (0x31, 0x3139323831393731, 0x31, 0x30, str_to_date(NULL,'%Y/%m/%d %T'), str_to_date(NULL,'%Y/%m/%d %T'), 0x30, str_to_date(0x323031312F30322F30392032313A30383A3233,'%Y/%m/%d %T'), str_to_date(0x323031312F30322F30392032313A30383A3233,'%Y/%m/%d %T'))', Error_code: 1062
110209 21:08:45 [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.000021' position 935073

手動でエラーをスキップしてSQLスレッドを再開するのは次の通り。
SQL> set global SQL_SLAVE_SKIP_COUNTER=1;
SQL> start slave sql thread;

スキップすべきエラーが大量にある場合はMaatkitが便利です。
mk-slave-restartをバックグラウンド実行すると、特定のエラーをスキップしスレーブを再開します。
mk-slave-restart -uroot -pxxxxxxxxxxxx -S/usr/local/db_data/mysql/mysql.sock --error-numbers=1062 --verbose > skipslave.err 2>&1 &


追記 2011/02/10
こんなことしなくても、my.cnfに書けばいいようです。
当然、MySQL再起動は必要ですが。
slave-skip-errors=1062
すべてスキップしたければ
slave-skip-errors=all

0 件のコメント:

コメントを投稿