Как выполнить резервное копирование и восстановление с pg_dump в PostgreSQL?

MiddlePostgreSQL · Backend·Обновлено 16 августа 2026
Коротко
pgdump создаёт логический дамп базы данных в одном из форматов (plain, custom, directory, tar), а восстановление выполняется через psql (для plain-формата) или pgrestore (для остальных форматов), которые заново создают объекты и загружают данные.

Что делает pg_dump

pgdump снимает логический дамп одной базы данных: он генерирует набор SQL-команд или бинарные данные, из которых можно воссоздать схему и содержимое таблиц. Дамп консистентен на момент старта — pgdump выполняется в рамках одной транзакции с уровнем изоляции REPEATABLE READ, поэтому параллельные записи в базу не искажают результат.

Форматы дампа

  • plain (-Fp, по умолчанию) — обычный SQL-файл, который можно прочитать текстом и накатить через psql.
  • custom (-Fc) — сжатый бинарный формат, поддерживает выборочное восстановление и параллельность через pg_restore.
  • directory (-Fd) — каждая таблица в отдельном файле, единственный формат, поддерживающий параллельный дамп (-j).
  • tar (-Ft) — архив, похожий на custom, но без сжатия по умолчанию.

Базовые команды

Дамп одной базы в custom-формате со сжатием:

pg_dump -h localhost -U postgres -d mydb -Fc -f mydb.dump

Восстановление в новую (уже созданную) базу:

pg_restore -h localhost -U postgres -d mydb_restored --clean --if-exists mydb.dump

Для plain-формата восстановление делается через psql, а не pg_restore:

psql -h localhost -U postgres -d mydb_restored -f mydb.sql

Параллельное копирование и восстановление

При directory-формате можно ускорить процесс несколькими потоками:

pg_dump -Fd -j 4 -f mydb_dir -d mydb
pg_restore -j 4 -d mydb_restored mydb_dir

pgdumpall vs pgdump

pgdump работает только с одной базой и не сохраняет роли, tablespaces и другие объекты уровня кластера. Для полного резервного копирования кластера используют pg_dumpall, либо комбинацию pg_dumpall --globals-only (роли, права, табличные пространства) плюс `pgdump` по каждой базе в удобном бинарном формате.

Полезные опции

  • --schema-only / --data-only — выгрузить только структуру или только данные.
  • -n schema / -t table — ограничить дамп конкретной схемой или таблицей, --exclude-table — исключить объект.
  • -Z 9 — уровень сжатия для custom/directory форматов.
  • --no-owner, --no-privileges — не выгружать команды смены владельца и прав, удобно при переносе между окружениями с другими ролями.
  • PGPASSWORD или .pgpass — способ передать пароль без интерактивного ввода в скриптах.

Ограничения pg_dump

pgdump создаёt снимок на момент запуска и не подходит для point-in-time recovery — он не хранит WAL и не умеет восстанавливать на произвольный момент времени. Для физического резервного копирования с возможностью PITR используют pg_basebackup вместе с архивированием WAL (archive_command) или инструменты вроде pgBackRest/WAL-G. pgdump также не гарантирует консистентность между несколькими базами одного кластера, если дампить их по отдельности параллельно — для этого нужен единый снимок через pg_dumpall или репликационный слот.

Проверка дампа

Хорошая практика — периодически восстанавливать дамп в тестовое окружение и сверять контрольные метрики (количество строк, чек-суммы), поскольку сам факт успешного завершения pg_dump не гарантирует, что восстановление пройдёт без ошибок прав доступа или несовместимости версий сервера.

Что хочет услышать интервьюер

Кандидат знает разницу между логическим (pg_dump) и физическим (pg_basebackup) резервным копированием

Понимает форматы дампа (plain, custom, directory, tar) и когда какой использовать

Знает, чем pg_restore отличается от psql при восстановлении

Упоминает pg_dumpall для дампа ролей и всего кластера

Осознаёт, что pg_dump не даёт point-in-time recovery

Пример: Дамп базы в custom-формате и восстановление

# Создать сжатый дамп в бинарном custom-формате
pg_dump -h localhost -U postgres -d mydb -Fc -f mydb.dump

# Восстановить дамп в существующую базу, предварительно очистив объекты
pg_restore -h localhost -U postgres -d mydb_restored --clean --if-exists mydb.dump

Пример: Параллельный дамп и восстановление через directory-формат

# Дамп в директорию в 4 потока
pg_dump -h localhost -U postgres -d mydb -Fd -j 4 -f mydb_dir

# Восстановление также в 4 потока
pg_restore -h localhost -U postgres -d mydb_restored -j 4 mydb_dir

Пример: Полный бэкап кластера: роли + все базы

# Роли, права и tablespaces отдельно
pg_dumpall -h localhost -U postgres --globals-only -f globals.sql

# Каждую базу дампим отдельно в удобном формате
for db in $(psql -U postgres -t -c "select datname from pg_database where not datistemplate"); do
  pg_dump -U postgres -d "$db" -Fc -f "${db}.dump"
done

Типичные ошибки

Путают pg_dump с физическим бэкапом и думают, что он подходит для PITR

Пытаются восстановить custom/directory дамп через psql вместо pg_restore

Забывают, что pg_dump не сохраняет роли и объекты уровня кластера

Не используют --clean/--if-exists и получают конфликты при повторном восстановлении в существующую базу

Не проверяют дампы восстановлением на тестовом стенде, полагаясь только на успешное завершение команды

Лучшие курсы по теме

изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажерыAI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Node.js с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Nest.js с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.6
3 999 ₽ 6 990 ₽
Подробнее