Мы используем довольно простую репликацию 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