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