确定数据库中的表是否需要 vacuum 操作
您可以使用以下查询显示数据库中未执行 vacuum 操作的事务的数目。数据库的 datfrozenxid
行的 pg_database
列是显示在该数据库中的正常事务 ID 的下限。此列是数据库中每个表的 relfrozenxid
值的最小值。
SELECT datname, age(datfrozenxid) FROM pg_database ORDER BY age(datfrozenxid) desc limit 20;
例如,运行上述查询的结果可能如下所示。
datname | age mydb | 1771757888 template0 | 1721757888 template1 | 1721757888 rdsadmin | 1694008527 postgres | 1693881061 (5 rows)
当数据库的期限达到 20 亿个事务 ID 时,事务 ID (XID) 重叠将出现,并且数据库将变成只读状态。您可以使用此查询来生成指标,并且一天可运行几次。默认情况下,将设置 Autovacuum 以确保事务期限不超过 200000000 ()。autovacuum_freeze_max_age
示例监控策略可能类似于:
-
将
autovacuum_freeze_max_age
值设置为 2 亿个事务。 -
如果表达到 5 亿个未执行 vacuum 操作的事务,则这会触发低严重性警报。这不是一个不合理的值,但它可能指示 Autovacuum 未保持同步。
-
如果表期限为 10 亿,这应被视为要采取操作的警报。通常,您出于性能原因,需要使期限更接近
autovacuum_freeze_max_age
。建议您使用以下建议进行调查。 -
如果表达到 15 亿个未执行 vacuum 操作的事务,则这会触发高严重性警报。根据数据库使用事务 ID 的频率,此警报将指示系统运行 Autovacuum 的时间不多了。在这种情况下,建议您立即解决此问题。
如果表持续违反这些阈值,请进一步修改 autovacuum 参数。默认情况下,手动使用 VACUUM(已禁用基于成本的延迟)比使用默认的 Autovacuum 更积极,但对整个系统来说也更具侵入性。
我们建议执行下列操作:
-
了解和启用监控机制,以便您了解最早的事务的期限。
有关创建提醒您事务 ID 重叠的过程的信息,请参阅 AWS 数据库博客帖子 Implement an early warning system for transaction ID wraparound in Amazon RDS for PostgreSQL
。 -
对于更复杂的表,在维护时段内定期执行手动 vacuum 冻结操作,并依赖 Autovacuum。有关执行手动 vacuum 冻结的信息,请参阅 执行手动 vacuum 冻结。