После сбоя диска БД теперь "поиск кэша для индекса не удался"

После решения некоторых проблем с сетевым диском, на котором была размещена наша база данных Postgres, мы столкнулись с этой ошибкой:

OperationalError: FATAL: cache lookup failed for index 2662

Эта конкретная ошибка произошла из командной строки Python, но другие попытки подключения к БД привели к тому же самому: либо обычный запрос, либо попытка создания дампа базы данных.

Как вы исправляете эту ошибку и восстанавливаете данные?

1 ответ

Решение

Похоже, у вас есть повреждение данных. Когда вы говорите "сетевой диск", это красный флаг прямо здесь. Очень сложно настроить NFS для обеспечения надежности данных с помощью PostgreSQL. Это AFAIK невозможно настроить SMB, чтобы получить его. Так что, скорее всего, вы получили повреждение данных при сбое, потому что подключение к сети было небезопасным.

2662 - это индекс oid для pg_class, который в основном является индексом для таблицы, в которой перечислены, какие таблицы и индексы существуют в вашей базе данных. Когда это коррумпировано, у вас серьезные проблемы.

Лучше всего на этом этапе попытаться запустить автономный бэкэнд (с выключенным главным) с "-P", который отключает использование системных индексов. Затем попытайтесь REINDEX pg_class и, возможно, остальные системные индексы. Если это сработало, сделайте резервную копию pg_dump сразу и заново инициализируйте базу данных. Вероятно, в системе больше коррупции.

Если это не работает, попробуйте опубликовать в списке рассылки pgsql-general, вы, скорее всего, получите более быстрые ответы. Но, скорее всего, он вернется к вашим резервным копиям - или наймите эксперта по восстановлению данных, если ваши данные действительно важны и у вас нет рабочих резервных копий.

Другие вопросы по тегам