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

Sun*_*ara 29 mysql

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

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

Incorrect key file for table '/tmp/#sql_3c51_0.MYI'; try to repair it
Run Code Online (Sandbox Code Playgroud)

这是我的查询

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;
Run Code Online (Sandbox Code Playgroud)

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

Mir*_*ici 55

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

以下是一些解决方案:

  • 在我们的例子中,它是根(/)文件夹,因为我们的虚拟机将所有内容都放在一个分区中,并且/ var / logs /目录已满。虽然对空间建议表示敬意! (2认同)

Haw*_*ili 9

做这些步骤

停止mysql服务

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

启动mysql

在查询中修复所有表,MySQL将重建密钥文件

  • 这不是一个好的答案.问题更可能是/ tmp文件夹中的磁盘空间之一.查看大多数upvotes的答案. (4认同)

Zaf*_*lik 7

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

情况1:

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

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

案例2:

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

案例3 :(罕见情况)

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

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