Назад | Перейти на главную страницу

остановка / запуск репликации 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#c200483

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


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

У нас аналогичная настройка и запуск резервного копирования с помощью mysqldump, без остановки репликации.

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

У нас это работает.

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

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

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

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

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

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

slave-skip-errors=1062

Видеть: http://dev.mysql.com/doc/refman/5.0/en/replication-options-slave.html