Базы данных

PostgreSQL: pg_stat_activity не видит запросы 1С. Как настроить?

Узнайте, почему pg_stat_activity не показывает запросы 1С в PostgreSQL. Настройте права, track_activity_query_size, pg_stat_statements и логирование для мониторинга.

Почему pg_stat_activity в PostgreSQL не отображает запросы от 1С, хотя запросы от pgAdmin 4 видны? Как настроить pg_stat_activity, чтобы видеть все запросы к базе данных, включая запросы от 1С, работающей на том же сервере?

pg_stat_activity показывает только текущие активные бекенды и текст запросов виден владельцу сессии, суперпользователю или ролям с правом pg_read_all_stats, поэтому вы видите свои запросы из pgAdmin, но не запросы 1С под другим пользователем. Кроме того, 1С часто использует пул соединений и очень короткие (миллисекундные) запросы, которые успевают завершиться между опросами pg_stat_activity (статистика также имеет лаг — PGSTAT_MIN_INTERVAL). Чтобы видеть все PostgreSQL запросы от 1С, дайте мониторинговой учётной записи роль pg_read_all_stats, при необходимости увеличьте track_activity_query_size, включите pg_stat_statements и/или настройте логирование длительных/всех запросов.

Содержание

Почему pg_stat_activity не показывает запросы 1С

Есть три основных причины, почему вы видите запросы из pgAdmin, но не видите запросы 1С:

  • Видимость по правам. В документации PostgreSQL по статистике выполнения указано, что текст запросов виден только владельцу сессии, суперпользователю и ролям с привилегией pg_read_all_stats. Если вы подключились под другим пользователем — чужие сессии не видны.
  • Короткие/мгновенные запросы и пул соединений. 1С часто генерирует очень короткие запросы и использует пул соединений: запрос может выполниться и завершиться до того, как вы успеете опросить pg_stat_activity. Кроме того, статистика обновляется с ограничением по частоте (PGSTAT_MIN_INTERVAL — см. описание механизма сбора статистики), поэтому небольшой запрос может не отразиться в момент опроса.
  • Прокси/пулы (pgbouncer/pgpool). Если между 1С и PostgreSQL стоит пулер в режиме transaction pooling, вы видите сессии пулера, а не «оригинальные» клиентские сессии, поэтому информация о приложении/пользователе может быть скрыта.

Права и видимость: pg_read_all_stats и суперпользователь

Чтобы мониторинг видел все запросы, делайте одно из двух:

  • Подключайтесь как суперпользователь (например, postgres), либо
  • Дайте мониторинговой учётной записи роль pg_read_all_stats.

Пример создания мониторинговой роли и выдачи прав:

sql
-- создать пользователя (по желанию с паролем)
CREATE ROLE monitoring WITH LOGIN PASSWORD 'REPLACE_WITH_STRONG_PASSWORD';

-- дать право читать статистику
GRANT pg_read_all_stats TO monitoring;

После этого под пользователем monitoring вы будете видеть чужие сессии и их текст в pg_stat_activity (в пределах длины, заданной track_activity_query_size — см. далее). См. примечание в runtime-config-statistics.

Параметры статистики: track_activity_query_size и задержка обновления

Что ещё проверить в конфиге:

  • track_activities — должен быть on (обычно включён по умолчанию).
  • track_activity_query_size — по умолчанию 1024 байта; если ваши запросы длиннее, текст обрежется. Увеличьте при необходимости (например, 4096 или 16384), но изменение этого параметра требует перезапуска сервера.
  • PGSTAT_MIN_INTERVAL — внутренний интервал, влияющий на частоту сброса накопленной статистики в shared memory; по умолчанию ~1000 мс (см. описание механизма сборки статистики). Это объясняет, почему очень короткие (мс) запросы могут не появляться.

Пример (фрагмент postgresql.conf):

track_activities = on
track_activity_query_size = 4096   # requires server restart

После изменения конфигурации — перезапустите сервер (изменения track_activity_query_size и shared_preload_libraries требуют именно restart).

Ловля коротких запросов: pg_stat_statements и логирование

Если запросы кратки или уже завершились, надёжнее использовать:

  • pg_stat_statements — сохраняет агрегированную статистику по выполненным запросам; требует добавления в shared_preload_libraries и перезапуска, затем создания расширения. Документация модуля: pg_stat_statements.
  • Логирование SQL-запросов (log_min_duration_statement, log_statement) — полезно для подробного аудита и последующего разбора логов утилитами (pgBadger и др.). Практические рекомендации и примеры включения логирования есть в статьях по диагностике (см. примерные описания на Habr: https://habr.com/ru/companies/postgrespro/articles/872574/).

Пример конфигурации для включения pg_stat_statements и логирования медленных запросов:

shared_preload_libraries = 'pg_stat_statements'   # restart required
log_min_duration_statement = 500                  # логировать запросы >500ms

После перезапуска выполните:

sql
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

Практические команды и примеры

Быстрая последовательность действий, чтобы настроить видимость и сбор данных:

  1. Создать/назначить мониторингового пользователя:
sql
CREATE ROLE monitoring WITH LOGIN PASSWORD 'SOME_STRONG_PASS';
GRANT pg_read_all_stats TO monitoring;
  1. Увеличить размер хранимого текста запроса и включить расширение:
  • В postgresql.conf:
track_activity_query_size = 4096
shared_preload_libraries = 'pg_stat_statements'
  • Перезапустить PostgreSQL.
  • В каждой целевой базе выполнить:
sql
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
  1. Примеры запросов для проверки:
  • Текущее активное:
sql
SELECT pid, usename, application_name, client_addr, state, query_start,
       now() - query_start AS duration,
       left(query,200) AS query
FROM pg_stat_activity
WHERE state <> 'idle'
ORDER BY query_start DESC;
  • Фильтрация по 1С (если application_name или usename известны):
sql
... WHERE application_name ILIKE '1Cv8%' OR usename = 'user_1c' ...
  • Самые “тяжёлые” по времени из pg_stat_statements:
sql
SELECT userid::regrole AS user, dbid::regdatabase AS db, calls, total_time, mean_time, left(query,200) AS q
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 50;
  1. Временно включить детальное логирование, если нужно поймать короткие запросы:
  • В postgresql.conf:
log_min_duration_statement = 0   # логировать все запросы (только для отладки, может генерировать много логов)
  • После сбора данных вернуть значение в разумный порог (например, 200–500 ms).

Проверка, отладка и дополнительные советы

  • Убедитесь, какой пользователь использует 1С для подключения (в конфигурации 1С или строке подключения). Если 1С использует одного и того же пользователя, фильтруйте по usename.
  • Проверьте, не стоит ли между 1С и PostgreSQL pgbouncer/pgpool — в transaction pooling вы увидите сессии пулера, а не клиентов.
  • Если вы всё ещё не видите запросы: подключитесь под суперпользователем и выполните SELECT из pg_stat_activity — это точно покажет все активные бекенды (если track_activities включён).
  • Используйте pg_stat_statements и логи как постоянный источник для разбора коротких/многочисленных запросов — pg_stat_activity хорош для live-диагностики, но не заменяет исторический сбор.
  • Не оставляйте log_statement = 'all' или log_min_duration_statement = 0 в продакшене надолго — логи вырастут очень быстро.

Полезная практическая заметка: русскоязычные инструкции по просмотру текущих активностей и примеры администрирования есть в статьях сообщества, например на Sysadminium: https://sysadminium.ru/tekushchie_aktivnosti_v_postgresql/ и в методических материалах 1C по работе с PostgreSQL: https://its.1c.ru/db/metod8dev/content/5866/hdoc

Источники

Заключение

Коротко: pg_stat_activity не показывает запросы 1С обычно из‑за прав и из‑за природы коротких/пулевых запросов — pg_stat_activity отображает только текущие бекенды и видим для владельца сессии, суперпользователя или ролей с pg_read_all_stats. Чтобы видеть все PostgreSQL запросы от 1С, назначьте роль pg_read_all_stats мониторинговой учётной записи, увеличьте track_activity_query_size при необходимости, включите pg_stat_statements и настройте разумное логирование для словления кратковременных операций. Если нужно, подготовлю детальный пошаговый HowTo под вашу версию PostgreSQL и конфигурацию 1С (укажите версии PostgreSQL и 1С, ОС и схему подключения).

Авторы
Проверено модерацией
Модерация