Вопрос или проблема
Я добавил дополнительный ведомый сервер к существующей репликации MySQL. Главный сервер и старый ведомый сервер работают без проблем, но недавно добавленный сервер останавливается с следующей ошибкой:
Last_SQL_Errno: 1032
Last_SQL_Error: Не удалось выполнить событие Update_rows в таблице xxx.email_events; Не удается найти запись в ’email_events’, Код ошибки: 1032; ошибка обработчика HA_ERR_KEY_NOT_FOUND; журнал мастера события mysqld-bin.000410, end_log_pos 368808733
После ремонта он будет работать нормально в течение нескольких часов.
Вопросы
- Можно ли навсегда пропустить Last_SQL_Errno: 1032?
- Есть ли какие-либо проблемы с пропуском этой ошибки?
Вы можете найти код SQL, например, /usr/bin/mysqlbinlog -v --start-position=142743807 --stop-position=147399325 /data/mysql/data/master-bin.000010 > temp.log
Затем сравните различия между базой данных ведомого и мастера в соответствии с temp.log на конкретной позиции.
Затем обновите базу данных ведомого.
Затем пропустите эту строку с помощью mysql -e "stop slave; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; start slave;";
Для тех, у кого это единичная ошибка, вы можете попробовать пропустить элемент:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
Вы можете установить следующее в my.cnf вашего ведомого:
[mysqld]
slave-skip-errors=1032
Но, как говорится в документации:
Не используйте эту опцию, если вы полностью не понимаете, почему возникают ошибки. Одной из возможных причин этой ошибки может быть “Slave_IO_Running: Yes”, но “Slave_SQL_Running: No”, что означает, что процесс рабского ввода-вывода работает и получает данные от мастера, но не может выполнить их из-за остановившегося процесса Slave_SQL_Running. Для проактивного мониторинга репликации и оповещения об ошибке, отставании или разъединении между мастером и ведомым серверами можно использовать инструмент мониторинга, такой как Monyog.
У меня была такая же проблема, и я выяснил (по консольным журналам “show slave status\G”), что когда я изменял некоторые из моих настроек репликации (в моем случае MASTER_HOST), движок mysql сбрасывал настройку: MASTER_LOG_POS. И после того, как я изменил MASTER_LOG_POS на то, что было в дампе, импортированном на ведомого, все заработало как следует. Возможно, это не ваш случай, но надеюсь, это поможет кому-то.
Вы не можете пропустить ошибку, потому что на сервере реплики запись будет недоступна. Чтобы исправить проблему, выполните следующие шаги:
- Получите позицию binlog с помощью
SHOW SLAVE STATUS\G
на сервере реплики, затем получите соответствующий binlog файл с мастера и сохраните его в текстовый файл с помощью следующей команды:
mysqlbinlog –verbose –base64-output=decode-rows
/var/lib/mysql/mysql-bin.000728 > sample.txt
- Откройте сохраненный текстовый файл с помощью
less
и найдите позицию binlog. Извлеките весь запрос, выполнив поиск со слэшем (/
) за позицией binlog и нажав Enter.
Пример: less sample.txt
- Проверьте, есть ли в таблице столбец
ID
. На основеID
извлеките полный запросINSERT
с помощьюmysqldump
следующим образом:
mysqldump --no-create-info --single-transaction -q bodb managedaccscheme --where "Id=2264;"
Замените Id=2264
на соответствующее условие первичного ключа.
- Выполните извлеченный запрос
INSERT
на сервере реплики, следуя этим шагам:
STOP SLAVE; INSERT QUERY; START SLAVE;
Это гарантирует корректную вставку отсутствующей записи на сервере реплики.
.
Ответ или решение
Ошибка в репликации MySQL с кодом Last_SQL_Errno: 1032 указывает на проблему, связанную с несоответствием данных между сервером-мастером и сервером-репликой. Данный код ошибки означает, что во время выполнения команды обновления на сервере-реплике система не смогла найти запись в таблице, что привело к остановке процесса SQL-репликации.
Теоретический аспект
Ошибка 1032 (HA_ERR_KEY_NOT_FOUND) обусловлена отсутствием необходимой записи в таблице email_events
на сервере-реплике, которая есть в логах мастера. Репликация MySQL работает на основе двоичных логов (binlog), которые содержат изменения данных на мастере и передают их на реплики. Когда реплика получает лог, она пытается идентифицировать и применять аналогичные изменения. Если запись отсутствует на реплике, например, из-за удаления или несинхронизированных данных, это приводит к ошибке.
Пример
Предположим, что в какой-то момент запись со специфическим ID
была удалена или не добавлена на сервере-реплике. Когда мастер передает новый лог с попыткой обновить эту запись, реплика сталкивается с невозможностью найти соответствующую запись в своей базе данных и останавливает выполнение логов, чтобы избежать неконсистентности данных.
Применение
Для устранения проблемы необходимо синхронизировать данные между мастером и репликой. Вот шаги, которые помогут исправить ситуацию:
-
Определение позиции сбоя:
Выполните на реплике командуSHOW SLAVE STATUS\G
и обратите внимание наRelay_Master_Log_File
иExec_Master_Log_Pos
. Эти данные помогут найти необходимое изменение в логах мастера. -
Вывод бинарного лога:
Используйтеmysqlbinlog
для извлечения изменений из бинарного лога мастера:mysqlbinlog --verbose --base64-output=decode-rows /var/lib/mysql/mysql-bin.000410 > master_changes.txt
Затем используйте
less
для поиска позиции лога:/368808733
(как указано в сообщении об ошибке). -
Анализ и восстановление данных:
Выявите изменения, которые не удается выполнить на реплике, и убедитесь, что соответствующая запись существует на реплике. Если запись отсутствует, выполните дамп из мастера:mysqldump --no-create-info --single-transaction -q <название_базы> email_events --where "ID=<значение>"
Выполните вставку этой записи на реплике, остановив перед этим процесс репликации:
STOP SLAVE; -- Выполнить INSERT-запрос START SLAVE;
-
Настройки для предотвращения повторных ошибок:
Если проблема связана только с одной записью и не показательна для других возможных проблем с данными, вы можете пропустить проблему, используя:SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
Однако установка опции в
my.cnf
:[mysqld] slave-skip-errors=1032
не рекомендуется в долгосрочной перспективе, поскольку это может скрыть другие потенциальные проблемы в структуре данных ваших систем.
Заключение
В завершение, важно подчеркнуть, что сканирование ошибок и их пропуск могут временно решить проблему, но не устранят корневую причину. Постоянному решению поспособствует тщательный анализ и пересмотр процесса синхронизации для предотвращения несоответствий данных, а также использование мониторинговых инструментов, таких как Monyog, чтобы своевременно выявлять и устранять проблемы в репликации.