Гид по технологиям

Как заставить MySQL slave игнорировать ошибки с slave-skip-errors

• 4 min read • Базы данных • Обновлено 21 Nov 2025
MySQL: slave-skip-errors — пропуск ошибок репликации
MySQL: slave-skip-errors — пропуск ошибок репликации

1 Предварительная заметка

Параметр slave-skip-errors позволяет slave-приложению пропускать выполнение транзакций, которые завершаются указанными кодами ошибок. Список кодов ошибок MySQL доступен по ссылке: Server Error Codes and Messages. Однако применять этот метод нужно осмотрительно: он может привести к потере данных или рассинхронизации slave относительно master. Прежде чем использовать slave-skip-errors, попробуйте менее рискованные варианты восстановления:

  • Восстановление репликации по стандартным инструкциям (How To Repair MySQL Replication).
  • Исключение отдельных баз или таблиц из репликации на уровне slave: replicate-ignore-db или replicate-ignore-table в конфигурации slave (если для некоторых баз репликация не требуется).

Важно: slave-skip-errors — инструмент аварийного восстановления, а не замена корректной синхронизации схем и данных.

2 Использование slave-skip-errors — пошагово

Предположим, что репликация остановилась и на slave вы видите примерно такой вывод:

SHOW SLAVE STATUS \G
mysql> SHOW SLAVE STATUS \G  
************************* 1. row *************************  
               Slave_IO_State: Waiting for master to send event  
                  Master_Host: 1.2.3.4  
                  Master_User: slave_user  
                  Master_Port: 3306  
                Connect_Retry: 60  
              Master_Log_File: mysql-bin.000024  
          Read_Master_Log_Pos: 933201702  
               Relay_Log_File: mysqld-relay-bin.000113  
                Relay_Log_Pos: 63519994  
        Relay_Master_Log_File: mysql-bin.000021  
             Slave_IO_Running: Yes  
           Slave_SQL_Running: No  
              Replicate_Do_DB:  
          Replicate_Ignore_DB: mysql,information_schema,performance_schema,test  
           Replicate_Do_Table:  
       Replicate_Ignore_Table:  
      Replicate_Wild_Do_Table:  
  Replicate_Wild_Ignore_Table:  
                   Last_Errno: 1054  
                   Last_Error: Error 'Unknown column 'tx_feuserbranch_agb' in 'field list'' on query. Default database: 'dbtest'.  
Query: 'INSERT INTO fe_users (email,first_name,last_name,address,ip,city,country,telephone,fax,company,tx_feuserbranch_brancha,  
tx_feuserbranch_customernr,tx_feuserbranch_agb,username,password,name,usergroup,disable,by_invitation,tx_srfeuserregister_password,  
tstap,crdate,cruser_id,fe_cruser_id,pid) VALUES ('[email protected]','John','Doe','test','55555','test','Deutschland','49111111111',  
'','test','0','55','on','[email protected]','xxxxxxxxxxxxxx','John Doe','0','1','0','','1361359747','1361359747','0','0','33')'  
                  Skip_Counter: 0  
          Exec_Master_Log_Pos: 120460827  
              Relay_Log_Space: 3500841420  
              Until_Condition: None  
               Until_Log_File:  
                Until_Log_Pos: 0  
           Master_SSL_Allowed: Yes  
           Master_SSL_CA_File: /etc/mysql/newcerts/ca-cert.pem  
           Master_SSL_CA_Path:  
              Master_SSL_Cert: /etc/mysql/newcerts/client-cert.pem  
            Master_SSL_Cipher:  
               Master_SSL_Key: /etc/mysql/newcerts/client-key.pem  
        Seconds_Behind_Master: NULL  
Master_SSL_Verify_Server_Cert: No  
                Last_IO_Errno: 0  
                Last_IO_Error:  
               Last_SQL_Errno: 1054  
               Last_SQL_Error: Last_Error: Error 'Unknown column 'tx_feuserbranch_agb' in 'field list'' on query. Default database: 'dbtest'.  
Query: 'INSERT INTO fe_users (email,first_name,last_name,address,ip,city,country,telephone,fax,company,tx_feuserbranch_brancha,  
tx_feuserbranch_customernr,tx_feuserbranch_agb,username,password,name,usergroup,disable,by_invitation,tx_srfeuserregister_password,  
tstap,crdate,cruser_id,fe_cruser_id,pid) VALUES ('[email protected]','John','Doe','test','55555','test','Deutschland','49111111111',  
'','test','0','55','on','[email protected]','xxxxxxxxxxxxxx','John Doe','0','1','0','','1361359747','1361359747','0','0','33')'  
  Replicate_Ignore_Server_Ids:  
             Master_Server_Id: 1  
1 row in set (0.00 sec)  
   
mysql>

В поле Last_Errno видно код ошибки, который остановил репликацию — в примере это 1054 (Unknown column…). Чтобы заставить slave игнорировать такие ошибки, откройте конфигурационный файл my.cnf (в Debian/Ubuntu обычно /etc/mysql/my.cnf):

vi /etc/mysql/my.cnf

И добавьте строку:

slave-skip-errors = 1054

Пример фрагмента конфигурации (оставлен синтаксис из исходного примера):

[...]
expire_logs_days        = 10
max_binlog_size         = 100M
server-id=2
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test
slave-skip-errors = 1054
[...]

После изменения конфигурации перезапустите MySQL:

/etc/init.d/mysql restart

Войдите в MySQL и проверьте статус slave снова:

mysql -u root -p
SHOW SLAVE STATUS \G

Если всё прошло успешно, состояние Slave_SQL_Running будет Yes — репликация продолжилась, так как сервер пропускает транзакции с указанным кодом ошибки.

Чтобы игнорировать несколько кодов ошибок, перечислите их через запятую:

slave-skip-errors = 1062,1054

Список кодов ошибок MySQL: Server Error Codes and Messages.

3 Когда это не сработает и риски

  • Если отсутствуют важные столбцы или данные, пропуск транзакции приведёт к рассинхронизации и логическим ошибкам в приложении.
  • Для DDL (изменения схемы) и конфликтующих изменений пропускать ошибки опасно — изменения структуры таблиц должны синхронизироваться корректно между master и slave.
  • Если причина — сетевые или дисковые ошибки на slave, параметр ничего не исправит.

Риски:

  • Частичное отсутствие данных на slave.
  • Неконсистентные справочники и индексы.
  • Сложности в дальнейшем откате или повторной синхронизации.

Митигирующие меры:

  • Фиксируйте и проверяйте список пропущенных событий (relay_log и координаты бинарных логов).
  • После восстановления запланируйте полную проверку целостности данных и, при необходимости, пересоздайте slave корректным дампом от master.

4 Альтернативные подходы

  • replicate-ignore-db / replicate-ignore-table: исключите из репликации проблемные базы/таблицы, если репликация для них не важна.
  • Ручное исправление схемы на slave (добавить недостающий столбец), если это безопасно и известно, что изменение должно быть на обоих узлах.
  • Создать новый slave из свежего дампа master (без остановки длительного времени, если у вас настроены прокси/балансировщики).
  • Использовать pt-table-sync (Percona Toolkit) или аналог для выравнивания данных после восстановления.

5 Пошаговый SOP для аварийного восстановления (мини‑методология)

  1. Зафиксируйте текущее состояние slave: SHOW SLAVE STATUS \G и сохраните координаты master_log_file / read_master_log_pos.
  2. Откройте логи relay (relay_log) и бинарные логи master, найдите проблемную транзакцию (для аудита).
  3. Попробуйте безопасные исправления: добавить отсутствующий столбец на slave, если это совпадает с ожидаемой схемой.
  4. Если нужно срочно восстановить поток репликации и вы понимаете риск, добавьте slave-skip-errors = <код> в my.cnf и перезапустите службу.
  5. После восстановления репликации выполните сверку данных и, при необходимости, пересоздайте slave корректным дампом.
  6. Документируйте все изменения и уведомите команду разработки/QA.

6 Контрольный чеклист для DBA

  • Сохранены выводы SHOW SLAVE STATUS и бинлоги master.
  • Выполнен анализ критичности пропуска транзакции (влияет ли она на бизнес‑логику).
  • Попытка ручного исправления схемы на slave.
  • Если применено slave-skip-errors — спланирована проверка консистентности данных.
  • Создан план отката или пересоздания slave при необходимости.

7 Критерии приёмки

  • Replica снова в состоянии Slave_SQL_Running = Yes и Slave_IO_Running = Yes.
  • Отсутствуют повторяющиеся ошибки в SHOW SLAVE STATUS после применения изменения.
  • Проведена выборочная проверка данных (набор тестовых запросов/отчётов) для критичных бизнес‑таблиц.

8 Короткий словарь

  • master — основной сервер, от которого идёт репликация.
  • slave — реплика, применяющая бинарные логи master.
  • slave-skip-errors — опция mysqld для пропуска указанных кодов ошибок на slave.
  • replicate-ignore-db / replicate-ignore-table — опции для исключения базы/таблицы из репликации.

9 Ссылки

Важно: slave-skip-errors — рабочий инструмент для экстренных ситуаций. Планируйте долгосрочное исправление схем и данных, чтобы избежать повторений и обеспечения согласованности между master и slave.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро