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