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 обычно возникает, когда вы получили поврежденную таблицу. Лучший способ решить эту проблему - выполнить ремонт. Эта статья может помочь:

http://dev.mysql.com/doc/refman/5.0/en/repair-table.html

Я получил эту ошибку, когда я установил ft_min_word_len = 2 в my.cnf, что уменьшает минимальную длину слова в полнотекстовом индексе до 2, по умолчанию 4.

Ремонт стола устранил проблему.

Я знаю, что это старая тема, но ни одно из упомянутых решений не помогло мне. Я сделал что-то еще, что сработало:

Вам нужно:

  1. остановите службу MySQL:
  2. Откройте mysql\data
  3. Удалите и ib_logfile0, и ib_logfile1.
  4. Перезапустите сервис

Идти к /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
repair table myschema.mytable;

Попробуйте использовать ограничение в вашем запросе. Это из-за полного диска, как сказал @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 имя_бд

обычно добьется цели

Другие вопросы по тегам