MySQL: репликация остановилась с ошибкой
Репликация останавливается при первой ошибке применения, чтобы не разойтись с основным сервером. Служба при этом работает, и без проверки состояния это остаётся незамеченным — пока данные не разойдутся окончательно.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Конфликт данных при применении
Запись, которую пытается применить подписчик, конфликтует с существующей: дубль ключа или отсутствующая строка.
-
Основной сервер недоступен
Подписчик повторяет попытки подключения. Отставание растёт, и при длительной недоступности нужные файлы журнала могут быть уже удалены.
-
Репликация не следит за состоянием
Без мониторинга остановка остаётся незамеченной. Данные расходятся, и обнаруживается это при переключении.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Полное состояние репликации с ошибкой.
mysql -e 'SHOW REPLICA STATUS\G' 2>/dev/null | head -40Записи журнала о репликации.
sudo tail -30 /var/log/mysql/error.log | grep -i -E "replica|slave"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Запись, которую пытается применить подписчик, конфликтует с существующей: дубль ключа или отсутствующая строка.
- Как проверить
-
Посмотрите состояние репликации и ошибку.
mysql -e 'SHOW REPLICA STATUS\G' 2>/dev/null | grep -E 'Last_Err|Running' | head
- Как исправить
- Разберитесь с конкретным конфликтом: пропуск транзакции допустим только когда вы точно знаете, что она безопасна.
- Почему происходит
- Подписчик повторяет попытки подключения. Отставание растёт, и при длительной недоступности нужные файлы журнала могут быть уже удалены.
- Как проверить
-
Посмотрите состояние подключения.
mysql -e 'SHOW REPLICA STATUS\G' 2>/dev/null | grep -E 'Master_Host|Slave_IO_Running|Seconds_Behind' | head
- Как исправить
- Восстановите связь. Если журнал на основном сервере уже очищен, подписчика придётся пересоздать из копии.
- Почему происходит
- Без мониторинга остановка остаётся незамеченной. Данные расходятся, и обнаруживается это при переключении.
- Как проверить
-
Проверьте состояние прямо сейчас.
mysql -e 'SHOW REPLICA STATUS\G' 2>/dev/null | grep -cE 'Running: Yes'
- Как исправить
- Добавьте проверку состояния репликации в мониторинг: это одна строка, которая экономит сутки разбора.
Пример вывода
Репликация остановлена конфликтом данных. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
mysqld[1200]: [ERROR] [MY-010584] [Repl] Replica SQL for channel '': Worker 1 failed executing transaction; Could not execute Write_rows event on table shop.orders; Duplicate entry '10241' for key 'PRIMARY'
mysqld[1200]: [ERROR] [MY-010586] [Repl] Error running query, replica SQL thread aborted.
Связанные ошибки
- MySQL: журнал двоичных изменений заполнил диск Место кончилось из-за binlog: не настроена очистка, отстала репликация, слишком большой срок хранения.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- MySQL убит из-за памяти: буферный пул больше доступной памяти MySQL падает сразу после старта или через минуты: размер innodb_buffer_pool_size превышает память машины.
- MySQL: Can't connect to local server through socket Клиент не находит unix-сокет MySQL: сервер не запущен, путь к сокету другой, каталог в /run не создан.
- MySQL: Can't open the mysql.plugin table и повреждение системных таблиц MySQL не запускается: недоступны или повреждены системные таблицы. Права на каталог данных, версия схемы, восстановление.
- MySQL: InnoDB не запускается после аварийного завершения Ошибки InnoDB при старте: повреждение страниц, несовпадение журнала, режим принудительного восстановления.
- MySQL: Too many connections База отказывает в новых подключениях: исчерпан max_connections или предел дескрипторов службы.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
Где встречается чаще всего
Источники
- Документация MySQL: устранение неполадок репликации
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено ручной вставкой конфликтующей строки на подписчике.