Восстановление работы InnoDB
Введение: Это руководство предназначено для восстановления баз InnoDB. То есть он помогает не только запустить InnoDB сервиса, но и сохранить информацию в почти всех таблиц InnoDB, за исключением таблиц, которые на самом деле были повреждены физически во время аварии или fschk.
Проблема: MySQL сервер не поднимается или поднимается только с директивой пропуска InnoDB Симптомы: Для выяснения в чем реально проблема надо добавить строчку skip-innodb в [mysqld] секцию my.cnf конфига. Если мышцы затем начать его тогда проблемма действительно инно-дб и это заявление должно помочь это исправить. Статус mysql серверы для шагов 1-2 неважен, хоть лежит хоть работает. Установка: [-hide-]1. на mysql сервере запускаем следующий скрипт cd /var/lib/mysql предполагается ,что сдесь находятся базы мускула vi 1abcd.pl далее вставляем текст без ограничительных линий Code: 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 Если одна или две таблицы глючат можно использовать ключ –force а таблицы после поднять и бэкапа 9. Востанавливаем все сервисы и mysql access /etc/init.d/chkservd start /etc/init.d/httpd start убираем заблокированые роуты и т.д. route del IP reject[-hide-] |