Мы используем WAL-E для резервного копирования и восстановления базы данных PostgreSQL (версия 9.5.13). Мы обнаружили, что несколько индексов (не все) были повреждены после восстановления, большинство из них связано с полями типа String.
Например, используя анализировать объяснять, мы можем видеть, что следующий запрос попадает в существующий индекс, который относится к полю foo_name, но строки не возвращаются.
select * from foo where foo_name = 'xyz';
Если мы используем like в запросе, он сможет вернуть ожидаемую строку, поскольку выполняет сканирование всей таблицы.
select * from foo where foo_name like '%xyz%';
Решение - переиндексировать сломанные индексы. После переиндексации первый запрос также возвращает ожидаемый результат.
Кто-нибудь сталкивался с подобной проблемой раньше? Есть ли у кого-нибудь представление о первопричине?
Что такое «WAL-E»? Как вы восстанавливали свою базу данных? Если у вас есть проблема с индексами, почему бы не перестроить их все?
@a_horse_with_no_name версия - 9.5.13
@NicoHaase см. Ссылку на wal-e: github.com/wal-e/wal-e.
Индексы не переносимы между системами, потому что сопоставления - нет, если только не используется collate "C" или ICU. Вы выполняете восстановление в другой ОС?
@ DanielVérité Иногда достаточно восстановить до другой версии той же операционной системы, чтобы получить повреждение индекса.





Что-то здесь звучит подозрительно. Индекс должен иметь какое-либо отношение к логическому результату SQL-запроса нет, по крайней мере, не в Postgres.