创建多个联接时不正确的tmp表密钥文件

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

每当我尝试使用多个联接从表中获取记录时,我都会得到以下错误:

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

因此,此查询将产生错误:

SELECT * FROM `core_username`
INNER JOIN `core_person` ON (`core_username`.`person_id` = `core_person`.`id`)
INNER JOIN `core_site` ON (`core_username`.`site_id` = `core_site`.`id`)
ORDER BY `core_username`.`name` ASC LIMIT 1

但这个不会:

SELECT * FROM `core_username`
INNER JOIN `core_person` ON (`core_username`.`person_id` = `core_person`.`id`)
ORDER BY `core_username`.`name` ASC LIMIT 1

这个也不会:

SELECT * FROM `core_username`
INNER JOIN `core_site` ON (`core_username`.`site_id` = `core_site`.`id`)
ORDER BY `core_username`.`name` ASC LIMIT 1

是什么导致了这一切?我真的不知道如何修理一个临时表,但我不认为这是问题所在,因为它是一个新的tmp表每一次。用户名表相当大(目前有233718条记录),但我怀疑这与它有任何关系。

任何帮助都将不胜感激。

经过一些进一步的测试后,似乎只有当我试图排序结果时才会出现错误。也就是说,这个查询将给我我所期望的:

SELECT * FROM `core_username`
INNER JOIN `core_person` ON (`core_username`.`person_id` = `core_person`.`id`)
INNER JOIN `core_site` ON (`core_username`.`site_id` = `core_site`.`id`)
LIMIT 1

但如果我加上:

ORDER BY `core_username`.`name` ASC

错误被触发。这只发生在我目前正在使用的特定的Web服务器上。如果我下载数据库并在本地主机和其他服务器上尝试相同的操作,它就会运行良好。MySQL版本为5.0.77。

提问于
用户回答回答于

有时,当这个错误发生在临时表时:

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

可能是因为文件夹空间不足。在一些Linux安装上,在它自己的分区中,没有太多的空间--大型MySQL查询将填满它。

你可以用检查是否是在它自己的分区中,以及为它分配了多少空间。

如果它位于它自己的分区中,并且缺少空间,您可以:

(A)修改/tmp,使其有更多的空间(通过重新分配或将其移动到主分区)。

(B)更改MySQL配置。

用户回答回答于

在运行查询时,请检查MySQLtmpdir可用空间(在您的示例中为/tmp),因为在处理大表时,它可以吃掉数百mbs。像这样的东西对我很管用:

$ while true; do df -h /tmp; sleep .5; done

扫码关注云+社区