Как исправить ошибку «out of memory for query result» при выгрузке или переносе базы 1С на СУБД PostgreSQL?

Системный администратор 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Рассматриваемая нами ситуация является классическим примером долгоживущей legacy-системы. В наличии имеется связка из операционной системы Ubuntu 12 (32-бит), СУБД PostgreSQL 8.4 (32-бит) и сервера 1С:Предприятие с конфигурацией «Управление торговлей» редакции 10.3. За годы активной эксплуатации объем базы данных вырос до внушительных 30 гигабайт. При попытке переноса информационной базы на новое серверное оборудование стандартным способом — путем создания резервной копии в формате .dt — процесс аварийно завершается с ошибкой out of memory for query result.

В рамках этой статьи мы подробно разберем, почему возникает эта проблема, почему стандартный механизм выгрузки 1С оказывается неэффективным для баз большого объема, и как правильно перенести данные на новую СУБД без использования промежуточных файлов .dt.

Почему возникает ошибка «out of memory for query result»?

Выясним первопричину сбоя. Несмотря на то что СУБД PostgreSQL работает стабильно, ошибка нехватки памяти возникает на стороне клиента. В контексте взаимодействия «1С — СУБД» клиентом для PostgreSQL выступает рабочий процесс сервера 1С:Предприятия под названием rphost.

Проанализируем технические аспекты этого процесса:

  1. Буферизация библиотеки libpq: Клиентская библиотека СУБД (libpq) по умолчанию пытается полностью загрузить весь результирующий набор данных (result set) в оперативную память процесса-клиента перед тем, как передать его прикладному решению.
  2. Особенности выгрузки .dt: При формировании файла .dt платформа 1С последовательно сканирует таблицы базы данных, выполняя запросы формата SELECT * FROM.... Если в информационной базе присутствуют сверхкрупные таблицы (например, таблицы движений регистров накопления, сведений или таблицы, содержащие файлы в реквизитах типа «Хранилище значения»), библиотека пытается выгрузить гигабайты данных за один транш.
  3. Архитектурный лимит 32-битных систем: Наш старый сервер работает под управлением 32-битной ОС Ubuntu. Адресное пространство любого 32-битного процесса жестко ограничено 4 ГБ. На практике же (с учетом разделения памяти между ядром операционной системы и пользовательскими процессами, а также из-за фрагментации оперативной памяти) процессу rphost доступно не более 2–3 ГБ. Как только объем считываемых данных из одной большой таблицы превышает этот порог, процесс незамедлительно падает с критической ошибкой нехватки памяти.

Почему выгрузка в формат .dt не подходит для баз объемом более 20 ГБ?

Среди квалифицированных администраторов 1С и разработчиков выгрузка в формат .dt для баз данных большого объема считается плохой практикой по следующим причинам:

Решение проблемы: Перенос базы данных с помощью pg_dump и pg_restore

Единственным правильным и надежным решением в данном случае является использование штатных утилит резервного копирования PostgreSQL — pg_dump и pg_restore.

Важно понимать, что резервная копия (дамп), создаваемая средствами СУБД PostgreSQL, абсолютно инвариантна к разрядности платформы (32 или 64 бита) и операционной системе. Вы можете без каких-либо опасений снять дамп с 32-битной СУБД на Linux и развернуть его на 64-битной СУБД под управлением ОС Windows. Главное требование — версия PostgreSQL на целевом сервере должна быть такой же или более новой.

Рассмотрим по шагам, как выполнить этот перенос максимально эффективно. Мы будем использовать формат каталога (параметр -F d), который идеально подходит для баз объемом от 30 ГБ и выше. Данный формат позволяет выгружать данные в несколько параллельных потоков, что существенно экономит время.

Пошаговый алгоритм миграции базы данных

Нам необязательно сохранять огромный файл бэкапа на старом сервере с ограниченным дисковым пространством. Мы можем запустить утилиту выгрузки прямо с нового 64-битного сервера Windows, обратившись к старому серверу по сети.

Выполним процедуру переноса по следующим шагам:

Шаг 1. Экспорт данных со старого сервера

Откроем командную строку (cmd или PowerShell) на новом сервере Windows и выполним команду выгрузки базы данных в режиме каталога:


"C:\Program Files\PostgreSQL\15-1C\bin\pg_dump.exe" -h 10.0.0.1 -p 5432 -U postgres -F d -j 4 -f "D:\Backup\pg_dump_ut10" ut_live

Разберем параметры этой команды подробнее:

Шаг 2. Подготовка новой базы данных

На новом сервере под управлением Windows создадим пустую базу данных в PostgreSQL (например, через утилиту pgAdmin или консоль 1С) с кодировкой UTF8 и аналогичным шаблоном.

Шаг 3. Импорт данных на новый сервер

Теперь выполним восстановление данных в подготовленную пустую базу с помощью утилиты pg_restore:


"C:\Program Files\PostgreSQL\15-1C\bin\pg_restore.exe" -h localhost -p 5432 -U postgres -d ut_new -F d -j 4 "D:\Backup\pg_dump_ut10"

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

После завершения работы утилиты останется лишь прописать новую базу данных в списке информационных баз кластера 1С:Предприятия на новом сервере.

Альтернативный вариант: Временные меры для успешной выгрузки в .dt

Если по организационным причинам вам все же строго необходимо получить файл выгрузки 1С (.dt), и у вас нет возможности напрямую работать с утилитами PostgreSQL, попробуем временно оптимизировать использование оперативной памяти на старом 32-битном сервере.

Для этого выполним следующие настройки:

1. Корректировка конфигурационного файла postgresql.conf

Откроем файл настроек postgresql.conf на старом сервере Linux и скорректируем параметры выделения памяти:

После внесения изменений обязательно перезапустим службу PostgreSQL:

sudo service postgresql restart

2. Настройка параметров кластера 1С

Через консоль администрирования серверов 1С:Предприятия зайдем в свойства нашего рабочего сервера и настроим принудительный перезапуск рабочих процессов:

Проанализировав обе методики, мы настоятельно рекомендуем отказаться от практики создания файлов .dt для баз данных объемом свыше 20 ГБ и всегда использовать прямую миграцию через штатные утилиты резервного копирования вашей СУБД.

← На главную