Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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>;

перезагрузите свой сервер или ведомое устройство

Следующее решение было вдохновлено приведенным выше советом Сандро.

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

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

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

Удачи вам!

Вот решение, предоставленное MySQL:http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html

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

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

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

Шаг 1.

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

Шаг 2.

добавьте эту строку в my.cnf (в Windows она называется 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top