前段时间客户运维人员报生产环境批处理数据库环境出问题,没办法正常运行,于是登录他们服务器,查看了PG日志文件,发现原来是磁盘空间满的原因:

PG server 磁盘空间占满问题的处理方法 | 运维进阶_java

接下来直接df -Th ,看到是home空间满,而我是将PG的data文件都存在在home目录下,那应该是PG的数据文件空间占满了,但是系统才运行2年,磁盘空间配置将近900G,一下子就占满了,肯定是某个程序代码突发性引起的。因为系统运行2年多一直没出问题,而且前几天有查看总的磁盘空间占用还不到30G。

经开发人员分析,确实是批处理语法出了问,题引起的一个特殊条件比较隐秘性的BUG。

PG server 磁盘空间占满问题的处理方法 | 运维进阶_java_02

接下来的首要问题,是定位哪张表出了问题,并解决磁盘空间缩减问题,使系统正常启动运行。

通过定位分析是某张报表数据量占用空间导致磁盘空间占满,21亿笔数据。如下:

PG server 磁盘空间占满问题的处理方法 | 运维进阶_java_03

查看分析,确实是这张表占用了783G的空间导致的。

PG server 磁盘空间占满问题的处理方法 | 运维进阶_java_04

问题处理第一步:

通过对PG数据库进行回收垃圾方式,看是否能回收部分,结果无法正常回收。然后再想通过重启数据库方式,看能不能释放下空间,结果无法正常启动了。

PG server 磁盘空间占满问题的处理方法 | 运维进阶_java_05

迫不得己,只好申请临时加一块1T的硬盘,然后重新修改配置,再启动数据库,进行数据删除与恢复。

PG server 磁盘空间占满问题的处理方法 | 运维进阶_java_06

因日常都有做备份工作,接下来只需把对应的表数据恢复到前一天的数据。

之前没经验,所以先把该表直接Drop表重建,然后重建索引,再进行数据导入。

问题得到解决:

PG server 磁盘空间占满问题的处理方法 | 运维进阶_java_07

总结:本次碰到的问题出现过两次,第一次以为是系统故障问题引起的,当时通过清理磁盘部分多余空间,然后对该表中脏数据进行清理剩下几十万笔数据,但是发现表空间和索引空间都没释放。原因是使用DELETE方式来逻辑删除表数据,但是空间是不释放的,于是重新命名了该表名称,然后重建该表,再复制数据,用drop方式删除旧表和索引,磁盘空间最终才得以释放。备注: 当DELETE后面跟条件的时候,就会出现删除数据后,数据表占用的空间大小不会变。