确定数据库中的表是否需要 vacuum 操作 - Amazon Relational Database Service

确定数据库中的表是否需要 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 更积极,但对整个系统来说也更具侵入性。

我们建议执行下列操作: