Как мне починить таблицу InnoDB? - PullRequest
33 голосов
/ 22 октября 2008

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

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

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

Ответы [ 6 ]

26 голосов
/ 22 октября 2008

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

20 голосов
/ 24 июля 2010

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

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

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

5 голосов
/ 07 мая 2011

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

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

Моя проблема заключалась в следующем: чтение некоторых конкретных строк из таблицы (назовем эту таблицу 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.

Удачи!

4 голосов
/ 20 декабря 2011

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

0 голосов
/ 27 сентября 2015

Шаг 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.

0 голосов
/ 18 марта 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...