Подтвердить что ты не робот

Неверный ключевой файл для таблицы '/tmp/#sql_3c51_0.MYI'; попытаться восстановить его

Я написал запрос, и это выполняется на моем локальном сервере правильно, у него меньше данных,

но когда я запускаю его на сервере, он получает ошибку - (у этого больше данных около 6 ГБ)

Incorrect key file for table '/tmp/#sql_3c51_0.MYI'; try to repair it

Вот мой запрос

SELECT   
    `j25_virtuemart_products`.`virtuemart_product_id`,
    `product_name`, 
    `product_unit`,
    `product_s_desc`,
    `file_url_thumb`,
    `virtuemart_custom_id`, 
    `custom_value`   
    FROM 
    `j25_virtuemart_product_customfields`,
    `j25_virtuemart_products`,
    `j25_virtuemart_products_en_gb`,
    `j25_virtuemart_product_medias`,
    `j25_virtuemart_medias`     
    WHERE
    (
    `j25_virtuemart_products`.`virtuemart_product_id`=`j25_virtuemart_products_en_gb`.`virtuemart_product_id`
    AND 
    `j25_virtuemart_products`.`virtuemart_product_id`=`j25_virtuemart_product_customfields`.`virtuemart_product_id`)

AND

    `j25_virtuemart_products`.`virtuemart_product_id`=`j25_virtuemart_product_medias`.`virtuemart_product_id`
    AND 
    `j25_virtuemart_product_medias`.`virtuemart_media_id`=`j25_virtuemart_medias`.`virtuemart_media_id`

    GROUP BY `j25_virtuemart_products`.`virtuemart_product_id`

    LIMIT 0, 1000;

Кто-нибудь знает, как восстановить эту ошибку - что-то вроде оцимизации этого запроса или любым другим способом спасибо

4b9b3361

Ответ 1

Сделайте следующие шаги

Остановить службу mysql

переименуйте файл .myi в x.old

Запустите mysql

REPAIR все таблицы в запросе, MySQL перестроит ключевой файл

Ответ 2

Проблема вызвана нехваткой места на диске в папке /tmp. Том /tmp используется в запросах, требующих создания временных таблиц. Эти временные таблицы имеют формат MyISAM, даже если в запросе используются только таблицы с InnoDB.

Вот несколько решений:

  • оптимизировать запрос, чтобы он не создавал временные таблицы (переписать запрос, разделить его на несколько запросов или добавить правильные индексы)
  • оптимизировать MySQL, чтобы он не создавал временные таблицы (sort_buffer_size, join_buffer_size). См.: https://dba.stackexchange.com/questions/53201/mysql-creates-tevent-tables-on-disk-how-do-i-stop-it.
  • сделать таблицы меньше. Если возможно, удалите ненужные строки
  • использовать типы данных, которые занимают меньше места
  • добавить больше дискового пространства на томе, где находится папка /tmp
  • измените пользователя временной папки с помощью mysql, установив TMPDIR среды TMPDIR перед запуском mysqld. Укажите TMPDIR на папку на томе диска, на которой больше свободного места. Вы также можете использовать опцию tmpdir в /etc/my.cnf или --tmpdir в командной строке службы mysqld. См.: B.5.3.5 Где MySQL хранит временные файлы

Ответ 3

Так много ответов выше, и владелец вопроса уже получил решение, предложенное @Hawili, и прошло много времени с тех пор, как эта проблема была поднята. Но поскольку это общая проблема, я хотел поделиться своим опытом, чтобы, если кто-то снова получил эту проблему из-за разных причин, тогда можно получить решение отсюда.

Случай 1:

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

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

Случай 2:

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

Случай 3: (редкий случай)

Иногда из-за неправильного соединения в таблицу вы можете получить эту ошибку. Это actaully синтаксическая ошибка, но mysql может выбросить эту ошибку. Вы можете проверить информацию здесь по ссылке ниже -

Неверный файл ключа для таблицы '/tmp/#sql_18b4_0.MYI'; попробуйте отремонтировать его

Ответ 4

Проверьте расположение вашего tmp-диска, запустив df -h. Удостоверьтесь, что достаточно места для создания временного файла, это может быть несколько концертов.

Изменить: если у вас достаточно свободного места, я бы проверил, чтобы каждый индексируемый или включенный в предложение WHERE индексированный индекс индексировался.

Ответ 5

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

Ответ 6

Я использовал эту следующую команду, и ошибка исчезла:

mysqlcheck --all-databases -r #repair

Я получил это решение из cpanel forum

Ответ 7

Та же проблема для меня

Запустите df -h чтобы увидеть, достаточно ли места в вашем разделе /​​tmp

В моем случае /tmp была файловой системой переполнения:

overflow 1,0M 24K 1000K 3%/tmp

Что случилось:

У меня возникли некоторые проблемы, и мой раздел / был переполнен, затем дистрибутив Debian создал новый раздел /tmp в памяти RAM, чтобы использовать его временно. Этот раздел /tmp 1 МБ недостаточно велик для использования системой.

Решение: выполните следующую команду, чтобы удалить этот временно созданный раздел /tmp

sudo umount -l/tmp

Ответ 8

Перезапустите службу MySQL с помощью этой командной строки /etc/init.d/mysqld restart в терминале.