Восстановление таблиц 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 — имя базы.
После чего, загружаем его на рабочий сервер..
Метки: mysql