6

我在使用 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 会再次耗尽空间......你觉得呢?

4

3 回答 3

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;
于 2010-10-11T17:09:58.240 回答
2

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

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

于 2010-10-11T17:04:23.037 回答
1

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

尝试增加分配给 tmpdir 的空间量或编辑 my.cnf 文件以使 tmpdir 指向具有足够空间的位置(不要忘记授予它权限)。

于 2012-10-11T19:23:59.493 回答