MySQL的密钥文件不正确

Bre*_*ett 6 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;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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
Run Code Online (Sandbox Code Playgroud)

我不能对所涉及的桌子进行维修; 但是我在两张桌子上都运行了CHECK并且看起来很好.我还在两个表上都做了一个OPTIMIZE,并通过以下方式重建了表.

INSERT INTO new_table SELECT * FROM old_table;
Run Code Online (Sandbox Code Playgroud)

然后我将新表重命名为旧表名.....但我仍然遇到这个问题.

为了尝试找出导致它的表,我删除了引用"rss_feeds"表的查询中的代码....所以现在查询看起来像这样.

SELECT 
   posts.id,
   posts.post_title
FROM
   rss_posts AS posts
ORDER BY
   posts.post_date_db DESC
LIMIT
   10;
Run Code Online (Sandbox Code Playgroud)

那很有效.

所以这个问题与rss_feeds表有关.

那么我想我会把表转换回MyISAM并运行修复然后转换回InnoDB .....这暂时工作,它恢复正常....然后再次破坏.....修复它又一次破了......现在修理似乎根本不起作用.

现在,我知道,我知道......我已经在谷歌上搜索过这个问题了......我注意到问题在于我们在MySQL临时目录中没有足够空间的MAJORITY. ...但我已经让主持人将临时目录更改为更多空间并且问题仍然存在.

我认为主机应该归咎于它仍然是临时目录的问题; 为什么?因为在我再次使用它之后我又开始将数据添加到rss_posts表中,因此JOIN会让LARGER和MySQL再次耗尽空间....你怎么看?

Tho*_*Low 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;
Run Code Online (Sandbox Code Playgroud)