PostgreSQL: pg_dump и pg_restore — бэкап и восстановление
Резервное копирование и восстановление одной БД через pg_dump и pg_restore. Строго по официальной документации PostgreSQL. Копируй — вставляй — работает.
Как использовать
- Замени dbname, mydb, backup.sql и пути на свои.
- Полный дамп одной БД: pg_dump dbname > backup.sql.
- Восстановление: psql -d mydb -f backup.sql (plain) или pg_restore -d mydb backup.dump (custom/directory/tar).
Резервное копирование одной базы данных через pg_dump и восстановление через psql или pg_restore. По PostgreSQL Backup and Restore и pg_dump.
Важно: pg_dump не блокирует других пользователей; дамп согласован на момент старта. Для одной БД — pg_dump; для всего кластера и ролей — pg_dumpall.
1. Plain SQL (текстовый дамп)
Универсальный формат: обычный SQL-файл. Восстанавливается через psql.
# Дамп одной БД в файл
pg_dump dbname > backup.sql
# Только схема (без данных)
pg_dump -s dbname > schema.sql
# Сжатие на лету
pg_dump dbname | gzip > backup.sql.gz
Восстановление:
# Создай БД, если её нет
createdb -U postgres mydb
# Восстановление из plain SQL
psql -d mydb -f backup.sql
# Из сжатого
gunzip -c backup.sql.gz | psql -d mydb -f -
2. Custom / Directory / Tar (форматы для pg_restore)
Форматы, которые восстанавливаются только через pg_restore. Позволяют выборочно восстанавливать объекты и распараллеливать.
# Custom format (один файл .dump) — рекомендуется
pg_dump -Fc dbname > backup.dump
# Directory format (каталог с файлами) — можно распараллелить
pg_dump -Fd dbname -f backup_dir
# Tar format
pg_dump -Ft dbname > backup.tar
Восстановление из custom-архива:
# В существующую БД (объекты добавляются; при конфликтах — ошибки)
pg_restore -d mydb backup.dump
# Очистить БД перед восстановлением (осторожно!)
pg_restore -d mydb --clean --if-exists backup.dump
# Только схема
pg_restore -s -d mydb backup.dump
Из directory с параллельными заданиями:
pg_restore -d mydb -j 4 backup_dir
3. Cron: ночной бэкап
# Ежедневно в 03:00 — дамп и сжатие
0 3 * * * pg_dump -U postgres myapp | gzip > /backup/myapp_$(date +\%Y\%m\%d).sql.gz
Или custom format для последующего pg_restore:
0 3 * * * pg_dump -U postgres -Fc myapp > /backup/myapp_$(date +\%Y\%m\%d).dump
Кратко
| Задача | Команда |
|---|---|
| Дамп в SQL | pg_dump dbname > backup.sql |
| Только схема | pg_dump -s dbname > schema.sql |
| Дамп для pg_restore | pg_dump -Fc dbname > backup.dump |
| Восстановить SQL | psql -d mydb -f backup.sql |
| Восстановить dump | pg_restore -d mydb backup.dump |
Документация: