PostgreSQL vacuum工作原理

1 惰性冻结

1.1 发生条件

freezeLimit_txid=(OldestXmin−vacuum_freeze_min_age)

1.2 冻结的流程

2 急性冻结

2.1 发生条件

pg_database.datfrozenxid<(OldestXmin−vacuum_freeze_table_age)

2.2 冻结流程

2.2.1 9.6之前的冻结

2.2.2 9.6之后的冻结

在完成清理过程之前,必要时会更新pg_database.datfrozenxid。每个pg_database.datfrozenxid列都包含相应数据库中的最小pg_class.relfrozenxid。如果在迫切模式下仅仅对表1做冻结处理,则不会更新该数据库的pg_database.datfrozenxid,因为其他关系的pg_class.relfrozenxid(当前数据库可见的其他表和系统视图)还没有发生变化,如图6.5(1)所示。如果当前数据库中的所有关系都以迫切模式冻结,则数据库的pg_database.datfrozenxid 就会被更新,因为此数据库的所有关系的 pg_class.relfrozenxid 都被更新为当前的freezeLimit txid,如图6.5(2)所示。

3 冻结信息查询

3.1 数据库

SELECT datname, datfrozenxidFROM pg_databaseWHERE datname= 'testdb';

3.2 表

SELECT n.nspname as "Schema", c.relname as "Name", c.relfrozenxid
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid= c.relnamespace
WHERE c.relkind IN ('r','')
AND n.nspname <> 'information_schema' AND n.nspname!~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY c.relfrozenxid::text::bigint DESC;

3.3 删除不需要的CLOG

Postgresql CLOG 的作用