25.12.2025
Для расследования проблем с пакетными запросами в СУБД PostgreSQL с патчем от 1С, начиная с версий
было обновлено расширение auto_dump до версии 1.1.
Данное расширение помогает упростить процесс получения воспроизведения медленного выполнения запроса без использования платформы 1С:Предприятие.
Расширение:
auto_dump.enable – булево
Признак включения расширения. По умолчанию расширение выключено.
auto_dump.output_directory - строка
Путь директории, в которую будут сохраняться файлы с дампами таблиц. Параметр обязателен для настройки. У пользователя, под которым запущена служба СУБД, должны быть права на запись в этой директории.
auto_dump.dump_on_query_string - строка
Фрагмент sql-запроса, при появлении которого в запросе будет осуществлено срабатывание получения дампа.
auto_dump.dump_on_cancel - булево
При включении параметра будет осуществляться дамп запросов отмененных со стороны СУБД (например, командой pg_cancel_backend или в момент lock timeout). По умолчанию параметр выключен.
auto_dump.dump_on_bad_plan – булево
При включении параметра будет анализироваться ожидаемое и фактическое количество строк для всех запросов. Чтобы сработало автоматическое формирование дампа по запросу, должны одновременно выполниться два критерия auto_dump.bad_plan_percent_threshold и auto_dump.bad_plan_count_threshold, которые определяют запрос как «проблемный». По умолчанию параметр выключен.
auto_dump.bad_plan_count_threshold – число
Критерий срабатывания автоматического дампа по абсолютной разнице между ожидаемым и фактическим количеством строк.
Анализируются все узлы плана. Если ожидаемое количество строк отличается от фактического количества строк более чем на заданное в параметре число, то критерий считается выполнен.
Если значение равно 0, то критерий срабатывать не будет.
По умолчанию параметр установлен 0.
auto_dump.bad_plan_percent_threshold – число
Критерий срабатывания автоматического дампа по разнице в процентах между ожидаемым и фактическим количеством строк.
В качестве параметра устанавливается число от 0 до 100. Анализируются все узлы плана. По каждому узлу проверяется отношение суммы ожидаемого количества строк и фактического количества строк к ожидаемому количеству строк. Если это отношение превышает установленный параметр, то критерий считается выполненным.
Если значение равно 0, то критерий срабатывать не будет.
По умолчанию параметр установлен 0.
auto_dump.dump_on_duration - число
Критерий срабатывания автоматического дампа по времени выполнения запроса (в миллисекундах).
Если установлено значение 0 – будут сформированы дампы для всех запросов.
Если установлено значение -1 – параметр не будет срабатывать.
По умолчанию параметр установлен -1.
auto_dump.dump_temporary_tables – булево
При включении параметра в дамп будут добавлены временные таблицы сессии, участвующие в текущем запросе.
По умолчанию включено.
auto_dump.dump_persistent_tables – булево
При включении параметра в дамп будут добавлены все постоянные таблицы, участвующие в текущем запросе.
По умолчанию выключено.
auto_dump.dump_all_temp_tables – булево
При включении параметра в дамп будут добавлены все временные таблицы сессии, в том числе и участвующие в текущем запросе.
По умолчанию выключено.
auto_dump.dump_data – булево
При включении параметра в дамп будет записано содержимое таблиц, для которых снимается дамп. Если параметр выключен, то в sql-запросе будет описано только создание таблиц, без их заполнения.
По умолчанию включено.
auto_dump.dump_indexes – булево
При включении параметра в дамп будет записано создание индексов для таблиц, которые участвуют в дампе.
По умолчанию включено.
auto_dump.dump_query – булево
При включении параметра будет сформирован файл с sql-запросом, для которого сформирован дамп.
По умолчанию включено.
auto_dump.dump_create – булево
При включении параметра будет сформирован файл с sql-командами создания таблиц, для которых снимается дамп.
По умолчанию включено.
auto_dump.dump_plan - булево
При включении параметра будет сформирован файл с планом выполнения текущего SQL-запроса.
По умолчанию включено.
auto_dump.data_format - строка
Параметр задаёт формат сохранения данных при создании дампа. Возможные значения параметра:
- "insert" - данные помещаются в виде INSERT запроса;
- "copy-file" - данные помещаются в отельный файл с именем вида "table-имя_таблицы.txt". В sql файле помещается служебная команда "\copy" для psql. Данный режим совместим только с psql-совместимыми утилитами. Выполнение запроса необходимо осуществлять из директории с дампом.
- "copy-stdin" - данные помещаются в формате "COPY FROM stdin", аналогично утилите pg_dump.
По умолчанию установлено значение "copy-stdin".
Для работы расширения необходимо добавить его в конфигурационном файле postgresql.conf
Копировать в буфер обменаshared_preload_libraries = ‘auto_dump’
Затем описать необходимые параметры расширения и перезапустить службу СУБД.
Через утилиту psql необходимо подключиться к базе данных и создать в ней расширение
Копировать в буфер обменаuser@server: psql -h localhost -U postgres -d myDB
myDB =# CREATE EXTENSION auto_dump;
Добавлены SQL функции для ручного запуска формирования дампов. Выполнение данных функций возможно только под пользователем с ролью superuser.
auto_dump_immediate(pid), где pid - число
Функция выполняет отмену запроса, выполняемого сессией с идентификатором pid, с последующим снятием дампа.
auto_dump_current(pid), где pid – число
Функция выполняет снятие дампа после завершения текущего выполняемого запроса в сессии с идентификатором pid.
auto_dump_next(pid), где pid – число
Функция выполняет снятие дампа следующего запроса в сессии с идентификатором pid.
При автоматическом срабатывании по одному из критериев или при ручном запуске расширения, в каталоге из параметра output_directory будет создан подкаталог, который имеет следующий формат:
PIDПроцесса-ГГГГ-ММ-ДД-ЧЧ-ММ-СС-ПорядковыйНомер
Внутри каталога формируются файлы:
query.sql - содержит текст запроса, для которого делается дамп. Наличие файла зависит от параметра dump_query.
create_persistent.sql - содержит команды по созданию постоянных таблиц и (или) индексов. Наличие файла зависит от параметров dump_create, dump_indexes и dump_persistent_tables.
create_temporary.sql - содержит команды по созданию временных таблиц и (или) индексов. Наличие файла зависит от параметра dump_create, dump_indexes, dump_all_temp_tables и dump_temporary_tables.
insert_persistent.sql - содержит команды по заполнению постоянных таблиц. Наличие файла зависит от параметров dump_data и dump_persistent_tables.
insert_temporary.sql - содержит команды по заполнению временных таблиц. Наличие файла зависит от параметров dump_data, dump_all_temp_tables и dump_temporary_tables.
plan_explain.txt - содержит план запроса в формате вывода команды EXPLAIN. Наличие файла зависит от параметра dump_plan.
plan_analyze.txt - содержит план запроса в формате вывода команды EXPLAIN (ANALYZE, BUFFERS, SETTINGS). Наличие файла зависит от параметра dump_plan.
файлы вида "table-<имя_таблица>.txt". Формируются только в случае auto_dump.data_format="copy-file".
readme.txt – содержит примеры использования вышеописанных файлов.
С помощью технологического журнала по событию DBPOSTGRS был получен текст sql-запроса
Копировать в буфер обменаSELECT T1._Q_001_F_000RRef, T1._Q_001_F_001RRef, T1._Q_001_F_002, T2._Fld32 FROM pg_temp.tt1 T1 LEFT OUTER JOIN _Reference8 T2 ON (T1._Q_001_F_000RRef = T2._IDRRef)
В конфигурационном файле postgresql.conf были добавлены строки:
Копировать в буфер обменаshared_preload_libraries = ‘auto_dump’ auto_dump.enable = on auto_dump.output_directory = ‘/tmp/auto_d’ auto_dump.dump_on_query_string = ‘LEFT OUTER JOIN _Reference8’ auto_dump.dump_persistent_tables = on
Перезапуск службы postgresql
Копировать в буфер обменаuser@server: sudo systemctl restart postgresql@16-main.service
Добавление расширения в базу данных auto_d
Копировать в буфер обменаuser@server: psql -h localhost -U postgres -d auto_d auto_d=# create extension auto_dump; CREATE EXTENSION
Пользователь в 1С выполнил действие, которое использует проблемный запрос.
После этого в каталоге ‘/tmp/auto_d’ появился новый каталог, который имеет следующий формат “PIDПроцесса-ГГГГ-ММ-ДД-ЧЧ-ММ-СС-ПорядковыйНомер”
user@server:/tmp/auto_d/67748-2025_12_02_17_21_48_00$ ls -l -rw-rw-r-- 1 postgres postgres 1241 дек 2 14:26 create_persistent.sql -rw-rw-r-- 1 postgres postgres 120 дек 2 14:26 create_temporary.sql -rw-rw-r-- 1 postgres postgres 4876 дек 2 14:26 insert_persistent.sql -rw-rw-r-- 1 postgres postgres 3322 дек 2 14:26 insert_temporary.sql -rw-rw-r-- 1 postgres postgres 1151 дек 2 14:26 plan_analyze.txt -rw-rw-r-- 1 postgres postgres 458 дек 2 14:26 plan_explain.txt -rw-rw-r-- 1 postgres postgres 166 дек 2 14:26 query.sql
Для отладки запроса можно перенести файлы на отдельный тестовый стенд, на нем подключиться через psql
Копировать в буфер обменаuser@testserver: psql -h localhost -U postgres -d testDB
Создать и заполнить необходимые таблицы
Копировать в буфер обменаtestDB =# \i create_persistent.sql; testDB =# \i insert_persistent.sql; testDB =# \i create_temporary.sql; testDB =# \i insert_temporary.sql;
И выполнить запрос
Копировать в буфер обменаtestDB =# \i query.sql;