Как выполнить резервное копирование и восстановление с pg_dump в PostgreSQL?
Что делает 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 и получают конфликты при повторном восстановлении в существующую базу
Не проверяют дампы восстановлением на тестовом стенде, полагаясь только на успешное завершение команды


