pg_dirtyread

从表中读取尚未垃圾回收的行

概览

扩展包名版本分类许可证语言
pg_dirtyread2.8ADMINBSD 3-ClauseC
ID扩展名BinLibLoadCreateTrustReloc模式
5050pg_dirtyread-
相关扩展pg_orphaned pg_surgery pageinspect pg_visibility pg_cheat_funcs amcheck pg_repack pg_squeeze

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED2.81817161514pg_dirtyread-
RPMPIGSTY2.81817161514pg_dirtyread_$v-
DEBPGDG2.81817161514postgresql-$v-dirtyread-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64
u26.x86_64
u26.aarch64

构建

您可以使用 pig build 命令构建 pg_dirtyread 扩展的 RPM 包:

pig build pkg pg_dirtyread         # 构建 RPM 包

安装

您可以直接安装 pg_dirtyread 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_dirtyread;          # 当前活跃 PG 版本安装
pig ext install -y pg_dirtyread -v 18  # PG 18
pig ext install -y pg_dirtyread -v 17  # PG 17
pig ext install -y pg_dirtyread -v 16  # PG 16
pig ext install -y pg_dirtyread -v 15  # PG 15
pig ext install -y pg_dirtyread -v 14  # PG 14
dnf install -y pg_dirtyread_18       # PG 18
dnf install -y pg_dirtyread_17       # PG 17
dnf install -y pg_dirtyread_16       # PG 16
dnf install -y pg_dirtyread_15       # PG 15
dnf install -y pg_dirtyread_14       # PG 14
apt install -y postgresql-18-dirtyread   # PG 18
apt install -y postgresql-17-dirtyread   # PG 17
apt install -y postgresql-16-dirtyread   # PG 16
apt install -y postgresql-15-dirtyread   # PG 15
apt install -y postgresql-14-dirtyread   # PG 14

创建扩展

CREATE EXTENSION pg_dirtyread;

用法

来源:upstream READMEDebian changelogtags

pg_dirtyread 可以读取尚未被 vacuum 清理掉的死亡或已更新堆表行。该函数返回 record,因此每次调用都需要带一个表别名,用来声明希望返回的列。

基本用法

CREATE EXTENSION pg_dirtyread;

SELECT *
FROM pg_dirtyread('foo') AS t(bar bigint, baz text);

列按名称匹配,因此别名可以省略部分列,也可以使用不同的列顺序。

示例

CREATE TABLE foo (bar bigint, baz text);
ALTER TABLE foo SET (autovacuum_enabled = false, toast.autovacuum_enabled = false);

INSERT INTO foo VALUES (1, 'Test'), (2, 'New Test');
DELETE FROM foo WHERE bar = 1;

SELECT * FROM pg_dirtyread('foo') AS t(bar bigint, baz text);

被删除的行在 vacuum 移除之前仍可能可见。

已删除的列

只要表还没有被 VACUUM FULLCLUSTER 等操作重写,就可以取回已删除列的内容。使用 dropped_N,其中 N 是原始的 1 基列序号:

CREATE TABLE ab(a text, b text);
INSERT INTO ab VALUES ('Hello', 'World');
ALTER TABLE ab DROP COLUMN b;
DELETE FROM ab;

SELECT *
FROM pg_dirtyread('ab') AS ab(a text, dropped_2 text);

由于 PostgreSQL 会移除已删除列的原始类型元数据,这里只能执行有限的类型检查。

系统列

在别名中包含系统列即可取回它们。特殊的 dead boolean 列会报告确定已经死亡的行:

SELECT *
FROM pg_dirtyread('foo') AS t(
  tableoid oid,
  ctid tid,
  xmin xid,
  xmax xid,
  cmin cid,
  cmax cid,
  dead boolean,
  bar bigint,
  baz text
);

dead 列在恢复期间不可用,包括在备用服务器上。oid 系统列只在 PostgreSQL 11 及更早版本中可用。

注意事项

  • Pigsty 将 pg_dirtyread 2.8 作为 PostgreSQL 14-18 的 RPM 打包;DEB 可用性来自 PGDG 的 postgresql-$v-dirtyread
  • 上游 2.8 是面向 PostgreSQL 19 默认 TOAST 压缩改为 lz4 的兼容性发布;没有记录新的面向用户 SQL 函数。
  • pg_dirtyread 用于取证和恢复类检查。它绕过常规 MVCC 可见性预期,不应被用于应用读取。

最后修改 2026-06-18: extension data update (63e2bd9)