Первый способ
Предварительно должны
быть созданы бэкапы ibdata1,ib_logfile0 и ib_logfile1.
Также должны
быть созданы бэкапы Вашей папки с .frm файлами.
Восстановление
базы данных из имеющегося бэкапа.
Сначала перенесите
все бэкапы на другой MySQL server,восстановите данные в MySQL data
directory.
Дайте правильные права и разрешения и назначте собственника ( обычно
mysql) на
файлы базы данных.
Предварительно
определите размер Innodb logfiles выполнив команду ls -l.
Вы
должны увидеть следующее:
-rw-rw---- 1 mysql mysql 5242880 Jun 25
11:30 ib_logfile0
-rw-rw---- 1 mysql mysql 5242880 Jun 25 11:30
ib_logfile1
Запускаем MySQL в режиме восстановления.
Для
некоторых Unix систем предварительно необходимо дать команду su mysql.
Запускаем
MySQL в режиме восстановления, указав размер логфайла и
innodb_force_recovery как параметр.
/usr/sbin/mysqld --innodb_log_file_size=5242880 --innodb_force_recovery=6
Если все хорошо Вы должны увидеть следующее:
InnoDB:
The user has set SRV_FORCE_NO_LOG_REDO on
InnoDB: Skipping log redo
070625
11:59:36 InnoDB: Started; log sequence number 0 0
InnoDB: !!!
innodb_force_recovery is set to 6 !!!
070625 11:59:36 [Note]
/usr/sbin/mysqld: ready for connections.
Version: '5.0.18' socket:
'/var/lib/mysql/mysql.sock' port: 3306 SUSE MySQL
Далее дампим поднявшуюся базу данных:
mysqldump
-u root -p database > database.sql
Если Вы получите следующее сообщение, это значит, что файлы
системного журнала Innodb повреждены:
Got error: 1146: Table
'database.table' doesn't exist when using LOCK TABLES
Чтобы решить проблему с хранением ib_logfile0 файла нужна актуальная резервная копия, поэтому восстановите все файлы от старшей резервной копии. Это не безотказное решение, но ценная попытка.
Восстановите Ваши данные:
mysql -u root
-p database < database.sql
Второй способ
Сначала переведем InnoDB в режим восстановления, с игнорированием всех UPDATEs и INSERTs:
Добавляем строку в /etc/my.cnf:
innodb_force_recovery
= 2
Перезапускаем базу:
/usr/local/bin/mysqld_safe
&
Если MySQL не перезапускается, увеличте число innodb_force_recovery
до 8.
Сохраните все данные во временном файле
alldb.sql :
mysqldump --force --compress --triggers
--routines --create-options -uUSERNAME -pPASSWORD --all-databases >
/usr/alldb.sql
Выключите MySQLd:
mysqladmin -uUSERNAME
-pPASSWORD shutdown
Удалите директорию базы данных, предварительно
убедившись, что удаляете то, что надо.
Например:
rm
-fdr /usr/local/var
Пересоздайте базу данных и проинсталируйте базовые
таблицы MySQL:
mkdir /usr/local/var
chown -R
mysql:mysql /usr/local/var
/usr/local/bin/mysql_install_db
chown
-R mysql:mysql /usr/local/var
Удалите innodb_force_recovery из файла /etc/my.cnf и
перезапустите базу данных:
/usr/local/bin/mysqld_safe
&
Импортируйте все данные из временного файла alldb.sql:
mysql
-uroot --compress < /usr/alldb.sql
И последнее - перепримените привилегии ( т.к. были
обновлены таблицы MySQL)
/usr/local/bin/mysqladmin
-uroot flush-privileges