Восстановление баз mysql из бинарных логов | FreeBSD, MYSQL

Грохнул по нечаяности базу (говорили мне не используй phpmyadmin делай все руками) :)
Надо восстанавливать. В бэкапе – неверно настроенная кодировка – следовательно в таблицах – знаки вопроса вместо букв. Хорошо что бинарный лог не отключен, и имеется полный набор логов.

Для работы с бинарными логами нам понадобится утилита mysqlbinlog. Формат команды такой:

mysqlbinlog -s -D -d mydatabase -t /var/db/mysq-bk/mysql-bin.000032 > /home/recover.sql

-s – подавляет служебную информацию
-D – запрещает писать в бинарный лог – чтобы процесс не зацикливался
-d database – целевая база – если мы хотим вытащить из лога только то что относится к восстанавливаемой базе
-t – по идее указывает начальный файл бинарного лога и говорит продолжать обработку последующих логов. У меня эта фича не сработала и мне пришлось строить исходный sql файл последовательно перебирая все логи:

mysqlbinlog -s -D -d base -t /var/db/mysq-bk/mysql-bin.000001 > /home/recover.sql
mysqlbinlog -s -D -d base -t /var/db/mysq-bk/mysql-bin.000002 >> /home/recover.sql
...
mysqlbinlog -s -D -d base -t /var/db/mysq-bk/mysql-bin.0000XX >> /home/recover.sql

По идее есть возможность указать начальную и конечную временные метки с которой надо отбирать запросы – у меня не сработало – может руки кривые, но можно отследить последние манипляции с базой по дате создания файлов бинлогов и последние не включать в целевой файл (у нас в примере – recover.sql) а сделать ещё один файлик – recover2.sql и после заливать их в базу по одному:

mysq>use base
mysql>source /home/recover.sql;
mysq>source /home/recover.sql;

Ну и просмотреть файлы на предмет инструкций типа drop database – при наличии – удалить.

Что-то все равно может побиться – правильно настраивайте сервер с самого начала – кодировки, дефолтные, сессии, колейшн таблиц и т.д. – иначе можно получить часть не читаемых данных (у меня побились комментарии в jComments на джумле) благо проект полумертвый.