vacuum table:可以将delete或者update的旧版本删除,释放空间等待新的该表数据插入。
vacuum freeze table:将表的xmax的值变为2,我不明白这么一点,xid是随着数据库变动,当重新插入数据时,他应该存入的最新的xid啊,没有降低事务id?而且当事务到达极限值,不是会强制vacuum ?
这里涉及到了一个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的目的。
在自己的测试中发现
创建表是对于该表来说是最小的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之外的最小值;就是有点难理解
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。