Postgresql поврежденная таблица pg_catalog - PullRequest
0 голосов
/ 04 ноября 2019

Я запустил базу данных postgres на внешнем жестком диске, и кажется, что она была повреждена после повторного подключения к спящему ноутбуку, ЧТО ДУМАЛ, что сервер все еще работает. После выполнения нескольких команд переиндексации для исправления некоторых других ошибок, я получаю следующую ошибку:

ОШИБКА: отсутствует номер блока 0 для значения тоста 12942 в pg_toast_2618

Пример командычто возвращает эту ошибку:

select table_name, view_definition from INFORMATION_SCHEMA.views;

Я запустил команду "select 2618 :: regclass;"это дает вам таблицу проблем. Однако переиндексация, похоже, не решает проблему. Я вижу много предложений о том, как найти поврежденную строку и удалить ее. Тем не менее, таблица, которая, по-видимому, имеет повреждение в моем экземпляре, называется pg_rewrite, и она выглядит не как поврежденная строка, а как поврежденная КОЛОННА.

Я выполнил следующие команды, но они не решают проблему.

REINDEX table pg_toast.pg_toast_$$$$;
REINDEX table pg_catalog.pg_rewrite;
VACUUM ANALYZE pg_rewrite; -- just returns succeeded.

Я могу выполнить следующую инструкцию SQL, и она вернет данные.

SELECT oid, rulename, ev_class, ev_type, ev_enabled, is_instead, ev_qual FROM pg_rewrite;

Однако, если я добавлю столбец ev_action к вышеупомянутому запросу, он выдаст похожую ошибку:

ОШИБКА: отсутствует номер фрагмента 0 для значения тоста 11598 в pg_toast_2618

Эта ошибка появляетсявлиять на все запросы, связанные со схемой, на такие вещи, как таблицы INFORMATION_SCHEMA. К счастью, кажется, что все мои таблицы и данные в моих таблицах в порядке, но я не могу запросить sql, который генерирует эти таблицы, и любые созданные мной представления кажутся недоступными (хотя я заметил, что могу создавать новые представления).

Я недостаточно знаком с Postgresql, чтобы точно знать, что такое pg_rewrite, но, полагаю, я не могу просто обрезать данные в таблице или установить ev_action = null.

Я не уверен, что делать дальше с информацией, которую я собрал.

1 Ответ

2 голосов
/ 06 ноября 2019

(по крайней мере) ваш каталог pg_rewrite поврежден данными. Эта таблица содержит определение всех представлений, включая системные представления, необходимые для работы системы.

Лучше всего восстановить резервную копию.

Вы не сможетечтобы восстановить работоспособность базы данных, лучшее, что вы можете сделать, - это сохранить как можно больше данных.

Попробуйте pg_dump. Я не знаю, нужны ли для этого какие-либо взгляды, но если это работает, это хорошо. Вам придется явно исключить все представления из дампа, иначе он скорее всего потерпит неудачу.

Если это не сработает, попробуйте использовать COPY для каждой таблицы, чтобы вывести хотя бы данные. Метаданные будут более сложными.

Если это важная база данных, наймите эксперта.

...