Как заставить MySQL slave игнорировать ошибки с 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 \Gmysql> 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 для аварийного восстановления (мини‑методология)
- Зафиксируйте текущее состояние slave: SHOW SLAVE STATUS \G и сохраните координаты master_log_file / read_master_log_pos.
- Откройте логи relay (relay_log) и бинарные логи master, найдите проблемную транзакцию (для аудита).
- Попробуйте безопасные исправления: добавить отсутствующий столбец на slave, если это совпадает с ожидаемой схемой.
- Если нужно срочно восстановить поток репликации и вы понимаете риск, добавьте slave-skip-errors = <код> в my.cnf и перезапустите службу.
- После восстановления репликации выполните сверку данных и, при необходимости, пересоздайте slave корректным дампом.
- Документируйте все изменения и уведомите команду разработки/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 Ссылки
- MySQL: http://www.mysql.com/
- MySQL Error Codes and Messages: http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html
- slave-skip-errors: http://dev.mysql.com/doc/refman/5.0/en/replication-options-slave.html#option_mysqld_slave-skip-errors
Важно: slave-skip-errors — рабочий инструмент для экстренных ситуаций. Планируйте долгосрочное исправление схем и данных, чтобы избежать повторений и обеспечения согласованности между master и slave.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента