Thank you for reading this post, don't forget to subscribe!
Такая ошибка в Mysql происходит по причине того, что на реплике уже существует запись, которая пришла с мастера.
При просмотре состояния репликации:
1 |
mysql> SHOW SLAVE STATUS\G |
Вы увидите такую проблему:
1 2 |
Last_SQL_Errno: <em>1062</em> Last_SQL_Error: Error 'Duplicate entry '115846' for key 'PRIMARY'' on query. Default database: 'db'. Query: 'INSERT INTO some_table … |
Вариантов решения существует несколько.
1. Пропустить ошибку
Можно заставить Mysql пропустить эту ошибку и продолжить репликацию. Для этого нужно выполнить такой запрос на реплике:
1 |
mysql> STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; |
Такой метод стоит использовать только в исключительных ситуациях. Если проблема повторяется, это плохой подход.
1. Пропускать подобные ошибки всегда
Если ошибки возникают периодически, но это не нарушает логику приложения, то можно использовать такую настройку в файле my.cnf (на слейве):
1 |
slave-skip-errors = 1062 |
Это позволит постоянно игнорировать подобные ошибки при репликации.
3. Игнорирование проблемных таблиц
Проблемы могут быть вызваны тем, что в репликации участвуют таблицы, которые нет необходимости реплицировать. Их можно исключить используя такую настройку в my.cnf (на мастере):
1 |
replicate_wild_ignore_table = playground.% |
# Все таблицы из базы данные playground не будут участвовать в репликации
Таких инструкций может быть несколько:
1 2 |
replicate_wild_ignore_table = playground.% replicate_wild_ignore_table = data.temp_% |
# Кроме базы playground, будут также исключены все таблицы которые начинаются на "temp_" из базы data