【问题标题】:How list all tables with data changes in the last 24 hours?如何列出过去 24 小时内所有数据变化的表?
【发布时间】:2015-09-10 22:13:02
【问题描述】:

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

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

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

【问题讨论】:

  • 之前你做任何其他事情:立即关闭测试数据库集群并制作整个数据库数据目录的文件级副本。内部数据和/或当前行的物理顺序可能包含有价值的线索 - 直到您对表执行其他操作(包括 VACUUM)。再次启动数据库集群后,还要绘制测试数据库的普通备份。

标签: postgresql database-backups last-modified


【解决方案1】:

First consider my comment.

9.4 及以下版本的 Postgres 本身不记录插入或更新行时的时间戳。

行标题中有一些系统列可以帮助进行取证工作。行的物理顺序 (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 manual:

track_commit_timestamp (bool)

记录事务的提交时间。该参数只能在 postgresql.conf 文件或服务器命令行上。默认值 是off

And some functions to work with it.

【讨论】:

  • 提交时间戳,在 9.5 中引入,如果启用,也会对此有所帮助。
  • @Craig:非常有趣。对于手头的情况来说将是黄金。 9.5 手册中的详细信息:postgresql.org/docs/9.5/static/…postgresql.org/docs/9.5/static/… 如果您不介意,我会将其添加到我的答案中。
  • 当然,去吧。请注意,提交时间戳收集必须事先启用,并且提交时间戳信息不会无限期保留。
  • @martinkenneth:我添加了一个示例查询和一些链接。
  • @martinkenneth:顺便说一句,question you linked 适用于 MySQL,而答案根本不适用于 Postgres。
猜你喜欢
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多