他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

F.32. pg_surgery

pg_surgeryモジュールは、破損したリレーションに対して手術を行うための様々な関数を提供します。 これらの関数は設計上安全ではなく、使用することによってデータベースを破損する(あるいは既存の破損を更に拡大する)可能性がありま す。 たとえば、これらの関数を使用することによってテーブルが所有するインデックスとの一貫性が簡単に一貫性がなくなり、UNIQUEあるいはFOREIGN KEY制約の違反が生じたり、更には読み出すことによってデータベースサーバをクラッシュさせるタプルを可視状態にすることさえあります。 これらの関数は使用にあたっては十分に注意するとともに、最後の手段としてのみ使用すべきです。

F.32.1. 関数

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)

F.32.2. 作者

Ashutosh Sharma