【问题标题】:Postgres 9.6 -> 14 using pglogical, autovacuum not runningPostgres 9.6 -> 14 使用 pglogical,autovacuum 未运行
【发布时间】:2022-09-28 03:00:28
【问题描述】:

我们正在使用 pglogical(最新通过 yum 安装)将 Postgresql 从 9.6 升级到 14。复制工作正常,没有错误。然而,我们没有看到 v14 数据库上的任何 autovacuum 活动,即使我们继续在 v9.6 数据库上看到正常的 autovacuum 活动。此外,奇怪的是,死元组计数在 v14 数据库上没有变化,并且大多为 0。我确实在 v14 数据库上运行了VACUUM ANALYZE

我们用来查看 autovacuum 活动的命令是 SELECT relname, last_vacuum, last_autovacuum, last_autoanalyze FROM pg_stat_user_tables;

我们用来查看死元组计数的命令是 SELECT relname, n_dead_tup FROM pg_stat_user_tables;

除了检查点通知外,日志中没有任何内容。这是随机挑选的一行:

2022-09-22 11:59:46 PDT [2877]: [15846-1] user=,db=,app=,client= LOG: checkpoint complete: wrote 38220 buffers (0.9%); 0 WAL file(s) added, 0 removed, 17 recycled; write=269.923 s, sync=0.025 s, total=269.962 s; sync files=264, longest=0.007 s, average=0.001 s; distance=313936 kB, estimate=329901 kB

v14 数据库正在流式传输到另一个充当副本的 v14 数据库。

这是预期的行为吗?

  • 死元组通过 UPDATE/DELETE 而不是 INSERT/COPY 累积。您只是将数据从 9.6 -> 14 移动,还是 9.6 正在积极使用它正在复制更新和删除?
  • v9.6 数据库正在大量使用(网站的后端),包括更新/删除。正在传播删除。
  • 1) Postgres 日志是否显示任何相关信息? 2) 当您查询pg_stat_user_tables 时,您是否在正确的数据库中?因为该视图的范围仅限于当前数据库。
  • 除了检查点通知外,日志中没有任何内容(此节点未在生产中使用,但正在查询其流式副本)。我在原始问题中添加了一个有代表性的检查点日志行。我们在此节点上复制 6 个数据库,所有 6 个数据库的行为都是相同的。
  • 您是否关闭了 track_counts?

标签: postgresql pglogical


【解决方案1】:

经过实验,很明显n_dead_tup 计数在 pglogical 复制运行时不会更新。这也意味着 autovacuum 永远不会在 pglogical 复制运行时运行。重新启动 v14 节点会导致更新 n_dead_tup 计数并触发 autovacuum,但这是一次性事件(直到再次重新启动,元组才会再次更新)。

禁用 pglogical 后,n_dead_tup 计数会立即更新,并且 autovacuum 会按预期重新开始工作(即使没有重新启动)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多