@alenov
Программист

Postgresql: пустой ответ на запрос при наличии записей: сбой или есть причина?

Имеется таблица с набором записей. Приложение даёт запрос в эту таблицу по определённому условию и получает результат. В какой-то момент происходит странное: запрос, который должен гарантированно вернуть набор строк, возвращает пустой курсор. Был восстановлен архив БД на момент инцидента, исследования и анализ значений primary-ключа и timestamp-метки показали, что в момент выполнения запроса в таблице были записи, удовлетворяющие условию. И есть лог-запись с текстом запроса и результатом - 0 записей! И этот же запрос на восстановленном архиве возвращает записи, подтверждая, что записи должны были быть найдены. Но в логе сказано - 0 записей.

Вопрос: при каких условиях Postgresql может вернуть пустой результат при фактическом наличии соответствующих запросу записей? Сбой, особенности, о которых мне неизвестно, руки кривые, что-то ещё...

В связи с советом Vitsliputsli, думаю следующее. Никаких манипуляций с искомыми записями не производилось в течение года. Это значит, что:
- если бы искомые записи застряли в кэше, а postgresql не определил бы, что кэш инвалидный, и продолжал бы его использовать, запрос вернул бы эти записи.
- если бы postgresql понял, что кэш устарел, он запросил бы их заново из таблицы, и тоже вернул бы их.
Получается, что независимо от состояния кэша, запрос должен был вернуть непустой результат. А он пустой. И произошло это внезапно, только один раз, и никак не воспроизводится. И что делать? Списать на сбой postgresql, или есть разумная причина такого явления?
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 1
@rPman
Информации мало, но проверьте внимательнее, возможно между запросом и ответом от базы данных стоит еще какой то код, может в нем ошибка?

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

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

Запустите утилиты проверки целостности базы данных и файловой системы. Банально проверьте работоспособность железа, вдруг у вас оперативная память глючит (правда у вас вылезало бы еще много где косяков) или сбоит контроллер жесткого диска (смотрите логи сервера dmesg хотя бы).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы