Остановка / запуск репликации 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 - и затем успешно перезапустите ведомое устройство? Если ошибка никогда не устраняется, позиция в журналах репликации останется прежней, и вы будете сталкиваться с этой ошибкой каждый раз, пока не будут предприняты соответствующие шаги.