问题描述
我继承了一个现有的充满数据的 Postgres 数据库.大多数数据都有一个"created_date"列值.一些较早的数据是在跟踪之前插入的.
是否有一个 Postgres 元数据表隐藏在某个地方,用于跟踪 INSERT 查询何时完成?
推荐答案
Postgres 9.5 或更高版本
您可以启用 track_commit_timestamp 在 postgresql.conf (并重新启动)开始跟踪提交时间戳.然后,您可以获得 xmin 的时间戳.相关答案:
Postgres 9.4 或更早版本
PostgreSQL 中没有这样的元数据,除非你自己记录.
您也许可以从 行标题 (HeapTupleHeaderData),特别是来自插入事务 id xmin.它保存插入行的事务的 ID(需要确定 PostgreSQL 的 MVCC 模型).尝试(对于任何表):
SELECT xmin, * FROM tbl LIMIT 10;
有一些限制:
- 如果数据库被转储并恢复,那么显然信息就消失了 - 所有行都插入到同一个事务中.
- 如果数据库很大/很旧/写得很重,那么它可能已经经历了 事务ID环绕,xmin中的数字顺序不明确.
但对于大多数数据库,您应该能够推导出:
- INSERT 的时间顺序
- 将哪些行插入在一起
- 当插入之间(可能)有很长一段时间
不过没有时间戳.