2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14
开发版本:开发版

F.32. pg_surgery — 对关系数据进行底层手术 #

pg_surgery 模块提供各种函数来对损坏的关系进行手术。这些函数的设计目的是不安全的,使用它们可能会损坏(或进一步损坏)您的数据库。例如,这些函数很容易被用来使表与其自身的索引不一致,导致 UNIQUEFOREIGN KEY 约束冲突,甚至使元组可见,而读取这些元组会导致数据库服务器崩溃。应谨慎使用这些函数,并且只应作为最后的手段。

F.32.1. 函数 #

heap_force_kill(regclass, tid[]) 返回 void

heap_force_kill已使用 行指针标记为 已删除,而不检查元组。此函数的预期用途是强制删除其他方式无法访问的元组。例如

test=> select * from t1 where ctid = '(0, 1)';
ERROR:  could not access status of transaction 4007513275
DETAIL:  Could not open file "pg_xact/0EED": No such file or directory.

test=# select heap_force_kill('t1'::regclass, ARRAY['(0, 1)']::tid[]);
 heap_force_kill
-----------------

(1 row)

test=# select * from t1 where ctid = '(0, 1)';
(0 rows)

heap_force_freeze(regclass, tid[]) 返回 void

heap_force_freeze 将元组标记为冻结,而不检查元组数据。此函数的预期用途是使由于损坏的可见性信息而无法访问的元组变得可访问,或者由于损坏的可见性信息而阻止表成功 vacuum 的元组。例如

test=> vacuum t1;
ERROR:  found xmin 507 from before relfrozenxid 515
CONTEXT:  while scanning block 0 of relation "public.t1"

test=# select ctid from t1 where xmin = 507;
 ctid
-------
 (0,3)
(1 row)

test=# select heap_force_freeze('t1'::regclass, ARRAY['(0, 3)']::tid[]);
 heap_force_freeze
-------------------

(1 row)

test=# select ctid from t1 where xmin = 2;
 ctid
-------
 (0,3)
(1 row)

F.32.2. 作者 #

Ashutosh Sharma

提交更正

如果您在文档中看到任何不正确的内容、不符合您对特定功能的体验或需要进一步澄清,请使用 此表格 报告文档问题。