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С
- Права и видимость: 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.
Пример создания мониторинговой роли и выдачи прав:
-- создать пользователя (по желанию с паролем)
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
После перезапуска выполните:
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
Практические команды и примеры
Быстрая последовательность действий, чтобы настроить видимость и сбор данных:
- Создать/назначить мониторингового пользователя:
CREATE ROLE monitoring WITH LOGIN PASSWORD 'SOME_STRONG_PASS';
GRANT pg_read_all_stats TO monitoring;
- Увеличить размер хранимого текста запроса и включить расширение:
- В postgresql.conf:
track_activity_query_size = 4096
shared_preload_libraries = 'pg_stat_statements'
- Перезапустить PostgreSQL.
- В каждой целевой базе выполнить:
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
- Примеры запросов для проверки:
- Текущее активное:
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 известны):
... WHERE application_name ILIKE '1Cv8%' OR usename = 'user_1c' ...
- Самые “тяжёлые” по времени из pg_stat_statements:
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;
- Временно включить детальное логирование, если нужно поймать короткие запросы:
- В 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
Источники
- https://www.postgresql.org/docs/16/runtime-config-statistics.html
- https://www.postgresql.org/docs/current/monitoring-stats.html
- https://www.postgresql.org/docs/current/pgstatstatements.html
- https://sysadminium.ru/tekushchie_aktivnosti_v_postgresql/
- https://habr.com/ru/companies/postgrespro/articles/872574/
- https://its.1c.ru/db/metod8dev/content/5866/hdoc
- https://instaclustr.com/blog/mastering-pg-stat-activity-for-real-time-monitoring-in-postgresql/
Заключение
Коротко: 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С, ОС и схему подключения).