Восстановление данных MySQL из InnoDB

База данных MySQL на InnoDB внезапно перестала запускаться? Не спешите паниковать. В этой статье мы собрали эффективные стратегии и практические инструкции, которые помогут вам восстановить доступ к критически важной информации. Узнайте, как использовать встроенные механизмы MySQL и сторонние утилиты для успешного "воскрешения" ваших данных даже в самых сложных случаях.

Первый способ

Предварительно должны быть созданы бэкапы 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
    /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

Запускаем MySQL в режиме восстановления.

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

su mysql

Запускаем MySQL в режиме восстановления, указав размер логфайла и innodb_force_recovery как параметр.