ora_explorer 发表于 2015-03-06 16:14

请问vacuum freeze问题

如题。
自己在做测试的时候vacuum freeze table之后,xmin没变,有的时候age(relfrozenid)变化,有的时候不变化,请问freeze究竟做了什么,如果id号已经到了快用完的状态,即使是年龄归零不还是可能循环回来吗?请大神解释,谢谢了!

asdf2110 发表于 2015-03-09 10:49

由于xid用uint4存储的,最多40几亿个,用完了就要循环使用,如果发生循环使用,那么如何区分是旧事务产生的元组,还是新事务产生的呢?
其实不需要知道是旧事务还是新事务的,只需要知道该元组对当前事务是否可见就可以了。
所以,vacuum会“定期”的对其进行处理,在元组头标记 FrozenTransactionId,后续的事务看见FrozenTransactionId标记的元组,都认为是可见的(当然还有xmax等需要判断)
这个”定期“指的是元组的xmin/xmax与当前数据库系统活跃的最小的事务号之间的差距(PS:如果系统有长事务一直不提交,那么最终会导致事务号无法回收)
超过这个差距,就要对元组事务号回收,否则不需要回收。
vacuum加上freeze参数后,这个差距变成0;不加这个默认使用系统参数 Min(vacuum_freeze_min_age, autovacuum_freeze_max_age / 2)
这点可以从函数 vacuum_set_xid_limits 找到。
不知道有没有说清楚。



回复 1# ora_explorer
如题。
自己在做测试的时候vacuum freeze table之后,xmin没变,有的时候age(relfrozenid)变化,有的时候不变化,请问freeze究竟做了什么,如果id号已经到了快用完的状态,即使是年龄归零不还是可能循环回来吗?请大神解释,谢谢了!

   

ora_explorer 发表于 2015-03-11 09:45

回复 2# asdf2110


    还是有些不太明白,请问如果回收事务号的话,会把frozenID标记去掉然后xmin归零吗?

asdf2110 发表于 2015-03-12 08:57

frozen 标记不会去掉,除非这条记录被delete 了
xid循环使用时,只要保证上一轮在此xid之前的元组都已被标记就可以了。

比如,循环使用了 9999 这个事务号,那么要保证 所有xid <9999的可见元组都被标记位 frozen才行

回复 3# ora_explorer


   

ora_explorer 发表于 2015-03-27 10:48

回复 4# asdf2110


    明白了,太感谢啦!~~~
页: [1]
查看完整版本: 请问vacuum freeze问题