MySQL Errno 28解决方案

昨天下午组里的同学跟我说数据库不能更改字段了,原本这台CentOS的机器工作很久都还还算正常,于是过去看了一下,发现MySQL在执行SQL之后报错,类似:

1
Cant't create table #xxxxxx, Errno 28

即提示错误码为28,告知用户无法创建表格。

错误码28第一反应就是磁盘空间不足,之后查看了df -hl查看了磁盘空间,发现MySQL所在的分区挂载的磁盘空间余量还有70%之多,之后查看是否是因为/tmp目录已满(即my.cnf中配置的tempdir)导致的,结果发现/tmp挂载的分区也有不少剩余空间,最后一想是不是有可能是inode已满导致的无法创建新文件的问题,使用df -i查看inode使用情况,发现inode使用已经达到了100%。

既然如此,那么整个事情也就明了了,磁盘空间已满不仅仅是物理空间上的已经使用完毕,也包括inode的使用情况,inode个数使用完毕之后,就不会有空间留给新文件用于记录文件信息了,自然也就不能创建文件了。关于inode,可以阅读阮一峰老师的《理解inode》这篇博文,清晰易懂。

解决问题的话,自然是要找到用尽inode的元凶,一般来说,小文件过多都是引起这个问题的主要原因。检查了这台数据库机器的进程,发现居然有有一套PHP在运行,查看了下php.ini之后,发现session的配置上,目录层级很深,运行了这么长的时间,session文件已经多到让人无语的程度,那么剩下的事情就好解决了,因为这台机器当前的服务不需要session的支持,直接干掉全部session文件即可。

小结一下,当MySQL出现28的错误码的时候,可以考虑:

  1. 检查磁盘空间
  2. 磁盘空间足够,检查临时目录空间大小
  3. 检查inode是否还有剩余

不得不说,这个事情并不是第一次看到,那么下次再出现磁盘无剩余空间,可以再看看是不是inode已满。