pg_surgery

Модуль 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.
-- ОШИБКА: не удалось получить доступ к состоянию транзакции 4007513275
-- ПОДРОБНОСТИ: Не удалось открыть файл "pg_xact/0EED": нет такого файла или каталога

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"
-- ОШИБКА: xmin 507 обнаружен до relfrozenxid 515
-- КОНТЕКСТ: при сканировании блока 0 отношения "public.t1"

test=# SELECT ctid FROM t1 WHRER 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