一、 参数解读
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 成功后写入 |
作用 |
|
更新时机 | 仅当整张表被完整扫描并冻结完成后,将当前 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 |