如果你理解 POSTGRESQL 的原理,尤其是在MVCC 上关于事务,在Update 或者 Delete 数据后,留下的 dead rows,是需要清理的,所以就引出了我们今天要看的 vacuum.
What is VACUUM on PostgreSQL ?
VACUUM (真空吸尘), 比喻的还蛮恰当的, Vacuum 进程就是在POSTGRESQL 中进行DEAD ROWS 清理的进程。
主要这个进程要做的有四点
1 恢复和重新利用磁盘空间
2 更新数据统计信息
3 加速索引的扫描(里边的原理暂不谈)
4 保证正常使用的数据不被清理
通过下面的查询我们可以获得表中
dead_tup 通过 live_tup 之间的对比关系就能发现当前的表是否存在“数据膨胀的问题”。
其中有一个问题,就是当vacuum 不在进行数据清理的,则空间会进行膨胀,数据库的性能也会降低。这也就是说要删除的事务中的"元组,必须比当前活跃的事务的元组 Xmax 要小,才能清空这个"元组”。
我们可以通过上面的查询得到相关PID 的信息, 并他通过 pg_terminate_backend来终止某些阻止 vacuum的进行的session.
另外还有一个事情就是 复制槽,如果复制槽不在被使用或者延迟等等事情发生,也会造成 VACUUM 不能正常进行
然后在通过pg_drop_replication_slot 复制槽的清理工作。
对自动的vacuum 需要查看是否处于打开的状态
最后我们的vacuum 的进程其实是一直在工作的
这些都是监控和日常中应该进行监控和检测的事情。
其实说到这里,如果是MYSQL的DBA ,可能还对VACUUM 的存在有一种混乱的印象,如果MYSQL DBA 可以想一下 UNDO LOG 的问题,通过UNDO LOG 尝试理解 这个问题,因为 POSTGRESQL 是没有 UNDO LOG 的,POSTGRESQL 是通过在每行标记 事务点的方式来进行数据的 回滚,这意味每张POSTGRESQL 的表中就已经带有UNDO LOG 的 某些功能了。当然如果是ORACLE的DBA 则很容易理解这件事情。
待续.....