Если в настройках MySQL сервера включить опцию log-bin и ещё несколько сопровождающих, то СУБД начнёт вести бинарные логи, в которые будет записываться информация о всех изменениях данных в БД. Проще говоря, эти логи будут содержать все запросы которые добавляли, удаляли или обновляли данные во всех БД (или можно настроить логировать только определённые БД).
Данные логи используются в основном для репликации, когда мастер-сервер ведёт бинарный лог, а слейв-сервера обновляют свои данные читая его.
Однако, данные логи могут служить для восстановления данных за непродолжительный период времени, в зависимости от того за какой период в конфигах MySQL указано хранить бинарные логи. Это бывает очень полезно если у вас есть бекап сделанный ночью и необходимо дополнить его данными за время от окончания бекапа до момента когда случилась беда с базой.
О том как извлечь из них данные и пойдёт речь в данной статье.
Хоть формат бинлогов нечитаем, можно воспользоваться утилитой mysqlbinlog для восстановления данных или преобразования бинарных файлов логов в SQL формат.
Имея один файл бинлогов, можно использовать для восстановления следующую команду:
1 |
mysqlbinlog /var/lib/mysql-bin.000016 | mysql –uroot –pReset123 |
Если же файлов несколько, можно запустить их в отдельных соединениях к базе:
1 2 |
mysqlbinlog mysql_bin.000001 | mysql -u root -ppassword database_name mysqlbinlog mysql_bin.000002 | mysql -u root -ppassword database_name |
или:
1 |
mysqlbinlog mysql_bin.000001 mysql_bin.000002 | mysql -u root -ppassword database_name |
Последний способ предпочтительней, так как убережёт вас от ситуации, когда в конце одного файла имеется только часть запроса, а вторая половина находится в следующем файле.
Извлечь содержимое в .sql файл:
1 |
mysqlbinlog /var/lib/mysql-bin.000016 > /logs/allbinlog.sql |
Дополнить файл allbinlof.sql содержимым другого бинлога:
1 |
mysqlbinlog /var/lib/mysql-bin.000017 >> /logs/allbinlog.sql |
Если использовать опцию -v, то .sql файл будет иметь более удобочитаемое содержание.
Так же, можно указать период времени за который необходимо извлечь записи:
1 2 3 |
mysqlbinlog --start-datetime="2005-04-20 10:01:00" \ --stop-datetime="2005-04-20 9:59:59" mysql_bin.000001 \ | mysql -u root -ppassword database_name |
Или использовать позиции:
1 2 3 |
mysqlbinlog --start-position=368315 \ --stop-position=368312 mysql_bin.000001 \ | mysql -u root -ppassword database_name |
Дополнительную инфу можно получить из встроенной справки:
1 |
mysqlbinlog --help |
Полезные ссылки:
- How to restore data from binary log
- Point-in-Time (Incremental) Recovery Using the Binary Log
- mysqlbinlog — Utility for Processing Binary Log Files
- mysqlbinlog Row Event Display