MySQL: #126 - неверный ключевой файл для таблицы
Я получил следующую ошибку из запроса MySQL.
#126 - Incorrect key file for table
Я даже не объявил ключ для этой таблицы, но у меня есть индексы. Кто-нибудь знает в чем может быть проблема?
14 ответов
Каждый раз, когда это случалось, это был полный диск в моем опыте.
РЕДАКТИРОВАТЬ
Стоит также отметить, что это может быть вызвано полным виртуальным диском при выполнении таких действий, как изменение большой таблицы, если у вас настроен виртуальный диск. Вы можете временно закомментировать строку ramdisk, чтобы разрешить такие операции, если вы не можете увеличить ее размер.
Прежде всего, вы должны знать, что ключи и индексы являются синонимами в MySQL. Если вы посмотрите документацию о синтаксисе CREATE TABLE, вы можете прочитать:
KEY
обычно является синонимомINDEX
, Ключевой атрибутPRIMARY KEY
также может быть указан как простоKEY
когда дано в определении столбца. Это было реализовано для совместимости с другими системами баз данных.
Теперь ошибка, которую вы получаете, может быть вызвана двумя причинами:
- Проблемы с диском на сервере MySQL
- Поврежденные ключи / таблицы
В первом случае вы увидите, что добавление ограничения к вашему запросу может временно решить проблему. Если это делает это для вас, у вас, вероятно, есть tmp
папка, которая слишком мала для размера запросов, которые вы пытаетесь выполнить. Вы можете решить или сделать tmp
больше или сделать ваши запросы меньше!;)
Иногда, tmp
достаточно велик, но все еще заполнен, вам нужно выполнить некоторую ручную очистку в этих ситуациях.
Во втором случае существуют реальные проблемы с данными MySQL. Если вы можете легко вставить данные заново, я бы посоветовал просто удалить / заново создать таблицу и заново вставить данные. Если вы не можете попробовать восстановить стол на месте с помощью таблицы РЕМОНТ. Это, как правило, длительный процесс, который вполне может дать сбой.
Посмотрите на полное сообщение об ошибке, которое вы получите:
Неверный ключевой файл для таблицы "FILEPATH.MYI"; попробуй починить
В сообщении упоминается, что вы можете попытаться восстановить его. Кроме того, если вы посмотрите на фактическую FILEPATH, которую вы получите, вы можете узнать больше:
если это что-то вроде
/tmp/#sql_ab34_23f
это означает, что MySQL необходимо создать временную таблицу из-за размера запроса. Он хранит его в /tmp, и что в вашей / tmp недостаточно места для этой временной таблицы.если вместо этого оно содержит имя фактической таблицы, это означает, что эта таблица, скорее всего, повреждена, и вам следует ее исправить.
Если вы обнаружите, что ваша проблема связана с размером /tmp, просто прочитайте этот ответ на аналогичный вопрос для исправления: MySQL, ошибка 126: неверный файл ключа для таблицы.
Следование этим инструкциям позволило мне воссоздать каталог tmp и устранить проблему:
Показать все файловые системы и их использование диска в удобочитаемой форме:
df -h
Найдите процессы, в которых открыты файлы /tmp
sudo lsof /tmp/**/*
Тогда размонтировать /tmp
а также /var/tmp
:
umount -l /tmp
umount -l /var/tmp
Затем удалите поврежденный файл раздела:
rm -fv /usr/tmpDSK
Затем создайте хороший новый:
/scripts/securetmp
Обратите внимание, что, отредактировав Perl-скрипт securetmp, вы можете вручную установить размер каталога tmp, однако, просто запустив сценарий, вы увеличили размер каталога tmp на нашем сервере примерно с 450 МБ до 4,0 ГБ.
Ошибка № 126 обычно возникает, когда вы получили поврежденную таблицу. Лучший способ решить эту проблему - выполнить ремонт. Эта статья может помочь:
Я получил эту ошибку, когда я установил ft_min_word_len = 2
в my.cnf
, что уменьшает минимальную длину слова в полнотекстовом индексе до 2, по умолчанию 4.
Ремонт стола устранил проблему.
Я знаю, что это старая тема, но ни одно из упомянутых решений не помогло мне. Я сделал что-то еще, что сработало:
Вам нужно:
- остановите службу MySQL:
- Откройте mysql\data
- Удалите и ib_logfile0, и ib_logfile1.
- Перезапустите сервис
Идти к /etc/my.cnf
и закомментировать tmpfs
#tmpdir=/var/tmpfs
Это решает проблему.
Я выполнил команду, предложенную в другом ответе, и, хотя каталог был маленьким, он был пустым, поэтому проблема не была в объеме.
/var/tmp$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vzfs 60G 51G 9.5G 85% /
none 1.5G 4.0K 1.5G 1% /dev
tmpfs 200M 0 200M 0% /var/tmpfs
/var/tmpfs$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vzfs 60G 51G 9.5G 85% /
none 1.5G 4.0K 1.5G 1% /dev
tmpfs 200M 0 200M 0% /var/tmpfs
Попробуйте использовать ограничение в вашем запросе. Это из-за полного диска, как сказал @Monsters X.
Я также столкнулся с этой проблемой и решил по лимиту в запросе, потому что там были тысячи записей. Сейчас работает хорошо:)
Теперь другие ответы решили это для меня. Оказывается, переименование столбца и индекса в том же запросе вызвало ошибку.
Не работает:
-- rename column and rename index
ALTER TABLE `client_types`
CHANGE `template_path` `path` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
DROP INDEX client_types_template_path_unique,
ADD UNIQUE INDEX `client_types_path_unique` (`path` ASC);
Работы (2 высказывания):
-- rename column
ALTER TABLE `client_types`
CHANGE `template_path` `path` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
-- rename index
ALTER TABLE `client_types`
DROP INDEX client_types_template_path_unique,
ADD UNIQUE INDEX `client_types_path_unique` (`path` ASC);
Это было на MariaDB 10.0.20. Не было ошибок с тем же запросом на MySQL 5.5.48.
Я исправил эту проблему с:
ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;
Май помогает
Пришел сюда в поисках - "#1034 - Неверный ключевой файл для таблицы test; попробуйте исправить"
Это вызвано добавлением кодировки в индексированное Enum (может быть таким же, как и в других полях) с Mysql 8.0.21.
CREATE TABLE `test` (
`enumVal` ENUM( 'val1' ) NOT NULL
) ENGINE = MYISAM;
ALTER TABLE `test` ADD INDEX ( `enumVal` );
ALTER TABLE `test` CHANGE `enumVal` `enumVal` ENUM( 'val1') CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;
Использование решения - отбросить индекс перед изменением.
ALTER TABLE `test` ADD INDEX ( `enumVal` );
Моя проблема возникла из-за неправильного запроса. Я ссылался на таблицу ОТ, на которую не ссылались в SELECT.
пример:
SELECT t.*,s.ticket_status as `ticket_status`
FROM tickets_new t, ticket_status s, users u
, users u
это то, что вызывало проблему для меня. Удаление, которое решило проблему.
Для справки это было в среде разработчиков CodeIgniter.
Попробуйте выполнить команду восстановления для каждой из таблиц, участвующих в запросе.
Используйте администратора MySQL, зайдите в Каталог -> Выберите каталог -> Выберите таблицу -> Нажмите кнопку Обслуживание -> Восстановить -> Использовать FRM.
mysql> set global sql_slave_skip_counter=1; start slave; show slave status\G
Полученная ошибка существует:
Error 'Table './openx/f_scraper_banner_details' is marked as crashed and should be repaired' on query. Default database: 'openx'. Query: 'INSERT INTO f_scraper_banner_details(job_details_id, ad_id, client_id, zone_id, affiliateid, comments, pct_to_report, publisher_currency, sanity_check_enabled, status, error_code, report_date) VALUES (10274859, 321264, 0, 31926, 0, '', -1, 'USD', 1, 'FAILURE', 'INACTIVE_BANNER', '2016-06-28 04:00:00')'
mysql> таблица восстановления f_scraper_banner_details;
Это сработало для меня
Я получил это сообщение при записи в таблицу после уменьшения ft_min_word_len (минимальная длина слова для полного текста). Чтобы решить эту проблему, заново создайте индекс, исправив таблицу.
Mysqlcheck -r -f -uroot -p --use_frm имя_бд
обычно добьется цели