Postgres 11各表autovacuum(freeze)触发时机查询技术问询
Postgres 11 查看表触发自动Vacuum Freeze的时机
你要查询每张表何时达到vacuum_freeze_table_age阈值触发自动Vacuum Freeze,原语句存在两个核心问题:
- 错误使用了
relminmxid,判断Freeze触发应该基于relfrozenxid——PostgreSQL中,当表的age(relfrozenxid)达到vacuum_freeze_table_age时,会触发自动Freeze操作 - 计算逻辑颠倒,应该用阈值减去当前已使用的XID年龄,才能得到距离触发还有多少剩余空间
修正后的查询语句
SELECT n.nspname AS schema_name, c.relname AS table_name, age(c.relfrozenxid) AS current_freeze_age, current_setting('vacuum_freeze_table_age')::int8 AS freeze_threshold, current_setting('vacuum_freeze_table_age')::int8 - age(c.relfrozenxid) AS left_for_vacuum_freeze FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.relkind IN ('r', 'm', 't') -- 普通表、物化视图、TOAST表 AND n.nspname NOT LIKE 'pg_temp%' AND n.nspname NOT IN ('pg_catalog', 'information_schema'); -- 排除系统模式
结果解读
current_freeze_age:表当前的冻结XID年龄freeze_threshold:触发自动Freeze的阈值(由vacuum_freeze_table_age参数定义)left_for_vacuum_freeze:距离触发自动Freeze剩余的XID数量,数值为正表示还有缓冲空间,为负说明已经超过阈值,建议手动执行VACUUM FREEZE处理
内容的提问来源于stack exchange,提问作者Gerzzog
相关产品推荐
相关产品推荐

