Перейти к основному содержимому

pg_surgery — низкоуровневые операции с данными отношений

примечание

Эта страница переведена при помощи нейросети GigaChat.

Модуль 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)