为什么 pg_last_xact_replay_timestamp() 有时会返回非常旧的时间戳?

Tob*_*ale 6 postgresql replication monitoring

在 PostgreSQL 9.5 中,为了监控流复制延迟,我使用了以下组合:

  • pg_current_xlog_location()
  • pg_last_xlog_replay_location()
  • pg_last_xact_replay_timestamp()

前两个函数用于确定主备之间是否存在任何滞后。如果有一些滞后,那么我确定它:

select now() - pg_last_xact_replay_timestamp();
Run Code Online (Sandbox Code Playgroud)

大多数情况下,它返回合理的数量——几秒到几分钟的滞后。但是,该语句偶尔会返回不太可能的大值。几天的滞后。

我们的系统中没有任何交易运行那么长时间,甚至没有关闭。

谁能建议这里发生了什么?

Dre*_*fer 1

从未来回答这个问题 - 当我看到这个时,这意味着有一段时间没有对主(上游)数据库进行任何写入。

如果主服务器上没有最近的事务,则从服务器上也没有最近的事务可以重播,因此pg_last_xact_replay_timestamp()只会报告上次写入主服务器的时间。