pg_dirtyread
pg_dirtyread : Read dead but unvacuumed rows from table
Overview
| ID | Extension | Package | Version | Category | License | Language |
|---|---|---|---|---|---|---|
| 5050 | pg_dirtyread
|
pg_dirtyread
|
2.8 |
ADMIN
|
BSD 3-Clause
|
C
|
| Attribute | Has Binary | Has Library | Need Load | Has DDL | Relocatable | Trusted |
|---|---|---|---|---|---|---|
--s-d-r
|
No
|
Yes
|
No
|
Yes
|
yes
|
no
|
| Relationships | |
|---|---|
| See Also | pg_orphaned
pg_surgery
pageinspect
pg_visibility
pg_cheat_funcs
amcheck
pg_repack
pg_squeeze
|
Packages
| Type | Repo | Version | PG Major Compatibility | Package Pattern | Dependencies |
|---|---|---|---|---|---|
| EXT | MIXED
|
2.8 |
18
17
16
15
14
|
pg_dirtyread |
- |
| RPM | PIGSTY
|
2.8 |
18
17
16
15
14
|
pg_dirtyread_$v |
- |
| DEB | PGDG
|
2.8 |
18
17
16
15
14
|
postgresql-$v-dirtyread |
- |
| Linux / PG | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|
el8.x86_64
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
el8.aarch64
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
el9.x86_64
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
el9.aarch64
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
el10.x86_64
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
el10.aarch64
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
PIGSTY 2.8
|
d12.x86_64
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
d12.aarch64
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
d13.x86_64
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
d13.aarch64
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
u22.x86_64
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
u22.aarch64
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
u24.x86_64
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
u24.aarch64
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
u26.x86_64
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
u26.aarch64
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
PGDG 2.8
|
Source
pig build pkg pg_dirtyread; # build rpmInstall
Make sure PGDG and PIGSTY repo available:
pig repo add pgsql -u # add both repo and update cacheInstall this extension with pig:
pig install pg_dirtyread; # install via package name, for the active PG version
pig install pg_dirtyread -v 18; # install for PG 18
pig install pg_dirtyread -v 17; # install for PG 17
pig install pg_dirtyread -v 16; # install for PG 16
pig install pg_dirtyread -v 15; # install for PG 15
pig install pg_dirtyread -v 14; # install for PG 14Create this extension with:
CREATE EXTENSION pg_dirtyread;Usage
Sources: upstream README, Debian changelog, tags.
pg_dirtyread reads dead or updated heap rows that have not yet been vacuumed away. The function returns record, so every call needs a table alias that declares the columns you want back.
Basic Usage
CREATE EXTENSION pg_dirtyread;
SELECT *
FROM pg_dirtyread('foo') AS t(bar bigint, baz text);Columns are matched by name, so the alias can omit columns or place them in a different order.
Example
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);The deleted row can remain visible until vacuum removes it.
Dropped Columns
Dropped column contents can be retrieved as long as the table has not been rewritten by operations such as VACUUM FULL or CLUSTER. Use dropped_N, where N is the original 1-based column position:
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);Only limited type checks are possible because PostgreSQL removes the dropped column’s original type metadata.
System Columns
Include system columns in the alias to retrieve them. A special dead boolean column reports rows that are surely 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
);The dead column is not usable during recovery, including on standby servers. The oid system column is only available on PostgreSQL 11 and earlier.
Caveats
- Pigsty packages
pg_dirtyread2.8 as RPMs for PostgreSQL 14-18; DEB availability comes from PGDG aspostgresql-$v-dirtyread. - Upstream 2.8 is a PostgreSQL 19 compatibility release for the default TOAST compression change to
lz4; no new user-facing SQL function is documented. pg_dirtyreadis for forensic and recovery-style inspection. It bypasses normal MVCC visibility expectations and should not be used for application reads.