Остановка / запуск репликации mysql приводит к дублированию строк

Мы используем довольно простую MASTER->SLAVE MySQL репликацию на основе запросов.

Каждую полночь скрипт cron на ведомом устройстве останавливает репликацию SQL_THREAD, выполняет резервное копирование баз данных ведомых устройств с помощью mysqldump, а затем перезапускает репликацию SQL_THREAD.

Однако после перезапуска репликации он немедленно останавливается с этим ошибочным выводом в SHOW SLAVE STATUS\G

Last_Errno: 1062
Last_Error: Error 'Duplicate entry '54149' for key 1' on query. Default database: 'dbname'. Query: 'insert into emails (emailsubject,emailmessage,html) values (blah','blah', false);'

Кажется, проблема в том, что журнал репликации на ведомом устройстве воспроизводит операторы, которые он уже обработал.

Отслеживатель ошибок MySQL, похоже, согласен со мной: http://bugs.mysql.com/bug.php?id=38205

Поскольку репликация кажется такой простой и стандартной процедурой, мой вопрос: как нам обойти репликацию, пытаясь воспроизвести операторы?


Приложение: я хотел использовать теги 'start-stop' и 'replaying' и 'Statement' для создания этого поста, но моя репутация недостаточно высока (кажется глупой?)

5 ответов

Если вам нужно остановить репликацию для запуска дампа, mysqldump может получить глобальную блокировку чтения с помощью --lock-all-tables вариант.

У нас есть похожая настройка и мы запускаем резервные копии, используя mysqldump, без остановки репликации.

mysqldump --host=$HOST -u $USER --password=$PASSWORD --max_allowed_packet=512M --port=3306 --single-transaction --skip-add-locks --quick --master-data=2

Это работает для нас.

Поток ошибок, на который вы ссылались, похоже, указывает на то, что проблема не повлияет на таблицы InnoDB, и был исправлен по состоянию на 5.1.35. Я правильно читаю?

Какой тип таблицы вы используете, и какой выпуск MySQL? Кроме того, вы используете транзакции?

Надеюсь это поможет!

Вы можете настроить MySQL так, чтобы репликация продолжалась после этой конкретной ошибки:

slave-skip-errors=1062

См. http://dev.mysql.com/doc/refman/5.0/en/replication-options-slave.html

Глупый вопрос, но вы "адресуете" ошибку каждый раз, когда видите ее - например, установив sql_slave_skip_counter = 1 - и затем успешно перезапустите ведомое устройство? Если ошибка никогда не устраняется, позиция в журналах репликации останется прежней, и вы будете сталкиваться с этой ошибкой каждый раз, пока не будут предприняты соответствующие шаги.

Другие вопросы по тегам