表 '/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 类文件占满空间的经历