Название немного сбивает с толку, но я не могу придумать лучшего.
У меня есть простая репликация ванильного 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.