Как исправить ошибку MySQL "Неверный файл ключа", когда не удается восстановить таблицу?

Я пытаюсь выполнить довольно большой запрос, который должен выполняться ночью для заполнения таблицы. Я получаю сообщение об ошибке Incorrect key file for table '/var/tmp/#sql_201e_0.MYI'; try to repair it но механизм хранения, который я использую (по умолчанию, я полагаю?) не поддерживает восстановление таблиц.

Как я могу это исправить, чтобы я мог выполнить запрос?

12 ответов

Решение

Механизм хранения (MyISAM) поддерживает ремонтный стол. Вы должны быть в состоянии отремонтировать его.

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

Если у вас есть другие системы (например, непроизводственные с теми же версиями программного обеспечения и схемой) с идентичной таблицей, то вы можете исправить это с помощью некоторого хакерского копирования (копирование файлов MYI с последующим восстановлением).

По сути, хитрость заключается в том, чтобы в первую очередь избегать получения сломанных таблиц. Это означает, что вы всегда должны аккуратно выключать вашу БД, никогда не вылетать и не иметь проблем с оборудованием или питанием. На практике это маловероятно, поэтому, если долговечность имеет значение, вы можете рассмотреть вопрос о более надежном механизме хранения данных при сбоях.

Вы должны изменить местоположение временной папки MySQL, которая в большинстве случаев называется '/tmp', на место с большим дисковым пространством. Измените его в конфигурационном файле MySQL.

В основном на вашем сервере не хватает места на диске, где находится / tmp.

Вам нужно будет запустить эту команду из командной строки MySQL:

REPAIR TABLE tbl_name USE_FRM;

Из документации MySQL по команде восстановления:

Параметр USE_FRM доступен для использования, если отсутствует файл индекса.MYI или поврежден его заголовок. Эта опция говорит MySQL не доверять информации в заголовке файла.MYI и заново создавать ее, используя информацию из файла.frm. Этот вид ремонта не может быть сделан с myisamchk.

Ваш запрос генерирует результирующий набор, настолько большой, что ему необходимо создать временную таблицу для хранения некоторых результатов или промежуточного продукта, использованного при генерации результата.

Временная таблица генерируется в /var/tmp. Эта временная таблица может быть повреждена. Возможно, устройству, на котором строилась временная таблица, не хватило места. Однако обычно это приводит к ошибке "не хватает места". Возможно, что-то еще, работающее на вашей машине, забило временную таблицу.

Попробуйте переработать ваш запрос, чтобы использовать меньше места, или попробуйте перенастроить базу данных, чтобы больший или безопасный раздел использовался для временных таблиц.

Руководство по MySQL - B.5.4.4. Где MySQL хранит временные файлы

Простой "РЕМОНТ СТОЛ" от PHPMYADMIN решил эту проблему для меня.

  1. перейти к phpmyadmin
  2. открыть проблемный стол
  3. перейдите на вкладку Операции (в моей версии PMA)
  4. внизу вы найдете ссылку "Ремонт таблицы"

Перейдите на движок MyISAM и выполните эту команду

      REPAIR TABLE tbl_name USE_FRM;

В моем случае возникла проблема с местом на диске. Я удалил некоторые ненужные военные файлы с моего сервера, и после этого все заработало.

Эта проблема из-за низкой доступности дискового пространства определенного диска (c:\ или d:\ и т. д.), освободите часть памяти, чтобы она заработала.

Спасибо Сайкумар.П

Это может быть связано с тем, что у вас закончилось дисковое хранилище, а файлы mysql и начальные файлы были повреждены.

Решение, которое нужно попробовать, как показано ниже

Сначала мы переместим файл tmp в место с большим пространством

Шаг 1. Скопируйте существующий файл /etc/my.cnf, чтобы сделать резервную копию.

cp /etc/my.cnf{,.back-`date +%Y%m%d`}

Шаг 2. Создайте новый каталог и установите правильные разрешения.

mkdir /home/mysqltmpdir
chmod 1777 /home/mysqltmpdir

Шаг 3. Откройте файл /etc/my.cnf

nano /etc/my.cnf

Шаг 4: Добавьте строку ниже в разделе [mysqld] и сохраните файл.

tmpdir=/home/mysqltmpdir

Во-вторых, вам нужно удалить файлы и журналы с ошибками из /var/lib/mysql/ib_*, что означает удаление всего, что начинается с "ib".

rm /var/lib/mysql/ibdata1 и rm /var/lib/mysql/ibda.... и так далее

В-третьих, вам нужно будет убедиться, что доступен файл pid, в котором база данных будет записана.

Шаг 1 вам нужно отредактировать /etc/my.cnf

pid-file= /var/run/mysqld/mysqld.pid 

Шаг 2 создайте каталог с файлом, чтобы указать на

 mkdir /var/run/mysqld
 touch /var/run/mysqld/mysqld.pid
 chown -R mysql:mysql /var/run/mysqld

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

/etc/init.d/mysql restart

REPAIR TABLE tbl_name USE_FRM;

Команда запускается только тогда, когда тип MySQL "Storage Engine" должен быть "MyISAM"

Надеюсь это поможет

Я только что решил аналогичную проблему «Неверный файл ключа:\bonga_process\alarms.MYI': попробуйте исправить»

Как я это решил:

  1. Я запустил приложение для настройки сервера, ServerConfiguration.exe
  2. Вкладка "Техническое обслуживание"
  3. Нажмите кнопку «Восстановить таблицы».
  4. Запросы на удаление файлов для освобождения места на диске появляются с помощью командной кнопки «Управление хранилищем».
  5. Нажмите на команду «Управление хранилищем», это приведет вас к некоторым файлам, которые необходимо удалить, чтобы освободить больше места на диске. Удалите все бесполезные файлы.
  6. Перезапустите приложение системного аудитора.

Примените правильную кодировку и сопоставление к базе данных, таблице и столбцам / полям.

Я создаю базу данных и структуру таблиц, используя sql запросы с одного сервера на другой. это создает структуру базы данных следующим образом:

  1. база данных с набором символов "utf8", сопоставлением "utf8_general_ci"
  2. таблицы с набором символов "utf8" и сопоставлением "utf8_bin".
  3. столбцы / поля таблицы имеют кодировку "utf8" и сопоставление "utf8_bin".

Я изменяю параметры сортировки таблицы и столбца на utf8_general_ciи это решает ошибку.

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