MySQL的密钥文件不正确

时间:2010-10-11 16:47:55

标签: mysql innodb mysql-error-126

我遇到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

我不能对所涉及的表进行修复;不过我已经对两张桌子都进行了检查。他们看起来很好。我在两张桌子和桌子上都做了一个OPTIMIZE。通过以下方式重建表格。

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临时目录....但我已经让主持人将临时目录更改为更多空间&问题仍然存在。

我认为主持人应该责备&它仍然是临时目录的一个问题;为什么?因为在我再次使用它之后我再次开始向rss_posts表中添加数据&因此,JOIN将获得更大和更多MySQL会再次耗尽空间....你怎么看?

3 个答案:

答案 0 :(得分:5)

这里发生的是MySQL通过从两个表的连接构建临时表来执行ORDER BY。临时表太大而无法放入内存中,因此MySQL会创建一个临时文件。

有一些事情会阻止它正常工作。原始磁盘空间是一个。 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;

答案 1 :(得分:2)

看起来您对临时表的磁盘配额太小了。

BTW:没有必要在InnoDB表上运行REPAIR,因为所有维护都是由存储引擎本身完成的。他们也没有损坏的密钥文件。

答案 2 :(得分:1)

请注意,有问题的.MYI文件是临时表。当您运行涉及联接的查询时,MySql需要使用临时空间在内部合并数据。您很可能在tmp目录中空间不足。

尝试增加分配给tmpdir的空间量或编辑my.cnf文件,让tmpdir指向一个有足够空间的地方(不要忘记赋予它权限)。