某日,生产环境上的用户表突然无故锁表,原以为只是偶发的bug。所以第一时间想到的解决方案简单粗暴:重启数据库(service mysqld restart)。问题得以解决。

10min后,该表再次锁表。终于意识到问题并没有那么简单。

经过多方查资料,各种尝试。比如kill进程等方法,均无效。

最终看到一个,有可能是因为磁盘空间不足的原因,瞬间感觉就是它了。

df -h查看服务器磁盘占用情况,果然used已经100%了(没有做磁盘空间占用预警^-^!!)。

只能删除大文件了,一般tomcat的logs目录下的catalina.out文件都特别大。

一查,果然已经有15个G之多了。rm -f catalina.out 删除文件。

再用df -h查看磁盘占用情况。并没有任何改变。

经多方查证发现:删除正在使用中的文件时,系统不会立即释放文件所占空间。

此时可通过:
1、重启(生产环境重启,万一起不来呢。况且还是大晚上在家加班,起不来还得连夜处理。直接pass)
2、kill掉删除文件的进程
     lsof |grep deleted    查找删除文件的进程(第二列是进程id,最后一列是删除文件的路径)

     kill -9 进程id  (删除对应的进程)

再次df -h查看磁盘占用情况,磁盘空间已释放。

另外,锁表的问题还导致,主从同步停止。

重置主从同步,参考另一篇文章链接