Бэкап БД PostrgreSQL с бинарными данными происходит с ошибкой.

Бэкап БД PostrgreSQL с бинарными данными происходит с ошибкой.

.

  1. У PG давным-давно сложилось, что размер буфера памяти для работы со строками не может превышать 1Гб.

  2. pg_dump развёртывает бинарные строки в текст под 1 байт бинарных данных отводится 16 бит \(2 байта текстовых данных). Таким образом размер данных удваивается.

  3. Конфигурация в базе хранится одной бинарной строкой. Как только ее размер перевалит за ~0.5Гб.  pg_dump не сможет ее сохранить, это и приводит к ошибке описанной в первом посте.

Что можно сделать.

  1. Использовать pg_basebackup https://its.1c.ru/db/metod8dev#content:5947:hdoc

  2. Перекомпилировать pg_dump заменив оператор выгрузки COPY на бинарный.

В инете есть инфа, что люди так делали, и что характерно, выгруженные данные с исправленного pg_dump`а нормально восстанавливаются стандартным pg_restore.

  1. Сами разработчики PG ограничение в 1Гб снимать не торопятся, так как не уверены, что снятие ограничения не вызовет других конфликтов. Вопрос находится в категории «пожелания».

PS: В техподдержку 1С заявка отправлена. 1С должна была учитывать эту особенность и хранить конфигурацию как-то иначе.


На данный момент проблему резервных копий решили так в том числе благодаря информации с данного обсуждения linux.

Резервная копия создается тремя командами вместо одной:

pg_dump -Z 9 -T config -f путь_к_файлу имя_базы
pg_dump -t config -s -f путь_к_файлу_схемы имя_базы
psql -d имя_базы -c "COPY public.config TO 'путь_к_файлу_конф' WITH BINARY;"

Первой командой выгружаем дамп базы за исключением проблемной таблицы config.

Второй командой выгружаем схему для таблицы config.

Третьей - выгружаем таблицу config в бинарном виде.

В результате у нас на выходе три файла.

Восстановление.

Распаковываем основной архив:
gunzip --keep путь_к_файлу
Восстанавливаем БД, при этом восстанавливается БД без таблицы config
>psql имя_базы < путь_к_распакованному_файлу
Теперь восстанавливаем таблицу config.
Создаем в БД таблицу config:
>psql имя_базы < путь_к_файлу_схемы
Заливаем в таблицу config данные из файла
psql -d имя_базы -c "COPY public.config FROM 'путь_к_файлу_конф' WITH BINARY;"