Задать вопрос
@alenov
Программист

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

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

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

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

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

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

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

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

Похожие вопросы