ITPub博客

首页 > 数据库 > > PostgreSQL Vacuum Do you need it ?

PostgreSQL Vacuum Do you need it ?

作者:liuaustin 时间:2019-05-27 16:30:06 0 删除 编辑


如果你理解 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  则很容易理解这件事情。


待续.....






原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-11-13

  • 博文量
    1980
  • 访问量
    518171