背景
公司采用了apache的nifi来同步实时数据,偶尔会有数据写入缓慢或者停止写入占用连接池的情况,近几天有个现场突然说数据出现了问题,于是与公司dba开始一起排查
一、为什么写入缓慢或者停止写入?
经过dba的排查发现原因为,大量数据的更新导致PG库的表膨胀问题,表膨胀后未及时触发pg的垃圾回收机制,导致插入需要耗费大量的cpu资源,从而造成数据库性能不佳
二、解决办法
1.临时解决办法
手动触发该表的垃圾回收机制,代码如下(示例):
vacuum full 数据库.表;
2.持久办法
通过构建脚本或定时任务去定期去执行sql,最后采用NIFI搭建定期回收垃圾资源执行模块去解决
三.坑!
该sql必须在事务块外执行,如果用nifi的话可以采用ExecuteSQL模块定时去执行,而不是采用putsql模块,putsql模块貌似是在事务块内写入数据,尝试用putsql各种设置都无果。遂采用ExecuteSQL定时执行。