表'/tmp /#sql_3c51_0.MYI'的密钥文件不正确;尝试修复它

时间:2012-08-04 03:58:44

标签: mysql

我写了一个查询,这在我的本地服务器上运行正确,它有更少的数据,

但是当我在生产服务器上运行它时会出现错误 - (这有更多的数据大约6GB)

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;

任何人都知道如何从该错误中恢复 - 例如otimize此查询或任何其他方式 谢谢

7 个答案:

答案 0 :(得分:55)

问题是由/ tmp文件夹中缺少磁盘空间引起的。 / tmp卷用于需要创建临时表的查询中。即使查询仅使用InnoDB表,这些临时表也是MyISAM格式。

以下是一些解决方案:

  • 优化查询,使其不会创建临时表(重写查询,将其拆分为多个查询或添加适当的索引)
  • 优化MySQL,因此不会创建临时表(sort_buffer_size,join_buffer_size)。请参阅:https://dba.stackexchange.com/questions/53201/mysql-creates-temporary-tables-on-disk-how-do-i-stop-it
  • 缩小表格。如果可能,删除不需要的行
  • 使用占用空间较少的数据类型
  • 在/ tmp文件夹所在的卷上添加更多磁盘空间
  • 通过在mysqld启动之前设置TMPDIR环境变量,通过mysql更改临时文件夹用户。将TMPDIR指向磁盘卷上具有更多可用空间的文件夹。您还可以在mysqld服务的命令行中使用tmpdir/etc/my.cnf中的--tmpdir选项。请参阅:B.5.3.5 Where MySQL Stores Temporary Files

答案 1 :(得分:8)

执行以下步骤

停止mysql服务

将.myi文件重命名为x.old

启动mysql

REPAIR all the tables in query,MySQL将重建密钥文件

答案 2 :(得分:7)

上面有很多答案,问题所有者已经按照@Hawili的建议得到了解决方案,并且自问题提出以来已经过了很长时间。但由于这是一个常见的问题,我想分享我的经验,以便如果有人因为不同的原因再次得到这个问题,那么可以从这里获得解决方案。

案例1:

最常见的原因是查询正在获取大于/ tmp分区大小的数据。在查询期间遇到此问题时,请查看/ tmp文件夹大小。临时表是自动创建和删除的,如果此查询期间可用空间下降到0,则表示您需要优化查询或需要增加/ tmp的分区大小。

注意:有时候它并不是一个单独的查询:如果重度查询的组合在同一台服务器上同时执行此操作,那么您可以解决此问题,通常单个查询将执行而不会出现任何错误。

案例2:

如果您需要修复损坏的myisam表,则错误消息中的目录路径将与/ tmp不同。

案例3 :(极少数情况下)

有时由于表连接不正确,您可能会收到此错误。这是一个语法错误,但mysql可以抛出此错误。您可以在以下链接查看详细信息 -

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

答案 3 :(得分:3)

运行df -h,检查您的tmp目录的位置。确保有足够的空间来增加临时文件,可能是几次演出。

编辑:如果您有足够的可用空间,我会检查以确保您在WHERE子句中索引或包含的每个列都已编入索引。

答案 4 :(得分:0)

检查数据库服务器上是否有足够的磁盘空间。如果磁盘已满,则会显示此错误。现在,您应该查看哪些文件夹取决于您的设置。

答案 5 :(得分:0)

我使用了以下命令,错误消失了:

mysqlcheck --all-databases -r #repair

我从cpanel forum

获得了这个解决方案

答案 6 :(得分:0)

对我来说同样的问题

运行df -h以查看您的分区/ tmp是否有足够的空间

在我的情况下/ tmp是一个溢出文件系统:

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

发生了什么:

我在这里遇到了一些问题并且我的分区/已满,然后Debian发行版在RAM存储器中创建了一个新的分区/tmp,暂时使用。这个/tmp 1MB分区不够大,不适合系统使用。

解决方案: 运行以下命令以删除此临时创建的分区/tmp

sudo umount -l /tmp