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

来源:互联网 发布:nat网络 编辑:程序博客网 时间:2024/06/16 18:42

Mysql中查看视图的时候遇到错误:

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

 

mysql的错误日志中可以看到类似的错误;

130910  9:52:31 [ERROR] /mysql/mysql5.5.24/bin/mysqld: Incorrect key file for table '/tmp/#sql_15cc_14.MYI'; try to repair it

130910  9:52:31 [ERROR] Got an error from unknown thread, /pb2/build/sb_0-5519472-1334854211.98/mysql-5.5.24/storage/myisam/mi_write.c:223

 

直观上看以为是视图引用的表出了问题,但直接运行视图中的SQL可以返回结果,排除了这个可能。

但为什么直接查询视图报错呢?难道视图创建的有问题。

昨天下班的时候这个视图还可以正常运行,只是今天早上访问这个视图的时候出现了这个错误。这期间视图没有被修改过,说明视图本身并没有问题,且同样的视图在其他的库中可以正常运行。可能是视图运行依赖的“某些环境”发生了改变。

 

尝试如下解决办法:

1. 重建视图,错误依旧。

2. google后得知可能是tmp空间不足引起。

查询视图的时候/tmp下会生成一些临时文件,视图返回结果后,这些临时文件会被自动删除。如果/tmp空间不足以存放视图查询过程中产生的临时文件,则会返回上述错误。

 

检查/tmp空间还有1.5G的剩余,为了避免/tmp空间不足的嫌疑,用rm命令删除了/tmp中占用空间比较大的几个文件。检查/tmp空间发现空间未释放,这是因为linux中如果打开文件的进程还在则,被删除文件的空间是不会释放的。

 

检查哪些进程打开了这些大文件:

$ lsof |grep deleted

发现时mysqld打开了几个比较占空间的大文件。这个时候比较容易想到的就是停掉mysql来释放mysql打开的文件。测试环境或许可以这么做,但生产中的数据库是不能轻易停掉的。既然是mysql打开的这几个文件,我们或许可以知道是mysql中的那些会话打开了这些文件,如果可以我们关闭这些会话,这些被mysql打开的/tmp中的临时文件就会被关闭,从而/tmp空间可以被释放。

 

通过下面的语句查询,果然发现几个耗时比较长的查询在运行。而这些查询有一个共同点,就是在访问不同的视图。

mysql>SELECT * FROM information_schema.`PROCESSLIST` WHERE INFO IS NOT NULL ;

跟同事确认后,是有人在运行几个大的报表,可以停掉。

kill 掉这几个大的查询,发现/tmp空间很快被释放了。那个视图也可以正常的查询了。