При администрировании крупных баз данных 1С (особенно таких как "Управление производственным предприятием" или "ERP"), развернутых на PostgreSQL, системные администраторы часто сталкиваются с ошибкой при попытке создания резервной копии через pg_dump. Сообщение об ошибке выглядит следующим образом: pg_dump: error: Error message from server: ERROR: invalid memory alloc request size 1462250959. Проблема локализуется в таблице public.config при выполнении команды COPY TO stdout.
В этой статье мы подробно разберем причины возникновения этой ситуации и рассмотрим пошаговые алгоритмы её решения, основываясь на практическом опыте специалистов.
Проанализируем техническую сторону вопроса. Ошибка invalid memory alloc request size в PostgreSQL возникает, когда сервер пытается выделить под один объект (поле в строке таблицы) объем памяти, превышающий внутренний лимит MaxAllocSize. В стандартных сборках PostgreSQL этот лимит составляет 1 ГБ.
В контексте 1С проблема чаще всего проявляется в таблице config. Эта таблица хранит метаданные конфигурации, включая файлы основной конфигурации, конфигурации поставщика и расширений. Если конфигурация базы сильно доработана или находится на поддержке у нескольких поставщиков одновременно, размер одной записи в поле binarydata может превысить 1 ГБ в распакованном виде. В результате pg_dump не может считать эту строку для передачи в поток бэкапа.
Это наиболее правильный и "чистый" метод решения. Рассмотрим его подробнее. Зачастую база годами накапливает старые конфигурации поставщиков после обновлений, которые фактически не нужны, но занимают место в таблице config.
config.VACUUM FULL config средствами СУБД, предварительно обеспечив монопольный доступ к базе).Если нам необходимо срочно сделать бэкап данных (также можно рассмотреть создание резервной копии в режиме Предприятие), а очистка конфигурации занимает слишком много времени или невозможна, мы можем использовать обходной путь. Разберем, как сделать раздельный дамп.
Выполним выгрузку основной части базы, исключив проблемную таблицу config. Для этого используем параметр --exclude-table:
pg_dump -h localhost -U postgres -d your_database_name --exclude-table=public.config -F c -f "db_data_without_config.backup"
Таблицу config в этом случае придется бэкапить отдельно или восстанавливать из другого источника (например, загрузкой файла .cf в пустую базу). Однако стоит помнить, что без этой таблицы база данных будет неработоспособна, так как в ней хранятся все описания метаданных.
Рассмотрим ситуацию, когда база переносится с MSSQL на PostgreSQL. Это типичный сценарий, при котором ошибка проявляется впервые (так как в MSSQL лимиты на размер поля реализованы иначе).
.dt..dt в файловый вариант базы. Несмотря на ограничения размера таблиц в файловой версии (4 ГБ), общая база может быть гораздо больше (20-30 ГБ и более). Главное, чтобы сама таблица config "пролезла" в лимит..dt и попробуем загрузить в PostgreSQL.Поскольку ошибка invalid memory alloc специфична именно для логического дампа (когда сервер читает содержимое полей), физическое копирование файлов базы данных этой проблеме не подвержено. Проанализируем использование pg_basebackup.
Этот инструмент копирует файлы данных "как есть" на уровне байтов. Для сервера это просто набор файлов, он не пытается анализировать содержимое поля binarydata и не натыкается на ограничение MaxAllocSize.
Преимущества этого метода:
Чтобы избежать подобных проблем в будущем, рекомендуем придерживаться следующих правил:
config (или configcas). Старайтесь не хранить в расширениях бинарные данные большого объема.VACUUM и ANALYZE для таблиц config, configcas и params помогает поддерживать базу в оптимальном состоянии и вовремя заметить раздувание таблиц.Таким образом, мы выяснили, что ошибка вызвана жестким ограничением PostgreSQL на размер одного поля. Самым надежным решением является оптимизация списка конфигураций на поддержке или переход на физические методы резервного копирования.