Ответ 1
Прежде всего остановить сервер и отобразить диск. Нет смысла делать только один выстрел. Затем посмотрите здесь.
Мы (по-видимому) плохо выполнили наш движок базы данных 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
).
CREATE TABLE broken_repair LIKE broken;
INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
LIMIT 100000
, а затем использовать более низкие значения, пока с помощью LIMIT 1
не сработает БД).SELECT MAX(id) FROM broken
с количеством строк в broken_repair
).OFFSET
в LIMIT
.Удачи!
Вот решение, предоставленное MySQL: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
Шаг 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.
См. эту статью: http://www.unilogica.com/mysql-innodb-recovery/ (Это на португальском языке)
Объясняется, как использовать innodb_force_recovery и innodb_file_per_table. Я обнаружил это после необходимости восстановления разбитой базы данных с помощью одного ibdata1.
Используя innodb_file_per_table, все таблицы в InnoDB создадут отдельный файл таблицы, например MyISAM.