При развертывании информационной базы 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).
Главные факторы возникновения ошибки:
malloc и код ошибки 53200.Config и ConfigSave передают большие бинарные потоки данных (bytea). Во внутреннем контексте процесса PostgreSQL для распаковки и обработки таких блоков требуется в разы больше оперативной памяти, чем исходный размер порции данных.work_mem и shared_buffers: Параметр work_mem отвечает за выделение памяти под операции сортировки, хэш-таблицы и группировки в запросах, но не влияет на потоковую передачу данных командой COPY. Более того, неоправданное завышение shared_buffers в 32-битной среде лишь усугубляет ситуацию, «отъедая» остатки доступного 2-гигабайтного адресного пространства у рабочих процессов.Разберем по шагам, как определить фактическую разрядность работающего сервера СУБД. В среде Windows часто возникает ситуация, когда служба называется стандартно, но бинарные файлы скомпилированы под 32-битную архитектуру.
Выполним SQL-запрос к СУБД через консоль psql или графическую утилиту администрирования:
SELECT version();
Посмотрим на результат выполнения команды. Если в строке ответа присутствует фрагмент вида compiled by Visual C++ build ..., 32-bit или i686-pc-windows, значит, используется 32-разрядная версия сервера СУБД. На 64-битных системах строка должна содержать явное указание на 64-bit или x86_64.
Для корректной работы с крупными базами 1С:Предприятие требуется использовать исключительно 64-разрядные сборки СУБД, оптимизированные и пропатченные для работы с платформой 1С.
Russian_Russia.1251 или ru_RU.UTF-8 в зависимости от конфигурации сервера).Рассмотрим рекомендуемые базовые параметры файла 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 перегружен устаревшими данными, рассмотрим обходные пути:
.dt в файловую информационную базу (.1CD), откроем режим Тестирование и исправление, выберем пункты Реструктуризация таблиц информационной базы и Сжатие таблиц информационной базы, после чего выполним повторную выгрузку в .dt.Выгрузка и загрузка данных XML, которая выполняет запись порциями объектов через стандартные механизмы платформы, минуя переполнение памяти бинарными слепками.pg_dump и pg_restore вместо платформенного формата .dt.