PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 15.9 » Annexes » Modules supplémentaires fournis » pg_surgery

F.34. pg_surgery

Le module pg_surgery fournit différentes fonctions pour réaliser des opérations sur une relation endommagée. Ces fonctions sont dangereuses de par leur concept et les utiliser pourrait corrompre (ou corrompre encore plus) votre bases de données. Par exemple, ces fonctions peuvent facilement être utilisées pour rendre une table incohérente avec ses propres index, causant des violations de contraintes UNIQUE ou FOREIGN KEY, voire même de rendre des lignes visibles qui, lorsqu'elles sont lues, vont causer un crash du serveur de bases de données. Vous devez faire très attention en les utilisant. Leur utilisation doit rester pour les cas désespérés.

F.34.1. Fonctions

heap_force_kill(regclass, tid[]) returns void

heap_force_kill marque les pointeurs de lignes « utilisées » comme « mortes » sans examiner les lignes. Le but de cette fonction est de forcer la suppression de lignes autrement inaccessibles. Par exemple :

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 marque les lignes comme gelées sans examiner les données des lignes. Le but de cette fonction est de rendre accessibles des lignes qui étaient auparavant inaccessibles à cause de la corruption des informations de visibilité, ou qui empêchaient la réussite d'un vacuum sur la table à cause de corruption sur les informations de visibilité. Par exemple :

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. Auteurs

Ashutosh Sharma