pg_dirtyread

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

概览

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

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG2.71817161514pg_dirtyread-
RPMPGDG2.71817161514pg_dirtyread_$v-
DEBPGDG2.71817161514postgresql-$v-dirtyread-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
d12.aarch64
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
d13.x86_64
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
d13.aarch64
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
u22.x86_64
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
u22.aarch64
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
u24.x86_64
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
u24.aarch64
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7
PGDG 2.7

安装

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

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

使用 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;

用法

pg_dirtyread: 读取已删除但未被清理的死元组

pg_dirtyread 允许读取尚未被 VACUUM 清理的死元组(已删除/已更新的行)。该函数返回 RECORD 类型,因此需要描述模式的表别名。

基本用法

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);
 bar |   baz
-----+----------
   1 | Test
   2 | New Test

已删除的列

使用 dropped_N(第 N 列,从 1 开始)访问已删除列的内容,前提是表未被重写(例如通过 VACUUM FULLCLUSTER):

ALTER TABLE ab DROP COLUMN b;
DELETE FROM ab;
SELECT * FROM pg_dirtyread('ab') ab(a text, dropped_2 text);

系统列

在别名中包含系统列即可获取它们。特殊的 dead 布尔列标识死元组:

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 列在恢复期间(例如备用服务器上)不可用。


最后修改 2026-03-14: update extension metadata (953cbd0)