【PG分布式事务改造】冻结事务号

一、 参数解读

1. FreezeLimit

FreezeLimit 是 lazy VACUUM 的‘冻结红线’:低于它的 xmin 必须立刻冻结,避免事务 ID 回卷

项目 说明 计算 / 取值
中文名 冻结阈值
作用 判断哪些元组的 xmin 必须被冻结 小于等于该值的元组 → 立即冻结
计算公式 FreezeLimit = OldestXmin – vacuum_freeze_min_age • OldestXmin:当前最旧事务号
• vacuum_freeze_min_age:GUC 参数
单位 事务号(TransactionId,32 位循环) 例如 50000000
默认值 依赖 GUC vacuum_freeze_min_age = 50 000 000
常见场景 lazy VACUUM 扫描每页时 heap_prepare_freeze_tuple() 比较 xmin
结果 满足 xmin ≤ FreezeLimit → 元组被原地改为 FrozenTransactionId = 2 防止事务 ID 回卷
相关阈值 MultiXactCutoff 对 MultiXactId 做同样冻结判断
触发 aggressive VACUUM vacuum_freeze_table_age 当表的 relfrozenxid 超过该年龄

2. relfrozenxid

relfrozenxid 是 pg_class 系统表中记录的一个事务号,表示表中所有比这个事务号更旧的元组已经被冻结。

项目 内容
定义 记录在 pg_class.relfrozenxid 中的表级元数据,表示该表中所有早于该值的 XID 已被冻结
来源 上一次 aggressive VACUUM 成功后写入
作用
  • 避免重复冻结已冻结元组
  • 判断是否触发全表扫描(aggressive vacuum):
    当前事务号 - relfrozenxid ≥ vacuum_freeze_table_age
更新时机 仅当整张表被完整扫描并冻结完成后,将当前 FreezeLimit 写入 relfrozenxid
示例 VACUUM 结束后,Table_1 的 relfrozenxid 被更新为 100,002,000,表示表中所有 t_xmin < 100,002,000 的元组已冻结

3.oldestXid

oldestXid 是 PostgreSQL 整个实例中“仍可能出现在某张表里的最旧事务号”,比它更老的 XID 可以认为“全局死亡”,其对应的 CLOG 段可被安全截断。

场景 oldestXid 的作用
CLOG 截断 TruncateCLOG(oldestXid)pg_xact 中 oldestXid 之前的段文件物理删除。
事务回卷防护 计算 4 个警戒线:
xidVacLimit / xidWarnLimit / xidStopLimit / xidWrapLimit
都在 SetTransactionIdLimit() 里以 oldestXid 为基准算出来。
强制 autovacuum 当当前最新事务号 ≥ xidVacLimit 时立刻触发 autovacuum,防止回卷。
FreezeLimit 计算 虽然 FreezeLimit 用 oldestXmin - vacuum_freeze_min_age,但 oldestXmin 的“安全下限”不能低于 oldestXid,否则会把系统还需要的 XID 冻结掉。

4.datfrozenxid

datfrozenxid 是 数据库级“冻结底线”,由 VACUUM FREEZE 自动维护,确保事务号不回卷。

维度 内容说明
位置 系统表 pg_database.datfrozenxid
数据类型 xid(32 位事务号)
含义 该数据库中“最旧且尚未被冻结的事务号”
何时更新 每次 VACUUM FREEZE 或 autovacuum 完成后自动推进
如何查看 SELECT datname, datfrozenxid FROM pg_database;
作用 1 防止事务号回卷(wraparound)
作用 2 作为集群级 oldestXid 的计算来源: min(datfrozenxid)
相关字段 表级:pg_class.relfrozenxid
集群级:pg_control_checkpoint() 返回的 oldest_xid
示例查询 SELECT datname, age(datfrozenxid) AS age FROM pg_database;

4. oldestxid与datfrozenxid、FreezeLimit、relfrozenxid的联系

概念 作用域 数值含义 来源/存储位置 何时更新 与其它量的关系
oldestXid 整个 集群 所有数据库里最小的 datfrozen
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值