pg_surgery 模块提供多个函数,用于对受损关系执行修复操作。这些函数在设计上就是不安全的,使用它们可能损坏(或进一步损坏)你的数据库。例如,这些函数很容易被用来使表与其自身的索引不一致、造成 UNIQUE 或 FOREIGN KEY 约束违反,甚至使某些元组变为可见,而读取这些元组将导致数据库服务器崩溃。使用这些函数务必极其谨慎,并且只应作为最后的手段。
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 在不检查元组数据的情况下将元组标记为冻结。该函数的预期用途是让那些由于可见性信息损坏而无法访问的元组变得可访问,或者让那些由于可见性信息损坏而阻碍表被成功清理的元组恢复正常。例如:
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>