今天收到监控报警,一台SDK服务器空闲空间不足10%,于是查看了一下,看看有没有能清理的文件,在检查时,执行

lsof |grep deleted

时发现,有个mysql的慢日志文件被删除了,但是空间没有释放,大约14G空间:加粗样式
在这里插入图片描述
经判断,应该是谁发现了slow.log 占用了大量空间,在释放空间时,直接rm 删除了这个文件。
下面要做的就是释放掉空间,最直接办法就是重启占用这个文件的进程,不过这上面有重要的业务,非必要不能重启进程。于是想到用truncate命令来把文件截断成0字节。
1.找到mysqld的进程id,就ps aux|grep mysqld就可以了。我们找到的是2316
2.查看文件描述符:

 ls -lh /proc/2316/fd |grep slow.log

得到:

 root root 64 May  5 12:57 18 -> /data/mysql/3306/slow.log

3.截断文件:

truncate -s 0 /proc/2316/fd/18 

这样空间就释放了。不过数据库目录下的slow.log其实仍然是删除状态,并且仍然被占用,表现就是数据库目录下没有slow.log
4.接下来就是执行sql语句:

set global slow_query_log_file='/data/mysql/3306/slow1.log';
set global slow_query_log_file='/data/mysql/3306/slow.log';

这样slow.log就出来了,然后把slow1.log删掉。

不过操作到这里,突然想到,其实没必要搞这么麻烦,直接执行那两句sql语句,应该就能解决问题了。不过前面的方法,更通用一些。

Logo

更多推荐