pg_dirtyread
从表中读取尚未垃圾回收的行
仓库
df7cb/pg_dirtyread
https://github.com/df7cb/pg_dirtyread
源码
pg_dirtyread-2.7.tar.gz
pg_dirtyread-2.7.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_dirtyread | 2.7 | ADMIN | BSD 3-Clause | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 5050 | pg_dirtyread | 否 | 是 | 否 | 是 | 否 | 是 | - |
| 相关扩展 | pg_orphaned pg_surgery pageinspect pg_visibility pg_cheat_funcs amcheck pg_repack pg_squeeze |
|---|
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PGDG | 2.7 | 1817161514 | pg_dirtyread | - |
| RPM | PGDG | 2.7 | 1817161514 | pg_dirtyread_$v | - |
| DEB | PGDG | 2.7 | 1817161514 | postgresql-$v-dirtyread | - |
安装
您可以直接安装 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 允许读取尚未被 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 FULL 或 CLUSTER):
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 列在恢复期间(例如备用服务器上)不可用。