Репликация ведомого останавливается с Last_SQL_Errno: 1032

Вопрос или проблема

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

Вы не можете пропустить ошибку, потому что на сервере реплики запись будет недоступна. Чтобы исправить проблему, выполните следующие шаги:

  1. Получите позицию binlog с помощью SHOW SLAVE STATUS\G на сервере реплики, затем получите соответствующий binlog файл с мастера и сохраните его в текстовый файл с помощью следующей команды:

mysqlbinlog –verbose –base64-output=decode-rows
/var/lib/mysql/mysql-bin.000728 > sample.txt

  1. Откройте сохраненный текстовый файл с помощью less и найдите позицию binlog. Извлеките весь запрос, выполнив поиск со слэшем (/) за позицией binlog и нажав Enter.

Пример: less sample.txt

  1. Проверьте, есть ли в таблице столбец ID. На основе ID извлеките полный запрос INSERT с помощью mysqldump следующим образом:
mysqldump --no-create-info --single-transaction -q bodb managedaccscheme --where "Id=2264;"

Замените Id=2264 на соответствующее условие первичного ключа.

  1. Выполните извлеченный запрос INSERT на сервере реплики, следуя этим шагам:

STOP SLAVE; INSERT QUERY; START SLAVE;

Это гарантирует корректную вставку отсутствующей записи на сервере реплики.

.

Ответ или решение

Ошибка в репликации MySQL с кодом Last_SQL_Errno: 1032 указывает на проблему, связанную с несоответствием данных между сервером-мастером и сервером-репликой. Данный код ошибки означает, что во время выполнения команды обновления на сервере-реплике система не смогла найти запись в таблице, что привело к остановке процесса SQL-репликации.

Теоретический аспект

Ошибка 1032 (HA_ERR_KEY_NOT_FOUND) обусловлена отсутствием необходимой записи в таблице email_events на сервере-реплике, которая есть в логах мастера. Репликация MySQL работает на основе двоичных логов (binlog), которые содержат изменения данных на мастере и передают их на реплики. Когда реплика получает лог, она пытается идентифицировать и применять аналогичные изменения. Если запись отсутствует на реплике, например, из-за удаления или несинхронизированных данных, это приводит к ошибке.

Пример

Предположим, что в какой-то момент запись со специфическим ID была удалена или не добавлена на сервере-реплике. Когда мастер передает новый лог с попыткой обновить эту запись, реплика сталкивается с невозможностью найти соответствующую запись в своей базе данных и останавливает выполнение логов, чтобы избежать неконсистентности данных.

Применение

Для устранения проблемы необходимо синхронизировать данные между мастером и репликой. Вот шаги, которые помогут исправить ситуацию:

  1. Определение позиции сбоя:
    Выполните на реплике команду SHOW SLAVE STATUS\G и обратите внимание на Relay_Master_Log_File и Exec_Master_Log_Pos. Эти данные помогут найти необходимое изменение в логах мастера.

  2. Вывод бинарного лога:
    Используйте mysqlbinlog для извлечения изменений из бинарного лога мастера:

    mysqlbinlog --verbose --base64-output=decode-rows /var/lib/mysql/mysql-bin.000410 > master_changes.txt

    Затем используйте less для поиска позиции лога: /368808733 (как указано в сообщении об ошибке).

  3. Анализ и восстановление данных:
    Выявите изменения, которые не удается выполнить на реплике, и убедитесь, что соответствующая запись существует на реплике. Если запись отсутствует, выполните дамп из мастера:

    mysqldump --no-create-info --single-transaction -q <название_базы> email_events --where "ID=<значение>"

    Выполните вставку этой записи на реплике, остановив перед этим процесс репликации:

    STOP SLAVE;
    -- Выполнить INSERT-запрос
    START SLAVE;
  4. Настройки для предотвращения повторных ошибок:
    Если проблема связана только с одной записью и не показательна для других возможных проблем с данными, вы можете пропустить проблему, используя:

    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;

    Однако установка опции в my.cnf:

    [mysqld]
    slave-skip-errors=1032

    не рекомендуется в долгосрочной перспективе, поскольку это может скрыть другие потенциальные проблемы в структуре данных ваших систем.

Заключение

В завершение, важно подчеркнуть, что сканирование ошибок и их пропуск могут временно решить проблему, но не устранят корневую причину. Постоянному решению поспособствует тщательный анализ и пересмотр процесса синхронизации для предотвращения несоответствий данных, а также использование мониторинговых инструментов, таких как Monyog, чтобы своевременно выявлять и устранять проблемы в репликации.

Оцените материал
Добавить комментарий

Капча загружается...