Восстановление таблиц InnoDB базы mysql из файлов

После аварии в датацентре сервер mysql (а с ним и сайт) стал выдавать ошибки - посыпались сообщения вроде

Can't open and lock privilege tables: Table `*.host` doesn't exist

Часть таблиц (а именно - все таблицы InnoDB и некоторые MyISAM) были повреждены.

По умолчанию все базы хранятся в каталоге /var/lib/mysql. При этом для таблиц MyISAM создаются файлы в подкаталоге, имя которого совпадает с названием базы данных, а InnoDB, в отличии от MyISAM, сохраняет таблицы в виде нескольких файлов: ib_logfile0, ib_logfile1, ibdata1. А в каталоге с названием базы, сохраняются файлы с расширением *.FRM в которых находится информация о структуре таблицы.

Если таблицы MyISAM после копирования (из бэкапа) вполне успешно восстанавливаются, то с InnoDB такой финт не проходит. Для восстановления таблиц InnoDB можно использовать алгоритм:

1. Сохраняем весь каталог с данными (/var/lib/mysql) - шаг особенно важный, если бэкапы не настроены и последних резервных копий просто нет :)

2. Если сервер не работает, можно восстанавливать непосредственно на нём, а можно использовать отдельную машину (в том числе с ОС Windows - желательно, чтобы версии MySQL на сервере и на машине для восстановления совпадали. Желательно - т.е. в некоторых ситуациях восстановление может пройти успешно, несмотря на разные версии БД)

3. Создаем на сервере одноименную базу.

4. Останавливаем сервер:
/etc/init.d/mysql stop

4. Копируем каталог, взятый с “упавшего” сервера в /var/lib/mysql

5. Туда же копируем файлы innodb:
ib_logfile0
ib_logfile1
ibdata1

6. Для успешного восстановления следует задать правильный размер лог файлов. узнать его можно командой ls -l

-rw-rw—- 1 mysql mysql 5242880 Jan 15 01:32 ib_logfile0
-rw-rw—- 1 mysql mysql 5242880 Jan 15 01:32 ib_logfile1

7. Теперь запустим mysql-сервер с указанием размера лог-файла и флага “восстановления”

/usr/sbin/mysqld –-innodb_log_file_size=5242880 –-innodb_force_recovery=1

Вывод в консоль будет содержать примерно такую информацию:

InnoDB: The user has set SRV_FORCE_NO_LOG_REDO on
InnoDB: Skipping log redo
010115 01:33:36 InnoDB: Started; log sequence number 0 0
InnoDB: !!! innodb_force_recovery is set to 6 !!!
010115 01:33:36 [Note] /usr/sbin/mysqld: ready for connections.

8. проверяем, запустилась ли база.. есть ли данные в восстановленной таблице InnoDB
Если нет останавливаем сервер и запускаем с параметром –-innodb_force_recovery=2 (затем - 3,4,5,6)
Если запуск с 6-кой не помог - стандартными средствами восстановить не удастся.. возможно, помогут инструменты для InnoDB.

9. Если всё ОК - сливаем дамп

mysqldump -uroot -p database > database.sql

Где database — имя базы.

После чего, загружаем его на рабочий сервер..

Метки:

Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)

html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)

ссылка (для отправки по почте)

Добавить комментарий