Ошибка invalid memory alloc request size
Из 1С через dt выгрузка базы происходит нормально, а при создании дампа средствами pg_dump ошибка invalid memory alloc request size
.
Параметр pg_dump --format
(-F
) значения не имеет, проявляется на всех.
Пример вывода ошибки:
pg_dump: Ошибка выгрузки таблицы "config": сбой в PQgetResult().
pg_dump: Сообщение об ошибке с сервера: ОШИБКА: invalid memory alloc request size ХХХХХХХ
pg_dump: Выполнялась команда: COPY public.config (filename, creation, modified, attributes, datasize, binarydata) TO stdout;
Проблема в том, что 1С активно использует поля типа bytea и в некоторых случаях размер такого поля может превысить 1ГБ, что является пределом для PostgreSQL https://www.postgresql.org/docs/current/limits.html
Часто эта проблема наблюдается на таблице public.config, в которой 1С хранит свою конфигурацию.
При попытке выгрузить такую таблицу с помощью pg_dump возникает ошибка
invalid memory alloc request size ХХХХХХХХ.
Кроме того, при попытке восстановления такой частичной резервной копии, созданной в форматах directory или custom появляются подобные ошибки:
pg_restore: обрабатываются данные таблицы "public.config"
pg_restore: [внешний архиватор] не удалось прочитать входной файл: конец файла
pg_restore: [directory archiver] could not close data file: Success
pg_restore: [parallel archiver] a worker process died unexpectedly
pg_restore: ошибка: не удалось закрыть файл данных "/backup/dump/47351.dat": Победа
pg_restore: ошибка: рабочий процесс неожиданно завершился
Возможные варианты решений:
1 . Исключить сохранение данных таблицы(ключ --exclude-table-data=tablename
) из резервной копии и сохранять/восстанавливать таблицу через COPY. Например:
$ pg_dump mydb -Fd -f /backup/mybackup1/ --exclude-table-data=public.config
$ psql mydb -c "COPY (SELECT * FROM public.config) TO '/backup/mybackup1/public.config.dat' BINARY"
В этом случае в РК от таблицы public.config будет сохранена только схема, а данные будут отдельно выгружены в файл /backup/mybackup1/public.config.dat.
Восстановление такой РК:
$ pg_restore -d mydb -Fd /backup/mybackup1/
$ psql mydb -c "COPY public.config FROM '/backup/mybackup1/public.config.dat' BINARY"
2 . Чистить конфигурацию от мусора (если проблема в таблице public.config) или исследовать проблемную строку. Пример поиска проблемной строки в таблице:
select ctid, length(long_field_name)
from problematic_table
where length(long_field_name) >= 1024*1024*256
order by 2 desc;
3 . В версиях Tantor SE16 и выше появлися параметр enable_large_allocations и его поддержка в утилитах pg_dump/pg_restore.
Этот параметр позволяет выделять в определённых случаях до 2Г памяти для преобразования значений, что позволяет выгружать в дамп значения большего размера.
Более подробно ознакомиться можно здесь:
https://docs.tantorlabs.ru/tdb/ru/16_4/se/runtime-config-resource.html#GUC-ENABLE-LARGE-ALLOCATIONS