ГлавнаяРегистрацияВходВ закладки

Главная » Статьи » CentOS » MySQL
Восстановление работы InnoDB
Автор: admin  Раздел: MySQL
Введение: Это руководство предназначено для восстановления баз 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-]
Просмотров: 3775
Дата: 2011-07-13 16:24:45
Комментариев: 0
Источник: