Skip to content

数据库年龄

背景

数据库的事务标识符使用的是32位的,最大可表示42个亿。当前事务的数据在20亿个事务之后将变的不可见。为了解决这个问题(回卷),Postgres引入了一个冻结事务标识的概念。 并实现了名为freeze的冻结过程。

冻结过程

两种模式

  • 惰性模式

  • 迫切模式

惰性模式回跳过页中所有的数据都位可见的数据库块(由数据库中的vm可见性映射)

迫切模式会扫描所有的页,检查表中的所有元组。并可能删除不必要的clog文件与页面。

改进的迫切模式,会跳过页面中所有的元组都已被冻结过的页面

首先介绍几个数据库值

 -- 当前事务号
 select txid_current();

 -- 记录事务号
 select xmax,xmin ,* from table_name where xxxx;

 -- 表年龄, 表中最老行的事务号
 select age(relfrozenxid) from pg_class where relname = table_name;

 -- database 年龄
 select datname , age(datfrozenxid) from pg_database ;

 -- 数据配置
 show vacuum_freeze_min_age ; -- 默认值5千万

 show vacuum_freeze_table_age ; -- 默认值1.5亿

 show autovacuum_freeze_max_age ; -- 默认值2亿

 show autovacuum_naptime ; -- 默认值1 分钟
触发条件

当前年龄大于5千万时 惰性模式 当前库年龄大于1.5亿时 迫切模式

冻结后修改表和库的 relfrozenxid,datfrozenxid 值。

手动冻结
 vacuum freeze 

由于冻结的过程会占用数据库系统的资源。可根据当前数据的年龄在业务低峰期进行手动冻结,降低对业务的影响。