pg_surgeryモジュールは、破損したリレーションに対して手術を行うための様々な関数を提供します。
これらの関数は設計上安全ではなく、使用することによってデータベースを破損する(あるいは既存の破損を更に拡大する)可能性があります。
たとえば、これらの関数を使用することによって簡単にテーブルは自身のインデックスと一貫性がなくなり、UNIQUEあるいはFOREIGN KEY制約の違反が生じたり、更には読み出すことによってデータベースサーバをクラッシュさせるタプルを可視状態にすることさえあります。
これらの関数は使用にあたっては十分に注意するとともに、最後の手段としてのみ使用すべきです。
heap_force_kill(regclass, tid[]) returns void
heap_force_killはタプルを調べることなく「使用中」ラインポインタ(line pointer)に「削除済み(dead)」の印を付けます。
この関数はアクセスする方法がないタプルを強制的に削除するために使用することを意図しています。
例を示します。
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>