MySQL: Could not parse relay log event entry

By | April 13, 2011

На днях на одном из серверов внезапно остановилась репликация. Команда SHOW SLAVE STATUS показала ошибку: Last_Error: Could not parse relay log event entry. The possible reasons are: the master’s binary log is corrupted (you can check this by running ‘mysqlbinlog’ on the binary log), the slave’s relay log is corrupted (you can check this by running ‘mysqlbinlog’ on the relay log), a network problem, or a bug in the master’s or slave’s MySQL code. If you want to check the master’s binary log or slave’s relay log, you will be able to know their names by issuing ‘SHOW SLAVE STATUS’ on this slave. Выглядит внушительно и слегка пугающе – все таки, не каждый день повреждаются файлы на жестком диске, к тому же файлы журнала репликации. Так или иначе, с ошибкой надо что-то делать и как всегда есть два варианта: простой, надежный, но муторный, связанный с ручной синхронизацией БД через импорт/экспорт, либо быстрый, но требующий внимания, т.к. связан со сбросом текущего положения “курсора” репликации на проблемном сервере.

Какое бы решение вы не приняли, оно поможет от любых ошибок репликации, связанных с повреждением журнала на подчиненном (слейв) сервере. Если бинарный журнал повредился на главном (мастер) сервере, статью дальше можно не читать. Итак, я пошел вторым путем, т.е. через сброс состояния репликации. Все, что нужно сделать – это выполнить несколько команд на проблемном сервере. Поехали:

Здесь нужно быть внимательным и записать значения полей ‘Relay_Master_Log_File’ и ‘Exec_Master_Log_Pos’, они нам пригодятся далее:

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