Перенос PostgreSQL: согласовать формат дампа и восстановление
Для логического переноса одной базы используйте пару pg_dump и подходящий инструмент восстановления. Plain SQL читается через psql; custom-архив, созданный с -Fc, восстанавливается через pg_restore. Расширение имени файла не определяет его формат.
До выгрузки
- Сверьте версии исходного сервера, клиента pg_dump и целевого PostgreSQL. Дамп не является способом гарантированного переноса на более старую major-версию.
- Проверьте доступные расширения, кодировку, locale, объём диска, роли и права. pg_dump одной базы не переносит роли всего кластера.
- Отдельно спланируйте момент прекращения записей и откат. Консистентный снимок дампа не включает изменения, сделанные после его начала.
Создать и проверить custom-архив
Примеры используют условные SOURCE_HOST, DEST_HOST, export_user и migration. Подставьте свои значения; права учётных записей должны быть заранее согласованы. На машине с клиентом PostgreSQL:
pg_dump --host=SOURCE_HOST --username=export_user --format=custom --file=app.dump app
pg_restore --list app.dump > app.dump.list
scp app.dump migration@DEST_HOST:app.dumpПросмотрите ошибки и предупреждения pg_dump и список содержимого. Наличие файла не доказывает успешное резервное копирование. Для удалённого подключения настройте защищённый канал и проверку сертификата, например через параметры libpq. Пароли не вставляйте в URL команд или публикуемые журналы.
Восстановить в отдельную пустую базу
Следующие команды выполняются на целевой машине, где находится app.dump. Роль app_owner уже должна существовать, а migration должна иметь право создать базу и перейти к этой роли:
createdb --host=127.0.0.1 --username=migration --template=template0 --owner=app_owner app_migration
pg_restore --host=127.0.0.1 --username=migration --dbname=app_migration --role=app_owner --no-owner --no-privileges --exit-on-error --single-transaction app.dumpВ этом варианте исходные владельцы и ACL намеренно не переносятся: объекты создаются от app_owner, а необходимые GRANT задаются отдельно после проверки. Не применяйте этот вариант механически, если важно сохранить исходную модель прав. Опция --single-transaction позволяет откатить эту попытку целиком при ошибке; не сочетайте её с параллельным --jobs.
Проверить и только затем переключить приложение
- Убедитесь, что восстановление завершилось без ошибок; сравните ожидаемые схемы, таблицы, индексы, ограничения и критичные количества строк.
- Проверьте права приложения, последовательности, расширения и основные операции чтения/записи в тестовом подключении. Обновите статистику планировщика после переноса.
- Перед финальным дампом остановите или контролируемо заморозьте записи; иначе потребуется отдельная схема догона изменений.
- Сохраните исходную базу и план отката до приёмки. Не восстанавливайте непроверенный чужой дамп в рабочую базу: его SQL способен выполнять код.