我在使用InnoDB (表最初是MyISAM,但不久前将其转换为InndoB )表时遇到了问题;我正在尝试运行以下查询:
SELECT
posts.id,
posts.post_title
FROM
rss_posts AS posts
INNER JOIN rss_feeds AS feeds ON posts.blog_id=feeds.id
WHERE
feeds.blog_language=1
ORDER BY
posts.post_date_db DESC
LIMIT
10;我得到了这个错误:
Query : SELECT posts.id,posts.post_title FROM rss_posts AS posts INNER JOIN vw_rss_feeds AS feeds ON posts.blog_id=feeds.id WHER...
Error Code : 126
Incorrect key file for table '/tmp/#sql_7375_0.MYI'; try to repair it我不能对涉及到的表运行修复;但是,我已经对两个表都运行了检查&它们看起来都很好。我还对这两个表进行了优化,并通过执行以下操作重新构建了这些表。
INSERT INTO new_table SELECT * FROM old_table;然后,我将新表重命名为旧表名.....但是我仍然有这个问题。
为了尝试找出是哪个表引起的,我删除了查询中引用"rss_feeds“表的代码...因此,现在的查询如下所示。
SELECT
posts.id,
posts.post_title
FROM
rss_posts AS posts
ORDER BY
posts.post_date_db DESC
LIMIT
10;这招奏效了。
所以问题出在rss_feeds表上。
因此,我想我应该将表转换回MyISAM并运行修复,然后再转换回InnoDB……这暂时起作用了,恢复正常了.然后它又坏了.又修了,又坏了……现在修复似乎完全不起作用了。
现在,我知道,我知道......我已经在谷歌上搜索过这个问题了……我注意到,大多数情况下问题出在MySQL临时目录中没有足够的空间...但我已经让主机将temp dir更改为具有更多空间的文件&问题仍然存在。
我认为主机是罪魁祸首&这仍然是临时目录的问题;为什么?因为在我让它再次工作后,我再次开始向rss_posts表添加数据&因此连接会变得更大& MySQL会再次耗尽空间。你认为如何?
发布于 2010-10-12 01:09:58
这里发生的事情是,MySQL通过从两个表的连接构建一个临时表来执行ORDER BY。临时表太大,内存无法容纳,因此MySQL创建了一个临时文件。
有几件事会阻止它正常工作。原始磁盘空间为1。ulimit是另一个。如果这是托管的,他们可能会对您的磁盘使用有配额(除了ulimit)。
我建议在您的查询中添加一个限制子句。目前,您将整个rss_posts和rss_feeds都加载到临时表中进行排序。如果你只想要最近的10个数据,那就比你真正需要的数据多得多。
SELECT posts.id, posts.post_title
FROM rss_posts AS posts INNER JOIN rss_feeds AS feeds ON posts.blog_id=feeds.id
WHERE feeds.blog_language=1
AND posts.post_data_db > (now - interval 30 day);
ORDER BY posts.post_date_db DESC LIMIT 10;发布于 2010-10-12 01:04:23
看起来临时表的磁盘配额确实太小了。
顺便说一句,不需要对InnoDB表运行修复,因为所有的维护都是由存储引擎自己完成的。它们也没有要损坏的密钥文件。
发布于 2012-10-12 03:23:59
请注意,存在问题的.MYI文件用于临时表。当您运行涉及连接的查询时,MySql需要使用临时空间在内部合并数据。您的tmp目录中的空间很可能已用完。
尝试增加分配给tmpdir的空间量,或者编辑my.cnf文件,让tmpdir指向一个有足够空间的地方(不要忘记授予它权限)。
https://stackoverflow.com/questions/3908228
复制相似问题