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

Posted

技术标签:

【中文标题】表 \'/tmp/#sql_3c51_0.MYI\' 的密钥文件不正确;尝试修复它[重复]【英文标题】:Incorrect key file for table '/tmp/#sql_3c51_0.MYI'; try to repair it [duplicate]表 '/tmp/#sql_3c51_0.MYI' 的密钥文件不正确;尝试修复它[重复] 【发布时间】:2012-08-02 02:19:12 【问题描述】:

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

但是当我在生产服务器上运行它时,它会出现错误 - (这有更多大约 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 此查询或任何其他方式 谢谢

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我知道我想要一种方法来恢复它,比如优化查询或... 您在 /tmp/ 上有多少可用空间? 我没有 cpanel 访问权限,我只是通过我的 php 文件运行此代码tsiopelakos.dev-centiva.com/…【参考方案2】:

执行这些步骤

停止mysql服务

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

启动mysql

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

【讨论】:

不,伙计,网站工作正常tsiopelakos.dev-centiva.com/… 但这只有在上述查询运行时您才知道优化此查询:) 其中一个表有一个错误的密钥文件 j25_virtuemart_product_customfields, j25_virtuemart_products, j25_virtuemart_products_en_gb, j25_virtuemart_product_medias, j25_virtuemart_medias ,你必须修复它然后查询才能工作 感谢它工作得很好,我修复了上面的表格 ex- REPAIR TABLE cent_virtuemart_products_en_gb 现在它工作得很好:) 太棒了...... 我不确定这是个好建议。 .myi 在 /tmp 中,这意味着它是在查询期间动态创建的,因此它可能会在服务器停止后消失,没有任何东西可以重命名或修复。修复所有表也可能无法解决。 这不是一个好的答案。问题很可能是 /tmp 文件夹中的磁盘空间之一。查看投票最多的答案。【参考方案3】:

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

这里有一些解决方案:

优化查询,使其不会创建临时表(重写查询,将其拆分为多个查询,或添加适当的索引,使用pt-query-digest 和EXPLAIN <query> 分析执行计划)请参阅此Percona article about temporary tables。李> 优化 MySQL,使其不会创建临时表(sort_buffer_size、join_buffer_size)。见:https://dba.stackexchange.com/questions/53201/mysql-creates-temporary-tables-on-disk-how-do-i-stop-it 使表格更小。如果可能,删除不需要的行 使用SELECT table1.col1, table2,col1 ... 而不是select * 仅使用查询中需要的列来生成更小的临时表 使用占用更少空间的数据类型 在 /tmp 文件夹所在的卷上添加更多磁盘空间 mysqld 启动前通过设置TMPDIR 环境变量来更改临时文件夹用户。将TMPDIR 指向磁盘卷上具有更多可用空间的文件夹。您还可以在 mysqld 服务的命令行中使用/etc/my.cnf--tmpdir 中的tmpdir 选项。见:B.5.3.5 Where MySQL Stores Temporary Files

【讨论】:

在我们的例子中,它是根 (/) 文件夹,因为我们的虚拟机在一个分区中包含所有内容,并且 /var/logs/ 目录已填满。不过对空间建议表示赞赏! 这是正确的答案。特别是对于 innodb,因为不支持修复表。谢谢! 这应该是公认的答案。如上所述,尤其是对于 InnoDB 表。我将具有 12GB 可用卷的 tmp 目录移动到具有 1.3TB 可用卷的卷,并且在生成 19GB 大小的 tmp 文件后,我的查询运行没有问题。 哇,谢谢,我们如何改进这些信息? 只是想知道第一个潜在的解决方案:'优化查询,使其不会创建临时表(重写查询,将其拆分为多个查询,或添加适当的索引);我们该怎么做? 【参考方案4】:

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

【讨论】:

【参考方案5】:

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

案例一:

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

注意:有时它不是单个查询:如果在同一台服务器上同时执行大量查询的组合,那么您可能会遇到此问题,通常单个查询会在没有任何错误的情况下执行。

案例2:

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

案例3:(罕见情况)

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

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

【讨论】:

【参考方案6】:

在终端使用这个命令行/etc/init.d/mysqld restart重启MySQL服务。

【讨论】:

【参考方案7】:

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

mysqlcheck --all-databases -r #repair

我从cpanel forum得到了这个解决方案

【讨论】:

【参考方案8】:

同样的问题

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

在我的例子中 /tmp 是一个溢出文件系统:

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

发生了什么:

我在这里遇到了一些问题,我的分区 / 已满,然后 Debian 发行版在 RAM 内存中创建了一个新分区 /tmp,以临时使用。这个/tmp 1MB 的分区不够系统使用。

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

sudo umount -l /tmp

【讨论】:

以上是关于表 '/tmp/#sql_3c51_0.MYI' 的密钥文件不正确;尝试修复它[重复]的主要内容,如果未能解决你的问题,请参考以下文章

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

编译安装mysql ERROR: 1 Can't create/write to file '/tmp/#sql_86b_0.MYI'

ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_830_0.MYI' (Errcode: 13)

mysql tmp下#sql_xxx_0.MYD 类文件占满空间的经历

MySQL 错误:无法创建/写入文件“/var/mysqltmp/#sql_1fbd_0.MYI”(错误代码:13)

当您无法修复表时,如何修复 MySQL“不正确的密钥文件”错误?