Как определить, какому запросу относится операция ROLLBACK в логах PostgreSQL?

Как можно идентифицировать запросы, вызывающие роллбеки, при включенной опции log_min_duration_statement=-1 в PostgreSQL? 
Объем логов достаточно большой из-за десятков или сотен тысяч запросов в минуту, и хочется понять, какие именно запросы вызывают роллбеки.
  • 17 ноября 2023 г. 14:10
Ответы на вопрос 2
В логах PostgreSQL можно определить, какому запросу относится операция ROLLBACK, посмотрев на значение поля `transaction ID`. Каждая транзакция в PostgreSQL имеет свой уникальный идентификатор, который автоматически генерируется при начале транзакции. При каждой операции в рамках транзакции, включая ROLLBACK, в логах будет указано значение этого идентификатора.

Для идентификации запросов, вызывающих роллбеки, при включенной опции `log_min_duration_statement=-1`, можно использовать следующий подход:
1. Включите `'log_statement' = 'all'` в конфигурационном файле PostgreSQL. Это позволит записывать в логи все SQL-запросы, включая те, которые вызывают роллбеки.
2. Запустите PostgreSQL с этой конфигурацией и наблюдайте логи.
3. При возникновении роллбека, найдите соответствующую запись в логах и обратите внимание на значение поля `transaction ID`.
4. Используйте это значение для поиска запросов, связанных с этой транзакцией. В логах можно искать по этому идентификатору, чтобы найти все запросы, выполненные в рамках данной транзакции.

Обратите внимание, что при таком подходе обрабатывать десятки или сотни тысяч запросов в минуту может быть довольно ресурсоемкой задачей. Рекомендуется использовать подходящие инструменты для анализа и фильтрации логов PostgreSQL, такие как `pgBadger` или `pg_stat_statements`, чтобы сократить объем данных и упростить анализ.
если вы добавите в log_line_prefix PID процесса, то достаточно будет найти в логе запись с тем же PID, которая предшествует записям с ROLLBACK, чтобы найти нужную информацию. 
Похожие вопросы