Записки системного администратора

Ещё один блог о системном администрировании, операционных системах, СУБД, сетях, костылях-велосипедах и пр.

MySQL: Ошибка репликации - Got fatal error 1236 from master when reading data from binary log

После аварийной перезагрузки mysql-сервера, исполняющего роль master, может сломаться репликация. А на slave после выполнения show slave status\G можно лицезреть следующую ошибку:

Slave_IO_Running: No
Slave_SQL_Running: Yes
......
Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from position > file size; the first event 'mysql-bin.000034' at 988867715, the last event read from '/db/mysql/mysql-bin.000034' at 4, the last byte read from '/db/mysql/mysql-bin.000034' at 4.'

Репликация сломана.

Как можно догадаться из сообщения об ошибке, slave захотел выполнить команды из такого места бинлога, которого на master не оказалось после рестарта последнего (наверное, потому, что часть бинлога не успела записаться на диск мастера за мгновение до того, как он был перезагружен по питанию).

Смотрим позицию, до которой дошел slave:

[slave]$ echo "show slave status \G" | mysql -u root -p | grep -E "[[:space:]]Master_Log_File|Read_Master_Log_Pos"
  Master_Log_File: mysql-bin.000034
  Exec_Master_Log_Pos: 988867715

Смотрим последнюю позицию, которая реально присутствует в этом бинлоге мастера:

[master]$ mysqlbinlog /db/mysql/mysql-bin.000034 | tail -n 12
'/*!*/;
# at 988777276
#180425  8:57:41 server id 1  end_log_pos 988777362 CRC32 0x3172f95b     Query    thread_id=8036410    exec_time=0    error_code=0
SET TIMESTAMP=1524635861/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
COMMIT
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

И видим, что последняя позиция - 988777362. В то время как slave пытается исполнить позицию 988867715, которая, очевидно, дальше, чем 988777362. Вывод – надо "отмотать" slave немного назад:

[slave] mysql> stop slave;
[slave] mysql> change master to master_log_pos=988777362;
[slave] mysql> start slave;

Ну и далее show slave status\G нам говорит, что slave начал догонять master.

HTML Preview:

Коротко о себе:

Привет! Меня зовут Вадим. В этом блоге я пишу об интересующих меня вещах, о проблемах, с которыми сталкиваюсь во время работы, и о путях их решения.

Связаться со мной можно, написав письмо на адрес vadim@adminbook.click