我写了一个查询,这在我的本地服务器上运行正确,它有更少的数据,
但是当我在生产服务器上运行它时会出现错误 - (这有更多的数据大约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此查询或任何其他方式 谢谢
答案 0 :(得分:55)
问题是由/ tmp文件夹中缺少磁盘空间引起的。 / tmp卷用于需要创建临时表的查询中。即使查询仅使用InnoDB表,这些临时表也是MyISAM格式。
以下是一些解决方案:
TMPDIR
环境变量,通过mysql更改临时文件夹用户。将TMPDIR
指向磁盘卷上具有更多可用空间的文件夹。您还可以在mysqld服务的命令行中使用tmpdir
或/etc/my.cnf
中的--tmpdir
选项。请参阅:B.5.3.5 Where MySQL Stores Temporary Files 答案 1 :(得分:8)
答案 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)
答案 6 :(得分:0)
对我来说同样的问题
运行df -h
以查看您的分区/ tmp是否有足够的空间
在我的情况下/ tmp是一个溢出文件系统:
overflow 1,0M 24K 1000K 3% /tmp
发生了什么:
我在这里遇到了一些问题并且我的分区/
已满,然后Debian发行版在RAM存储器中创建了一个新的分区/tmp
,暂时使用。这个/tmp
1MB分区不够大,不适合系统使用。
解决方案:
运行以下命令以删除此临时创建的分区/tmp
sudo umount -l /tmp