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

mar*_*eth 4 postgresql last-modified database-backups

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

有没有办法列出Postgres过去24小时内所有数据变化的表格?

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

Erw*_*ter 8

首先考虑我的评论.
Postgres直到包括9.4本身不会记录插入或更新行时的时间戳.

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

也就是说,这是一个简单的查询来获取给定表的物理上最后一行:

SELECT ctid, *
FROM   big
ORDER  BY ctid DESC
LIMIT  10;
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请联系dba.SE:

插入事务ID xmin可能很有用:

如果您碰巧在事件发生前就有了备份测试数据库,那将会很有帮助.将旧状态恢复到测试数据库的单独模式并比较表...

通常,我会timestamptz在插入行时和/或上次更新时为重要表添加一列或两列.那对你来说非常有用......

什么也非常适合你:在与SQL SQL标准引入了"时间"的特点:2011.但是,这还没有在Postgres中实现.Postgres Wiki中
有一个页面.PGXN
还有一个非正式的扩展.我没有测试它,也不能说它有多远.

Postgres 9.5引入了一个记录提交时间戳的功能(如@Craig评论).
文件:

track_commit_timestamp(bool)

记录事务的提交时间.此参数只能在 postgresql.conf文件中或服务器命令行中设置.默认值为off.

还有一些功能可以使用它.