-
**vacuum_freeze_table_age : ** 当表的pg_class.relfrozenxid域达到该设置指定的年龄时,VACUUM会执行一次全表扫描。默认值是 1.5 亿个事务。尽管用户可以把这个值设置为从 0 到 20 亿,VACUUM会悄悄地将有效值设置为autovacuum_freeze_max_age值的95%,因此在表上启动一次反回卷自动清理之前有机会进行一次定期手动VACUUM。
-
**vacuum_freeze_min_age : ** 指定VACUUM在扫描表时用来决定是否冻结行版本的切断年龄(以事务计)。默认值是 5 千万个事务。尽管用户可以将这个值设置为从 0 到 10 亿,VACUUM会悄悄地将有效值设置为autovacuum_freeze_max_age值的一半,这样在强制执行的自动清理之间不会有过短的时间间隔。。
理解vacuum_freeze_min_age参数:
1. 插入测试数据
postgres=# insert into tb9 select generate_series(1,5),'aa';
INSERT 0 5
postgres=# select xmin,age(xmin),xmax,* from tb9;
xmin | age | xmax | id | name
------+-----+------+----+------
2523 | 1 | 0 | 1 | aa
2523 | 1 | 0 | 2 | aa
2523 | 1 | 0 | 3 | aa
2523 | 1 | 0 | 4 | aa
2523 | 1 | 0 | 5 | aa
(5 rows)
2. 手动设置vacuum_freeze_min_age 值
postgres=# set vacuum_freeze_min_age =10;
SET
这个设置为10的意思是当age(xmin)大于等于10的时候,当执行vacuum操作的时候会将此时表中记录的xmin置为特殊值FrozenXID。
多次执行 select txid_current() 使得事务id增加。
postgres=# select txid_current();
txid_current
--------------
2539
(1 row)
3. 查看数据
postgres=# select xmin,age(xmin),xmax,* from tb9;
xmin | age | xmax | id | name
------+-----+------+----+------
2523 | 17 | 0 | 1 | aa
2523 | 17 | 0 | 2 | aa
2523 | 17 | 0 | 3 | aa
2523 | 17 | 0 | 4 | aa
2523 | 17 | 0 | 5 | aa
(5 rows)
看到xmin的事务年龄已经是17。
4. 执行vacuum操作
postgres=# vacuum tb9;
VACUUM
5. 再次查看数据
postgres=# select xmin,age(xmin),xmax,* from tb9;
xmin | age | xmax | id | name
------+------------+------+----+------
2 | 2147483647 | 0 | 1 | aa
2 | 2147483647 | 0 | 2 | aa
2 | 2147483647 | 0 | 3 | aa
2 | 2147483647 | 0 | 4 | aa
2 | 2147483647 | 0 | 5 | aa
(5 rows)
freeze后的tuple, xmin 变成了一个FrozenXID,这个XID不参与比较,始终认为这个ID比其他的XID老,所以用 age 去计算始终显示 2147483647 。
说明:
当没有手动设置vacuum_freeze_min_age的值的时候,执行
vacuum freeze tb9;
强制使用freeze的效果是一样的。
参考:
http://blog.163.com/digoal@126/blog/static/163877040201211259497702/