MySQL — master/slave replication error «Duplicate entry»

Не так давно в очередной раз отвалилась MySQL реплика!
Казалось бы репликация в mysql за многие годы должна быть вылизана до идеала, но почемуто на практике это не так. Очень часто репликация master/slave в MySQL отваливается с ошибкой:

2014-09-26 08:57:14 42399 [ERROR] Slave SQL: Could not execute Write_rows_v1 event on table diff_wp.wp_options; Duplicate entry '_transient_is_multi_author' for key 'option_name', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000051, end_log_pos 128112, Error_code: 1062
2014-09-26 08:57:14 42399 [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.000051' position 127907

У меня уже такое было, и я писал что на тот момент нашел временное решение. Но почему временное? Просто не было времени разбираться, а разобравшись … понял что тот вариант не совсем мне подходил. Итак, вариантов решения много — выбирай что нравится!

1. Это я уже применял, можно пропустить некорректную запись на слейве:

mysql> stop slave;
mysql> SET GLOBAL sql_slave_skip_counter = 2;
mysql> start slave;

2. Если slave нужен только для чтения, иногда помогает вот такая опция в my.cnf на слейве:

read_only = yes

3. Еще вариант, можно пропускать сбойные команды какбудто их и не было:

slave-skip-error = all

Часто ошибку репликации можно «поймать» если приложение на слейве пишет какиенибудь данные в базу, а вы даже об этом не догадываетесь. Например сессии посетителей или логи. В моем случае слейв нужен для более точного бэкапа … так как full-backup mySQL баз я делаю раз в сутки ночью, а сломаться может к примеру вечером … и получается что потерялся весь рабочий день — что не хорошо! Поэтому когда в очередной раз реплика остановилась я более основательно почитал доки и выбрал для себя второй вариант — тьфу…тьфу он уже работает довольно долго и проблем не было.

Хай щастить!

    • Мыслич
    • Март 31st, 2017 3:00пп

    Привет! Хочу сказать, чё-то не помогает «read_only = yes»! 🙁 Указываю эту опцию в конфиге реплики (верно?), но реплика, один фиг, даёт менять в себе данные.

  1. Трэкбэков пока нет.

Why ask?