我们遇到了一个丑陋的问题,平衡器错误地将一些请求重定向到与生产数据非常相似的测试实例,现在我知道测试 Postgres 中记录了属于生产的数据
有没有办法列出Postgres中最近24小时内有数据变化的所有表?
Postgres 版本是 9.3,我有大约 250 个表。
Postgres 9.4 及之前版本本身不会记录插入或更新行时的时间戳。
行标题中有一些系统列可以帮助进行取证工作。如果此后表没有发生任何其他事情,则行的物理顺序 (
ctid
) can 可以作为指示符。在简单的情况下,新行在插入时会附加到表的物理末尾,因此 ctid
指示最后插入的内容 - 直到表中发生任何更改。 Postgres 可以随意重新排列行的物理顺序,例如使用 VACUUM
。任何UPDATE
也会写入一个新的行版本,可以改变物理位置。新版本不必位于表的末尾。如果可能的话,Postgres 尝试在同一数据页上保留新的行版本(热更新)...
也就是说,这是一个简单的查询,用于获取给定表的物理最后一行:
SELECT ctid, *
FROM tbl
ORDER BY ctid DESC
LIMIT 10;
ctid
在范围内不是唯一的。参见:
dba.SE上的相关解答及详细信息:
插入事务 ID
xmin
很有用:
如果您碰巧在事件发生之前有测试数据库的备份,那么将会很有帮助。将旧状态恢复到测试数据库的单独模式并比较表...
通常,我会在插入行和/或上次更新行时向重要表中添加一到两个
timestamptz
列。那将会现在对你非常有用......
什么会对您也有好处:SQL 标准中引入的“时间”功能 SQL:2011。但这还没有在 Postgres 中实现。
Postgres Wiki 中有一个页面。
PGXN 上还有一个非官方的 扩展 。我没有测试过,不能说它有多远。
Postgres 9.5引入了一项功能来记录提交时间戳(如@Craig评论)。需要在开始录制之前手动启用。 说明书:
(track_commit_timestamp
)
bool
记录事务的提交时间。该参数只能在
文件或在服务器命令行上。默认值 是postgresql.conf
。
off