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

时间:2015-09-10 22:13:03

标签: postgresql database-backups last-modified

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

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

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

1 个答案:

答案 0 :(得分:7)

First consider my comment.
Postgres直到包括9.4本身不会记录插入或更新行时的时间戳。

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

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

SELECT ctid, *
FROM   big
ORDER  BY ctid DESC
LIMIT  10;

关于dba.SE的相关答案,详细信息:

插入交易ID xmin 非常有用:

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

通常,我会在插入行时和/或上次更新行时向重要表添加一个或两个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 documentation:

  

track_commit_timestampbool

     

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

And some functions to work with it.