我们有一个丑陋的问题,错误地,平衡器将一些请求重定向到一个测试实例,其数据与生产相当,现在我知道测试Postgres中有数据属于生产
有没有办法在Postgres中列出过去24小时内数据变化的所有表格?
Postgres版本是9.3,我有大约250个表。
答案 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_timestamp
(bool
)记录交易的提交时间。此参数只能在中设置
postgresql.conf
文件或服务器命令行。默认值 是off
。