https://gitcode.com/gh_mirrors/pg/pg_dirtyread.git
pg_dirtyread
pg_dirtyread 扩展提供了从关系(表)中读取已死亡但未被清理的行的能力。支持 PostgreSQL 9.2 及以后的版本。(在 9.2 版本中,至少需要 9.2.9 版本。)
构建
要构建 pg_dirtyread,只需执行以下操作:
make make install
如果您遇到类似以下错误:
make: pg_config: Command not found
请确保您已安装 pg_config 并且它在您的系统路径中。如果您使用像 RPM 这样的包管理器来安装 PostgreSQL,请确保也安装了 -devel 包。如有必要,告诉构建过程在哪里可以找到它:
make PG_CONFIG=/path/to/pg_config make install PG_CONFIG=/path/to/pg_config
加载与使用
一旦 pg_dirtyread 被构建并安装,您可以将其添加到一个数据库中。加载 pg_dirtyread 非常简单,只需以超级用户的身份连接到数据库,然后运行以下命令:
CREATE EXTENSION pg_dirtyread;
SELECT * FROM pg_dirtyread('tablename') AS t(col1 type1, col2 type2, ...);
pg_dirtyread() 函数返回 RECORD 类型,因此必须附加一个表别名子句来描述表结构。列的匹配是通过名称进行的,所以在别名中可以省略某些列,或者重新排列列。
例如:
CREATE EXTENSION pg_dirtyread;
-- Create table and disable autovacuum
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
已删除列
只要表格没有被重写(例如通过 VACUUM FULL 或 CLUSTER),就可以检索到已删除列的内容。使用 dropped_N 来访问第 N 列,从 1 开始计数。PostgreSQL 删除了原始列的类型信息,因此在表别名中指定了正确的类型后,只能进行一些基本的合理性检查;检查的内容包括类型长度、类型对齐、类型修饰符以及按值传递。
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') ab(a text, dropped_2 text);
a │ dropped_2
───────┼───────────
Hello │ World
系统列
系统列如 xmax 和 ctid 可以通过在 pg_dirtyread() 调用附加的表别名中包含它们来检索。提供了一个布尔类型的特殊列 dead,用以报告死亡行(如 HeapTupleIsSurelyDead)。在恢复期间,dead 列不可用,特别是在备用服务器上。oid 列仅在 PostgreSQL 版本 11 及以前版本中可用。
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);
tableoid │ ctid │ xmin │ xmax │ cmin │ cmax │ dead │ bar │ baz
──────────┼───────┼──────┼──────┼──────┼──────┼──────┼─────┼───────────────────
41823 │ (0,1) │ 1484 │ 1485 │ 0 │ 0 │ t │ 1 │ Delete
41823 │ (0,2) │ 1484 │ 0 │ 0 │ 0 │ f │ 2 │ Insert
41823 │ (0,3) │ 1484 │ 1486 │ 0 │ 0 │ t │ 3 │ Update
41823 │ (0,4) │ 1484 │ 1488 │ 0 │ 0 │ f │ 4 │ Not deleted
41823 │ (0,5) │ 1484 │ 1489 │ 1 │ 1 │ f │ 5 │ Not updated
41823 │ (0,6) │ 1486 │ 0 │ 0 │ 0 │ f │ 3 │ Updated
41823 │ (0,7) │ 1489 │ 0 │ 1 │ 1 │ t │ 5 │ Not quite updated
41823 │ (0,8) │ 1490 │ 0 │ 2 │ 2 │ t │ 6 │ Not inserted
作者
pg_dirtyread 1.0 版本由 Phil Sorber 于 2012 年编写。Christoph Berg 在 2017 年发布的 1.1 版本中添加了检索系统列的能力,并接管了后续的维护工作。
许可
版权所有 (c) 1996-2024,PostgreSQL 全球开发组
版权所有 (c) 2012,OmniTI 计算机咨询公司
部分版权所有 (c) 1994,加利福尼亚大学校董会
保留所有权利。
在遵守以下条件的前提下,允许以源代码和二进制形式重新分发和使用(带或不带修改):
- 源代码的再分发必须保留上述版权声明、本条款清单以及以下免责声明。
- 二进制形式的再分发必须复制上述版权声明、本条款清单以及以下免责声明,并在随分发提供的文档或其它材料中予以说明。
- 未经具体书面事先许可,不得使用 OmniTI 计算机咨询公司或其贡献者的名称来支持或推广源自本软件的产品。
本软件按“现状”由版权持有者和贡献者提供,并明确或隐含地放弃任何保证,包括但不限于对适销性和特定目的适用性的隐含保证。无论在任何责任理论下,无论是合同、严格责任还是侵权(包括疏忽或其他),版权所有者或贡献者均不对任何直接、间接、偶然、特殊、示范性或后果性损害(包括但不限于购买替代品、使用损失、数据损失或利润损失;或业务中断)承担责任,即使已告知本软件的使用可能造成此类损害。