Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
MYSQL-ERR-1032 Linux / DevOps

MySQL Ошибка 1032 (HY000): Key not found in record during replication slave update

Обновлено: 21.08.2026  ·  Официальная база знаний

Природа ошибки поиска ключа в строковой репликации (Row-Based Replication)

При использовании строчного формата бинарных логов (binlog_format = ROW) мастер-сервер передает на реплику точные образы изменяемых строк (Before-Image и After-Image). Когда поток применения событий (Slave SQL Thread / Applier Worker) получает оператор UPDATE или DELETE, он выполняет поиск целевой строки на реплике по ее первичному ключу. Если строка с таким первичным ключом физически отсутствует на реплике (например, была удалена вручную локальным запросом или не доехала из-за ранее пропущенной транзакции), поток репликации аварийно останавливается:

«Last_SQL_Error: Could not execute Update_rows event on table db.orders; Could not find record in 'orders', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000124, end_log_pos 54821»

Бизнес-риски

Остановка отставания реплики (Replication Lag растет бесконечно), потеря отказоустойчивости кластера высокой доступности (High Availability failover невозможен), чтение устаревших данных с read-реплик.

Сравнение форматов логирования в MySQL Replication

Формат (binlog_format)Что передается на репликуОсобенности обработки ошибок 1032
ROW (рекомендуется)Физические дампы строк до и после изменения.Строго требует идентичности всех строк на мастере и слейве.
STATEMENTОригинальный текст SQL-запроса.Не падает по 1032 при отсутствии строки, но вызывает тихую рассинхронизацию данных.
MIXEDКомбинация Statement и Row.Потенциально подвержен ошибкам при недетерминированных функциях.

Регламент восстановления и повторной синхронизации реплики

Сценарий 1: Локализация недостающей записи через утилиту mysqlbinlog

Определите, какую именно строку искал SQL-тред репликации:

# 1. Проверьте параметры сбойного события в SHOW SLAVE STATUS\G:
# Last_IO_Error / Last_SQL_Error: mysql-bin.000124, end_log_pos 54821

# 2. Декодируйте бинарный лог на мастере вокруг указанной позиции:
sudo mysqlbinlog -v -v --base64-output=DECODE-ROWS \
  --start-position=54000 --stop-position=55000 /var/lib/mysql/mysql-bin.000124

# Вы увидите точные значения полей недостающей строки в секции ### WHERE: 
# ### @1=10542 (id)
# ### @2='ivan@example.com'

Сценарий 2: Синхронизация данных с помощью Percona Toolkit (pt-table-sync)

Самый надежный способ устранения рассинхронизации без ручных вставок:

# 1. Установите Percona Toolkit:
sudo apt install -y percona-toolkit

# 2. Проверьте отличия в таблице между мастером и репликой (Dry-run):
pt-table-sync --print --sync-to-master h=slave_host,D=my_database,t=orders -u root -p

# 3. Автоматически выполните синхронизацию недостающих строк:
pt-table-sync --execute --sync-to-master h=slave_host,D=my_database,t=orders -u root -p

# 4. Запустите поток репликации на слейве:
mysql -u root -p -e "START SLAVE; SHOW SLAVE STATUS\G"

Сценарий 3: Ручная вставка фиктивной строки и пропуск транзакции (Экстренно)

Если требуется срочно возобновить репликацию:

-- 1. На реплике создайте временную фиктивную строку с ID, который ищет мастер:
INSERT INTO `orders` (`id`, `user_id`, `amount`) VALUES (10542, 1, 0.00);

-- 2. Запустите репликацию:
START SLAVE;

-- 3. Убедитесь, что реплика успешно выполнила UPDATE/DELETE и продолжила работу:
SHOW SLAVE STATUS\G

Типовые ошибки администраторов

  • Прямая запись на Slave-сервер: Выполнение запросов INSERT/UPDATE/DELETE пользователями напрямую на реплике — главная причина ошибки 1032. Реплика ВСЕГДА должна быть переведена в режим read_only = 1 и super_read_only = 1.
  • Игнорирование повторных ошибок: Пропуск ошибок «вслепую» приводит к тому, что через месяц база данных на слейве будет содержать совершенно другие данные, делая бэкапы с реплики бесполезными.
Остановилась репликация в MySQL кластере из-за ошибки 1032?
Инженеры ITSTM проведут онлайн-сравнение данных через pt-table-checksum, устранят рассинхронизацию без простоя и защитят реплики от несанкционированной записи.
Практический опыт инженера: Настройте регулярный запуск задачи pt-table-checksum по cron (например, раз в неделю). Утилита в фоновом режиме выполняет онлайн-аудит контрольных сумм всех таблиц между мастером и всеми репликами, вовремя сигнализируя о появлении малейшей рассинхронизации.

Частые вопросы (FAQ)

Как защитить реплику от случайных записей разработчиками?

Включите в конфигурации my.cnf параметры: read_only = ON и super_read_only = ON. Это запретит запись даже пользователям с правами SUPER (кроме самого потока репликации).

Что такое slave_exec_mode = IDEMPOTENT?

В режиме IDEMPOTENT реплика подавляет ошибки 1032 (Key not found) и 1062 (Duplicate key). Этот режим используется в NDB Cluster и Multi-Master, но не рекомендуется для стандартных сред.

Как безопасно пропустить сбойную транзакцию при включенном GTID?

Задайте GTID_NEXT на проблемный номер UUID:NUMBER, выполните пустую транзакцию (BEGIN; COMMIT;) и верните GTID_NEXT = 'AUTOMATIC'.

Влияет ли параметр replica_skip_errors на стабильность данных?

Использование replica_skip_errors = 1032 крайне не рекомендуется, так как оно маскирует расхождение данных, превращая реплику в поврежденную копию мастера.