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

Описание ошибки

  1. У PostgreSQL размер буфера памяти для работы со строками не может превышать 1Гб.
  2. pg_dump развёртывает бинарные строки в текст (под 1 байт бинарных данных отводится 16 бит (2 байта) текстовых данных). Таким образом размер данных удваивается.
  3. Конфигурация в базе хранится одной бинарной строкой. Как только ее размер перевалит за ~0.5Гб, pg_dump не сможет ее сохранить, это и приводит к ошибке.

Способы устранения

  1. Использовать утилиту pg_basebackup
  2. Перекомпилировать pg_dump, заменив оператор выгрузки COPY на бинарный.
    Выгруженные данные с исправленного pg_dump нормально восстанавливаются стандартным pg_restore.
  3. Разработчики PostgreSQL ограничение в 1Гб снимать не торопятся, так как есть риск, что это может вызвать другие проблемы. Вопрос находится в категории “пожелания”.

Создание резервной копии

На данный момент проблему резервных копий решили так.
Резервная копия создается тремя командами вместо одной:

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;"