Бэкап БД PostrgreSQL с бинарными данными происходит с ошибкой
Описание ошибки
- У PostgreSQL размер буфера памяти для работы со строками не может превышать 1Гб.
- pg_dump развёртывает бинарные строки в текст (под 1 байт бинарных данных отводится 16 бит (2 байта) текстовых данных). Таким образом размер данных удваивается.
- Конфигурация в базе хранится одной бинарной строкой. Как только ее размер перевалит за ~0.5Гб, pg_dump не сможет ее сохранить, это и приводит к ошибке.
Способы устранения
- Использовать утилиту pg_basebackup
- Перекомпилировать
pg_dump
, заменив оператор выгрузки COPY на бинарный.
Выгруженные данные с исправленногоpg_dump
нормально восстанавливаются стандартнымpg_restore
. - Разработчики 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 в бинарном виде.
В результате у нас на выходе три файла.
Восстановление.
Распаковываем основной архив:
Восстанавливаем БД, при этом восстанавливается БД без таблицы config: Теперь восстанавливаем таблицу config.Создаем в БД таблицу config: Заливаем в таблицу config данные из файла: