在 Aurora PostgreSQL 中解除无法识别的真空拦截器
本节探讨了可能阻碍清理取得进展的其他原因。postgres_get_av_diag()
函数目前无法直接识别这些问题。
索引不一致
逻辑上不一致的索引可能会阻碍自动真空取得进展。在索引的真空阶段或 SQL 语句访问索引时,将记录以下错误或类似错误。
ERROR: right sibling's left-link doesn't match:block 5 links to 10 instead of expected 2 in index
ix_name
ERROR: failed to re-find parent key in index "XXXXXXXXXX" for deletion target page XXX CONTEXT: while vacuuming index
index_name
of relationschema.table
指南
在手动 VACUUM FREEZE
上使用 INDEX_CLEANUP
重建索引或跳过索引。
-
使用 CONCURRENTLY 选项 – 在 PostgreSQL 版本 12 之前,重建索引需要独占的表锁定,从而限制对表的访问。在 PostgreSQL 版本 12 及更高版本中,CONCURRENTLY 选项允许行级别锁定,从而显著提高表的可用性。命令如下:
REINDEX INDEX ix_name CONCURRENTLY;
虽然 CONCURRENTLY 的破坏性较小,但在繁忙的表中其速度可能会变慢。如果可能,可以考虑在流量较低的时段构建索引。有关更多信息,请参阅 PostgreSQL 文档中的 REINDEX
。 -
使用 INDEX_CLEANUP FALSE 选项 – 如果索引很大并且估计需要大量时间才能完成,则您可以通过在排除索引的同时执行手动 VACUUM FREEZE 来解除阻止 autovacuum。PostgreSQL 版本 12 及更高版本中提供了此功能。
绕过索引将允许您跳过索引不一致的真空过程并缓解重叠问题。但是,这样并不能解决潜在的无效页面问题。要完全应对和解决无效页面问题,您仍然需要重建索引。
事务速率异常高
在 PostgreSQL 中,事务速率高会显著影响自动真空的性能,从而导致无效元组的清理速度变慢,并增加事务 ID 重叠的风险。您可以通过衡量两个时间段之间的 max(age(datfrozenxid))
差异(通常为每秒)来监控事务速率。此外,您还可以使用 RDS 性能详情中的以下计数器指标来衡量事务速率(xact_commit 与 xact_rollback 之和),即事务总数。
计数器 | 类型 | 单位 | 指标 |
---|---|---|---|
xact_commit |
事务 |
每秒提交数 |
db.Transactions.xact_commit |
xact_rollback |
事务 |
每秒回滚数 |
db.Transactions.xact_rollback |
快速增加表示高事务负载,这可能会使自动真空不堪重负,从而导致膨胀、锁争用和潜在的性能问题。这样可能会以多种方式对自动真空进程产生负面影响:
-
表活动:正在经历清理操作的特定表可能会遇到大量事务,从而导致延迟。
-
系统资源:整个系统可能会过载,使自动真空难以访问必要的资源以便高效运行。
请考虑以下策略,以允许自动真空更有效地运行并跟上其任务:
-
如果可能,请降低事务速率。请考虑在可行的情况下对类似的事务进行批处理或分组。
-
在非高峰时段,每晚、每周或每两周通过手动
VACUUM FREEZE
操作来定位频繁更新的表。 -
请考虑扩展您的实例类以分配更多系统资源来处理高事务量和自动真空操作。