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

Почему репликация MySQL прерывается при отсутствии строки, а затем продолжается после «START SLAVE»?

Название немного сбивает с толку, но я не могу придумать лучшего.

У меня есть простая репликация ванильного MySQL, при которой ведомое устройство иногда дает сбой с этой ошибкой: Error 'Can't find record in 'my_tbl'' on query. Default database: 'my_db'. Query: 'UPDATE my_tbl SET ... WHERE ...' (столбцы для ясности опущены).

Я предполагаю, что эта ошибка означает, что подчиненный поток sql выполнил это обновление и получил 0 rows affected. Это было не то, что ожидалось при сравнении результата 1 rows affected из журнала реле, что приводит к ошибке.

Когда эта же транзакция обновления выполняется вручную, она работает. То же самое при беге START SLAVE - он просто начинает работать и возвращается в нормальное состояние.

Для меня это вообще не имеет смысла - если все, что нужно, - это «повторить попытку», чтобы исправить это, как это вообще могло произойти? Все выполняется сериализованным образом, и больше ничего не записывается на подчиненный сервер mysql.

Может кто-нибудь дать объяснение?

Некоторые технические детали - это смешанная настройка репликации с 5.5.7-rc на 5.5.12.

Я обнаружил причину этой проблемы - событие, которое было запущено как на главном, так и на подчиненном сервере. Решение простое - alter event event_name disable on slave; Что нужно иметь в виду при создании раба с mysqldump.

Есть поданная Ошибка MySQL # 60091 относительно репликации таблиц InnoDB, которые могут соответствовать вашим условиям - взгляните на нее, проверьте, затронута ли ваша версия, и обновите ее, чтобы проверить, помогает ли это.

Другим объяснением этого может быть исполнение вне очереди, когда UPDATE my_tbl SET ... WHERE ... выполняется, условие WHERE еще не может быть выполнено ни одной строкой, поскольку оно еще не выполнено. Я не могу придумать для этого причину - об этом можно было бы спросить в списках рассылки MySQL.