Подтвердить что ты не робот

Как восстановить таблицу InnoDB?

Мы (по-видимому) плохо выполнили наш движок базы данных Solaris MySQL вчера вечером. По крайней мере, некоторые из таблиц InnoDB повреждены, с ошибками временной ошибки в журнале транзакций и конкретной ошибкой об поврежденном индексе.

Мы знаем о инструментах, доступных для ремонта таблицы MyISAM, но ничего не можем найти для InnoDB.

Боковое примечание: попытка оптимизации таблицы (в попытке восстановить поврежденный индекс) приводит к сбою сервера базы данных.

4b9b3361

Ответ 1

Прежде всего остановить сервер и отобразить диск. Нет смысла делать только один выстрел. Затем посмотрите здесь.

Ответ 2

остановить приложение... или остановить ведомый, чтобы новые строки не добавлялись

create table <new table> like <old table>;
insert <new table> select * from <old table>;
truncate table  <old table>;
insert <old table> select * from <new table>;

перезапустите сервер или подчиненный

Ответ 3

Следующее решение было вдохновлено кончиком Сандро выше.

Предупреждение: пока он работал у меня, но я не могу сказать, будет ли он работать для вас.

Моя проблема заключалась в следующем: чтение некоторых конкретных строк из таблицы (позвоните в эту таблицу broken) приведет к сбою MySQL. Даже SELECT COUNT(*) FROM broken убьет его. Надеюсь, у вас есть PRIMARY KEY в этой таблице (в следующем примере это id).

  • Убедитесь, что у вас есть резервная копия или моментальный снимок сломанного сервера MySQL (на всякий случай вы хотите вернуться к шагу 1 и попробовать что-то еще!)
  • CREATE TABLE broken_repair LIKE broken;
  • INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
  • Повторите шаг 3 до тех пор, пока он не сработает БД (вы можете использовать LIMIT 100000, а затем использовать более низкие значения, пока с помощью LIMIT 1 не сработает БД).
  • Посмотрите, есть ли у вас все (вы можете сравнить SELECT MAX(id) FROM broken с количеством строк в broken_repair).
  • На данный момент у меня, видимо, были все мои строки (кроме тех, которые, вероятно, были ужасно усечены InnoDB). Если вы пропустите несколько строк, вы можете попробовать добавить OFFSET в LIMIT.

Удачи!

Ответ 5

Шаг 1.

Остановить сервер MySQL

Шаг 2.

добавьте эту строку в my.cnf(в окнах она называется my.ini)

set-variable=innodb_force_recovery=6

Шаг 3.

удалить ib_logfile0 и ib_logfile1

Шаг 4.

Запустить сервер MySQL

Шаг 5.

Запустите эту команду:

mysqlcheck --database db_name table_name -uroot -p

После того, как вы успешно зафиксировали разбитую таблицу innodb, не забудьте удалить # set-variable = innodb_force_recovery = 6 из my.cnf, а затем снова перезапустить сервер MySQL.

Ответ 6

См. эту статью: http://www.unilogica.com/mysql-innodb-recovery/ (Это на португальском языке)

Объясняется, как использовать innodb_force_recovery и innodb_file_per_table. Я обнаружил это после необходимости восстановления разбитой базы данных с помощью одного ibdata1.

Используя innodb_file_per_table, все таблицы в InnoDB создадут отдельный файл таблицы, например MyISAM.