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

问题描述 投票:0回答:1

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

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

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

postgresql database-backups last-modified
1个回答
8
投票

首先考虑我的评论。

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

以及一些与之配合使用的功能。

© www.soinside.com 2019 - 2024. All rights reserved.