Введение: Эта инструкция написана для востановления InnoDb баз. Т.е. она помогает не только запустить InnoDb сервис, но и сохранить информацию почти во всех InnoDB таблицах, исключая лишь таблицы которые собственно были повреждены физически во время крэша или fschk.

Проблема: не поднимается MySQL сервер, или поднимается только с директивой
skip-innodb

Симптомы: Для выяснения в чем реально проблема надо добавить строчку

skip-innodb

в [mysqld] секцию my.cnf конфига. Если мускул после этого стартанул то проблемма действительно с инно-дб и эта инструкция должна помочь ее исправить.


Статус mysql сервера для шагов 1-2 неважен, хоть лежит хоть работает.

1. на mysql сервере запускаем следующий скрипт

cd /var/lib/mysql

предполагается что сдесь находятся базы мускула

vi 1abcd.pl

далее вставляем текст без ограничительных линий

use strict;
open (IN, "find . -name *.frm|") || die "Cannot oopen pipeline: $!";
open (DUMPS,">dumps.sh");
open (FRM, ">frm_remover.sh");
while (<IN>) {
 if ($_ =~ m|\./([^/]+)/([^/\.]+)\.frm|) {
    unless (-e "./$1/$2.MYI") {
      print FRM "zip -u /var/lib/mysql/frm_files_backup.zip ./$1/$2.frm;\n";
      print FRM "rm -f ./$1/$2.frm;\n";
      print DUMPS "echo 'use $1;' >> the_dump.sql\n";
      print DUMPS "mysqldump --add-drop-table -Q --disable-keys --add-locks --databases $1 --tables $2 >> the_dump.sql\n";
    }
 }
}
close FRM;
close DUMPS;
close IN;

И запускаем скрипт на выполнение.

perl 1abcd.pl

2. результатом работы программы станут 2 батничка, меняим им пермишены

chmod 700 frm_remover.sh
chmod 700 dumps.sh

3. На этом шаге чуть позже понадобиться обеспечить работу mysql его таким образом чтобы никакой другой юзер к нему доступа не имел

3.1 Поднимаем мускул с битым innodb

3.1.1 муваем файлы транзакций в безопасное место

cd /var/lib/mysql
mkdir ../backup_innodb
mv ib_logfile* ../backup_innodb/

3.1.2 Далее пробуем поднять innodb в режиме востановления после краша Для этого убираем строчку

skip-innodb

с [mysqld] секции my.cnf конфига (обычно конфиг лежит /etc/my.cnf но иногда /etc/mysql/my.cnf)

и добавляем в эту-же секцию такую строчку

set-variable=innodb_force_recovery=6

пока рестартовать мускул не обязательно

3.2 Теперь надо заблокировать мускул чтобы никто не доступался к нему

– Если мскул “локальный” !!!!!!!!!!!!!!! тогда валим апач и убиваем eximstats процесс. Полезно так же положить chkservd сервис чтобы он не поднял вышеописанные сервисы, итак

/etc/init.d/chkservd stop
/etc/init.d/httpd stop

и киляем эксимстатс (если есть)

– Если мускул “удаленный” !!!!!!!!!!!!!

тогда на сервере мускула надо заблокировать ip аддреса удаленных хостов

route add IP_address reject

посмотреть список хостов которые хотят открыть коннекты можно используя и смотреть на коннекты на порт 3306

netstat -n |grep 3306

4. Теперь просто перезапускаем мускул и убеждаемся что он работает

/etc/init.d/mysql restart

5. если в пункте 3 не было допущено ошибок то следующая команда должна отработать без ошибок

cd /var/lib/mysql
./dumps.sh

Если ошибок не было тогда следующий шаг, если что-то пошло не так – надо разбираться. Рекомендую посмотреть файлик the_dump.sql . Он должен быть большим и реально содержать дампы иннодб таблиц

6. Удаляем .frm файлики innodb баз

cd /var/lib/mysql
./frm_remover.sh

Этот шаг грохнет все таблицы innodb (заголовки), полный их бэкап будет в файле

/var/lib/mysql/frm_files_backup.zip

7. Дальше останавливаем mysql

/etc/init.d/mysql stop

После этого

cd /var/lib/mysql
mv ibdata* ../backup_innodb/
rm -f ib_logfile*

Коментируем строчку которую недавно добавили (или удаляем)

set-variable=innodb_force_recovery=6

И просто стартуем mysql Теперь он поднят и работают все сервисы

/etc/init.d/mysql start

8. Ресторим innodb таблицы

mysql <the_dump.sql

Если одна или две таблицы глючат можно использовать ключ –force а таблицы после поднять и бэкапа

9. Востанавливаем все сервисы и mysql access

/etc/init.d/chkservd start
/etc/init.d/httpd start

убираем заблокированые роуты и т.д.

route del IP reject