Postgresql 中文操作指南

F.34. pg_surgery — perform low-level surgery on relation data #

pg_surgery 模块提供各种功能来对损坏的关系进行手术。这些功能设计上是不安全的,使用它们可能会损坏(或进一步损坏)你的数据库。例如,这些功能很容易用于使一个表与其自己的索引不一致,导致 UNIQUEFOREIGN KEY 约束违规,甚至使当读出时将导致数据库服务器崩溃的元组可见。它们应该非常谨慎地仅作为最后的手段使用。

F.34.1. Functions #

  • heap_force_kill(regclass, tid[]) returns 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[]) returns 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.34.2. Authors #