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)