- 论坛徽章:
- 7
|
由于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号已经到了快用完的状态,即使是年龄归零不还是可能循环回来吗?请大神解释,谢谢了!
|
|