Как исправить ошибку PostgreSQL «53200 error out of memory detail failed on request of size...» при загрузке базы 1С из DT?

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

При развертывании информационной базы 1С:Предприятие из файла выгрузки (.dt) на сервере с СУБД PostgreSQL администраторы нередко сталкиваются с критическим сбоем загрузки. В окне конфигуратора или в технологическом журнале фиксируется исключение:

ERROR: out of memory. DETAIL: Failed on request of size 536870912. CONTEXT: COPY config, line ..., column binarydata. STATEMENT: COPY Config FROM STDIN BINARY.

Разберем детально, почему возникает эта ошибка, почему манипуляции с параметрами в конфигурационном файле СУБД не приносят результата и как правильно устранить проблему.

Выясним причину сбоя и механизм выделения памяти

Проанализируем контекст возникновения ошибки. Запрос размера 536870912 байт точно соответствует блоку памяти объемом ровно 512 МБ. Ошибка происходит на этапе выполнения команды потоковой загрузки бинарных данных конфигурации (COPY Config FROM STDIN BINARY).

Главные факторы возникновения ошибки:

  1. Разрядность процесса СУБД: Если на сервере установлен 32-разрядный (x86) экземпляр PostgreSQL, процессу ОС Windows выделяет максимум 2 ГБ виртуального адресного пространства. В условиях работы СУБД и фрагментации памяти менеджер памяти не может найти непрерывный свободный блок размером 512 МБ, что вызывает системный отказ функции malloc и код ошибки 53200.
  2. Особенности передачи бинарных данных: При загрузке структуры и метаданных конфигурации через платформенный механизм 1С таблицы Config и ConfigSave передают большие бинарные потоки данных (bytea). Во внутреннем контексте процесса PostgreSQL для распаковки и обработки таких блоков требуется в разы больше оперативной памяти, чем исходный размер порции данных.
  3. Бесполезность тюнинга параметров work_mem и shared_buffers: Параметр work_mem отвечает за выделение памяти под операции сортировки, хэш-таблицы и группировки в запросах, но не влияет на потоковую передачу данных командой COPY. Более того, неоправданное завышение shared_buffers в 32-битной среде лишь усугубляет ситуацию, «отъедая» остатки доступного 2-гигабайтного адресного пространства у рабочих процессов.

Шаг 1. Проверка разрядности установленного PostgreSQL

Разберем по шагам, как определить фактическую разрядность работающего сервера СУБД. В среде Windows часто возникает ситуация, когда служба называется стандартно, но бинарные файлы скомпилированы под 32-битную архитектуру.

Выполним SQL-запрос к СУБД через консоль psql или графическую утилиту администрирования:

SELECT version();

Посмотрим на результат выполнения команды. Если в строке ответа присутствует фрагмент вида compiled by Visual C++ build ..., 32-bit или i686-pc-windows, значит, используется 32-разрядная версия сервера СУБД. На 64-битных системах строка должна содержать явное указание на 64-bit или x86_64.

Шаг 2. Установка 64-разрядного дистрибутива PostgreSQL

Для корректной работы с крупными базами 1С:Предприятие требуется использовать исключительно 64-разрядные сборки СУБД, оптимизированные и пропатченные для работы с платформой 1С.

  1. Остановим текущую службу PostgreSQL в диспетчере служб Windows.
  2. Создадим резервную копию существующих баз данных (при необходимости).
  3. Удалим 32-разрядный дистрибутив и установим специализированный пакет postgresql-x.x.x-x.1C_x64.
  4. Инициализируем новый кластер баз данных с корректной локалью (для русскоязычных конфигураций — Russian_Russia.1251 или ru_RU.UTF-8 в зависимости от конфигурации сервера).

Шаг 3. Базовая оптимизация postgresql.conf для 1С:Предприятие

Рассмотрим рекомендуемые базовые параметры файла postgresql.conf для 64-разрядного сервера с объемом оперативной памяти от 16 ГБ:


# Объем разделяемой памяти (25-30% от общей RAM)
shared_buffers = 4GB

# Память для временных таблиц одной сессии
temp_buffers = 64MB

# Память для операций сортировки и группировки
work_mem = 64MB

# Память для служебных операций (создание индексов, вакуум)
maintenance_work_mem = 1GB

# Оценка дискового кэша операционной системы (50-75% от RAM)
effective_cache_size = 12GB

# Предотвращение исчерпания блокировок временных таблиц 1С
max_locks_per_transaction = 256

Альтернативные методы переноса данных

Если развертывание 64-битного сервера временно невозможно или файл .dt перегружен устаревшими данными, рассмотрим обходные пути:

  1. Очистка и сжатие в файловом режиме: Загрузим .dt в файловую информационную базу (.1CD), откроем режим Тестирование и исправление, выберем пункты Реструктуризация таблиц информационной базы и Сжатие таблиц информационной базы, после чего выполним повторную выгрузку в .dt.
  2. Использование универсальной выгрузки/загрузки XML: В пустую клиент-серверную базу перенесем данные с помощью обработки Выгрузка и загрузка данных XML, которая выполняет запись порциями объектов через стандартные механизмы платформы, минуя переполнение памяти бинарными слепками.
  3. Резервное копирование средствами СУБД: Для регулярного создания резервных копий клиент-серверных баз рекомендуется использовать нативные утилиты pg_dump и pg_restore вместо платформенного формата .dt.
← На главную