开发者社区> 问答> 正文

postgres vacuum freeze table 意义在哪里

vacuum table:可以将delete或者update的旧版本删除,释放空间等待新的该表数据插入。
vacuum freeze table:将表的xmax的值变为2,我不明白这么一点,xid是随着数据库变动,当重新插入数据时,他应该存入的最新的xid啊,没有降低事务id?而且当事务到达极限值,不是会强制vacuum ?

展开
收起
樱桃味 2018-03-06 20:08:18 4315 0
3 条回答
写回答
取消 提交回答
  • PostgreSQL你值得拥有。

    这里涉及到了一个PostgreSQL存在的问题xid 回卷。在PostgreSQL中XID 是使用32位无符号数表示的,如果数据库不断的消耗XID,不引入这种freeze vacuum的机制,终有一天会造成xid 溢出,因为是无符号数,溢出的xid 反而比之前的xid 小了。而PostgreSQL 是使用tuple 的xmin 和xmax 来判断每个事务的可见性的,这种情况下可见性是非常混乱的。
    为了解决这个问题,PostgreSQL 引入了freeze vacuum的机制。当表的最大xid大于等于autovacuum_freeze_max_age时,PostgreSQL会将表中的对应row的xmax的值设置为2,被认为是最老的事务,这样新的事务都能看到该row,完成freeze vacuum的目的。

    2019-07-17 22:00:53
    赞同 展开评论 打赏
  • 一个要努力的人

    在自己的测试中发现
    创建表是对于该表来说是最小的xid,那么relfrozenxid的值就是创建表的xid,不论后面更新插入删除,relfrozenxid都不会变,当age(relfrozenxid)>阀值时,就是强制调用vacuum freeze table;其实age()只是相对数,就是当前的事务id-表的最小事务id,随着当前事务id的增大,表被freeze后,relfrozenxid也会变大,只是中间的间隔变小。


    而对于行来说,如果是vacuum table时,只要自己行的xid与最新的事务id相距不超过vacuum_freeze_min_age阀值时,就不会发生变化,如果超过这个阀值,行的xid就会变为freezeid(2),但是表的relfrozenxid取得的是除了2之外的最小值;就是有点难理解

    2019-07-17 22:00:53
    赞同 展开评论 打赏
  • 域名投资

    2019-07-17 22:00:53
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Lazy Join Optimizations Without Upfront Statistics 立即下载
Major Features: Postgres 10 立即下载
Major Features:Postgres 10 立即下载