如何列出最近24小时内数据变化的所有表?

How list all tables with data changes in the last 24 hours?

我们遇到了一个丑陋的问题,平衡器错误地将一些请求重定向到具有与生产数据非常相似的数据的测试实例,现在我知道测试 Postgres 中记录了属于生产的数据

有没有办法在 Postgres 中列出最近 24 小时内数据变化的所有表?

Postgres 版本是 9.3,我有大约 250 个表。

First consider my comment.

9.4 及更高版本的 Postgres 本身不记录插入或更新行时的时间戳。

行 headers 中有一些 系统列可以帮助取证工作。行的物理顺序 (ctid) 可以 作为指标,如果 table 没有发生其他事情。在简单的情况下,新行在插入时附加到 table 的物理末尾,因此 ctid 指示最后插入的内容 - 直到 table 中发生任何更改。 Postgres 可以随意重新排列行的物理顺序,例如 VACUUM。 any UPDATE 也写入一个新的行版本,可以改变物理位置。新版本不必在table 的末尾。如果可能,Postgres 会尝试将新行版本保留在同一数据页上 (HOT update) ...

也就是说,这是一个简单的查询,用于获取给定 table:

物理上 最后一行
SELECT ctid, *
FROM   big
ORDER  BY ctid DESC
LIMIT  10;

dba.SE 上的相关答案以及详细信息:

插入事务 ID xmin 可能有用:

如果您恰好在事件发生之前有一个 备份 测试数据库,那么 有帮助。将旧状态恢复到测试数据库的单独模式并比较 tables ...

通常,我会在重要的 table 中添加一个或两个 timestamptz 列,用于记录插入行的时间和/或上次更新行的时间。 对您现在非常有用...

也对您有益:"temporal" features introduced in the SQL standard with SQL:2011。但这还没有在 Postgres 中实现。
有一个 page in the Postgres Wiki.
还有一个非官方的extension on PGXN。我没有测试过,不能说它有多远。

Postgres 9.5 引入了一个功能来记录 提交时间戳 (如 @Craig commented)。在开始录制之前需要手动启用。 The manual:

track_commit_timestamp (bool)

Record commit time of transactions. This parameter can only be set in postgresql.conf file or on the server command line. The default value is off.

And some functions to work with it.