PostgreSQL中的冻结管理

版权声明:本文为博主原创之文章,未经博主允许谢绝转载。 https://blog.csdn.net/pg_hgdb/article/details/87856110

PostgreSQL将事务ID分成两部分:过去20亿是可见的,未来20亿是不可见的。所有可见行必须始终存在于过去的20亿中。未来的对于当前事务是不可见的。

PostgreSQL通过专门标记旧行来避免这种数据丢失问题。

冻结(Freezing)是标记旧的实时元组(即数据库行)的进程。它与vacuum相反,vacuum是旧的死元组占用的空间,任何事务都不可见。这两个进程都是由vacuum管理的。

有多种管理冻结的方式,例如:

1)vacuum_freeze_min_age参数控制一个元组是否会被冻结,同时vacuum查看页面中是否有可以清理的死元组。 在这种情况下,将冻结早于vacuum_freeze_min_age的元组。默认设置为5000万。虽然用户可以将此值设置为0到10亿,但是VACUUM会将有效值限制为autovacuum_freeze_max_age的一半,这样强制自动清理之间的时间间隔就不会太短。

这同样适用于vacuum_multixact_freeze_min_age参数。在multixacts中,VACUUM用于决定在扫描表时是否用新的事务ID或multixact ID替换multixact ID,默认值为500万。虽然用户可以将此值设置为0到10亿,但是VACUUM会将有效值无限制地限制为autovacuum_multixact_freeze_max_age值的一半。
请注意,transaction_id和multixid计数器是独立的,都需要进行追踪。

2)vacuum_freeze_table_age和vacuum_multixact_freeze_table_age这两个参数。这些设置控制autovacuum何时不只查看可能有死行的页面,而是查看可能有未冻结行的页面。 这些参数的默认值为1.5亿。

3)autovacuum_freeze_max_age参数。指定在事务中表的pg_class的最大年龄,默认值为2亿。 类似地,autovacuum_multixact_freeze_max_age的默认值为4亿。我们可以采取两种方式。 首先,最常见的方式是增大这些参数值,例如达到10亿左右,特别是在事务量很大的系统上。 其次,在任何数据库遇到此问题之前,需要监控系统并采取补救措施。这是非常重要的,补救措施通常包括手动执行vacuum。

综上所述,监视数据库群集对于管理来说至关重要。 特别是需要监视群集中每个数据库的datfrozenxid和datminmxid,如果这些数据太旧,则需要采取补救措施。 通常情况下,问题出现于数据库中的一个或几个表。通过检查数据库中表的relfrozenxid和relminmxid可以发现这些问题。

By Kalath

猜你喜欢

转载自blog.csdn.net/pg_hgdb/article/details/87856110