Введение: Эта инструкция написана для востановления 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 |