Может ли хэш-индекс стать непоследовательным для «без причины»?


3

Конечно, когда я говорю «нет причин», я имею в виду «по-видимому» никаких причин, потому что на сервере ничего не произошло (принудительное завершение работы, повреждение данных, взаимоблокировки и т. Д.).

Я спрашиваю это потому, что там было приложение, которое выполняется простой выбор на PostgreSQL:

select * from product where barcode = '9990000088355' 

Который не дал ничего, но была запись в таблице с barcode = 9990000088355. Для этого поля был указатель, и после его повторной проверки проблема была решена, и запрос взял запись.

Итак, есть ли причина для этой проблемы, и могу ли я сделать что-то, чтобы предотвратить это или, по крайней мере, увидеть, есть ли проблема с другими индексами других таблиц?

  0

Какая небольшая версия PostgreSQL? У вас есть репликация? 02 окт. 152015-10-02 19:01:06

  0

9.3, без репликации 03 окт. 152015-10-03 01:58:05

  0

Если это произойдет, это ошибка. Даже если это после сбоя или принудительного выключения или тупика, это ошибка. Что такое ** точная ** версия, которую вы используете? 'SELECT version()' пожалуйста. Также, пожалуйста, покажите результат запроса 'SHOW fsync;'. У вас когда-либо * были 'fsync' или' full_page_writes' установлены 'off'? 03 окт. 152015-10-03 05:03:50

  0

Кроме того, есть ли шанс, что вы взяли копию каталога базы данных, прежде чем вы перевернете? Если это так, может оказаться полезным иметь поврежденный индекс и соответствующую таблицу. 03 окт. 152015-10-03 10:21:31

  0

Версия 'PostgreSQL 9.3.9, скомпилированная Visual C++ build 1800, 64-bit'. И 'fsync', и' full_page_writes' всегда были. На самом деле, прежде чем делать reindex, я действительно сделал pg_dump, чтобы получить базу данных на моем компьютере, и не тестировал запрос select, чтобы увидеть, вернули ли значения значения ... возможно, pg_dump зафиксировал индекс? 03 окт. 152015-10-03 11:16:46

  0

Является ли поле штрих-кода буквенно-цифровым? Возможно, вам понадобится сделать btrim(), чтобы убедиться, что нет скрытых пространств. Если вы сделаете это достаточно, было бы целесообразно создать на нем индекс функции. 04 окт. 152015-10-04 04:34:28

3

ЗАКЛЮЧИТЕЛЬНО, после того, как я нашел причину этой проблемы. Я на самом деле видел машину, в которой выполнялся постгер, терпящий жесткий сброс, после чего произошла точная ошибка.
Оказывается, индекс, который я использовал, был индексом HASH вместо стандартного B-Tree. Итак, глядя на документацию postgres, первое, что я увидел, было гигантское желтое предупреждение, в котором явным образом заявлял, что это небезопасно, когда происходит сбой. Взятые из docs:

Внимание
операции индекса Hash в настоящее время не WAL протоколирование, поэтому хэш-индексы, должны быть восстановлены с REINDEX после аварии базы данных, если были неписаные изменениями. Кроме того, изменения в хэш-индексах не реплицируются поверх потоковой или файловой репликации после первоначальной базовой резервной копии, поэтому они дают неправильные ответы на запросы, которые впоследствии используют их. По этим причинам использование хеш-индекса в настоящее время не поощряется.

То, что я сделал, это просто сбросить индекс хеша и создать новый с алгоритмом B-дерева. До сих пор это было рабочим решением.

  0

хорошо на вас, чтобы опубликовать хороший вопрос и вернуться через год с хорошим ответом. 10 янв. 172017-01-10 20:15:38

  0

некромантия в ее лучших! 11 янв. 172017-01-11 10:43:11