Сайты

Как исправить InnoDB Error page log sequence number

Предыстория. Недавно я установил скрипт mysqltuner, по рекомендациям которого был увеличен параметр query_cache_size до 128 метров. С этого все и началось. Почему-то при рестарте MySQL отказался заводиться. Даже не посмотрев в чем причина, я решил, что самый умный и просто удалил логи ib_logfile0 и ib_logfile1 (тут смайл рука-лицо). Естественно, это не помогло. Враз поумнев на сотню IQ, я все же открыл /var/log/syslog и увидел такую картину:

InnoDB: Error: page … log sequence number … is in the future!

InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files.

Руки начали трястись, а в мозгу появилось стойкое ощущение будущих страданий.

В итоге базу удалось поднять только с параметром innodb_force_recovery = 6, прописанном в /etc/mysql/my.cnf. Параллельно я общался с тех. поддержкой хостинга eurohoster, где мне буквально сказали, что сделать ничего нельзя и я своими кривыми руками уже все испортил (читать надо снизу вверх):

Некоторое время я продолжал дискуссию с Ромой, но тут подключился его старший коллега Элиас и подтвердил общую некомпетентность всего технического отдела:

В общем, я решил разобраться самостоятельно.

Первым делом пришлось сделать резервную копию всех MySQL баз данных.

mysqldump -u root -p database > database.sql

Видимо, мне дико повезло и все процессы прошли без ошибок. Потом я попытался удалить БД, но не срослось. =)

Lost connection to MySQL server during query

Тогда я остановил MySQL командой

/etc/init.d/mysql stop

перешел в каталог /var/lib/mysql и удалил все папки с этими БД оттуда, сохранив системные phpmyadmin, mysql и прочие.

Также я удалил файлы ibdata1, ib_logfile0 и ib_logfile1.

Затем в конфиге /etc/mysql/my.cnf я убрал параметр
innodb_force_recovery = 6 и снова запустил MySQL.

/etc/init.d/mysql start

Естественно, без поврежденных баз все заработало. Осталось только по новой создать их командой

mysql -u root -p

> CREATE DATABASE db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

и при необходимости добавить пользователя (у меня он остался).

> GRANT ALL PRIVILEGES ON db.* TO [email protected] IDENTIFIED BY ‘password’ WITH GRANT OPTION;

Ну и последним шагом восстановить все данные из резервных копий.

mysql -u root -p db < /tmp/dump.sql

Если при этом возникают какие-то ошибки (у меня были дублирующиеся записи в таблице сессий), то восстанавливаем с ключом -f.

mysql -u root -p -f db < /tmp/dump.sql

После этого все сайты заработали, как новые.

Вывод: работает — не трогай!

P. S. Ах да, тех. поддержке eurohoster пламенный привет.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *