pg_surgery 模块提供了各种函数来对损坏的关系执行操作。这些函数在设计上是不安全的,使用它们可能会损坏(或进一步损坏)您的数据库。例如,这些函数很容易被用来使表与其自身的索引不一致,导致 UNIQUE 或 FOREIGN KEY 约束冲突,甚至使元组可见,而当读取这些元组时,会导致数据库服务器崩溃。它们应非常谨慎地使用,并且仅作为最后的手段。
heap_force_kill(regclass, tid[]) returns voidheap_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 voidheap_force_freeze 将元组标记为冻结,而不检查元组数据。此函数的预期用途是使由于损坏的可见性信息而无法访问,或由于损坏的可见性信息而阻止表成功清理的元组可访问。例如
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)
Ashutosh Sharma <ashu.coek88@gmail.com>
如果您在文档中看到任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用此表格来报告文档问题。