pg_basebackupиpg_dump— это два фундаментально разных способа резервного копирования в PostgreSQL
pg_basebackup (физический бэкап)
— это мощный инструмент для создания физических (низкоуровневых) резервных копий всего кластера PostgreSQL. Он незаменим в сценариях, где важны полнота, скорость восстановления и точная копия состояния сервера.
pg_basebackup - Применение
Принцип
- Подключается к primary как реплика.
- Получает полный снимок файлов из
PGDATA:base/— данные таблиц,pg_wal/— WAL-файлы (или создаёт слот для их получения),global/,pg_xact/,pg_multixact/и все служебные каталоги.
- Гарантирует согласованность на уровне страниц благодаря checkpoint’у и WAL.
Страница данных (data page) — это базовая единица хранения в PostgreSQL, представляющая собой блок размером 8 КБ, в котором хранятся строки таблиц (tuples), индексы, служебные структуры и метаданные.
pg_basebackup -h primary -U backup_user -D /backup/data -P -R --wal-method=streamОсобенности:
- Копирует весь кластер (все БД, роли, расширения, настройки).
- Требует
superuserили праваREPLICATION. - Результат — готовый к запуску каталог данных.
- Может создавать replication slot для непрерывной архивации WAL.
Восстановление
- Просто заменить
PGDATA→ запустить PostgreSQL. - Можно использовать для Point-in-Time Recovery (PITR) с архивом WAL.
Сценарии использования
- Сервер полностью вышел из строя (диск сгорел, данные повреждены).
- Регулярно делаете
pg_basebackupна удалённый сервер или в облако. - При аварии — разворачиваете бэкап на новом сервере.
- Регулярно делаете
# Ежедневный бэкап на NFS-шару
pg_basebackup -h prod-db -U backup_user -D /backup/nfs/prod-$(date +%F) -P -R --wal-method=stream
# Восстановление: просто скопировать каталог → запустить PostgreSQL.- Нужна горячая резервная копия для отказоустойчивости или масштабирования чтения.
pg_basebackupсоздаёт полностью синхронизированную копию, готовую к работе в режиме streaming replication.
# На standby-сервере
pg_basebackup -h primary -U repuser -D /var/lib/postgresql/18/main -P -R --wal-method=stream
# Флаг `-R` создаёт standby.signal и primary_conninfo автоматически
systemctl start postgresql@18-main
# Готово! Standby сразу начинает получать WAL и обслуживать `SELECT`.- Переезд с физического сервера на виртуальную машину или в облако.
- Делаете
pg_basebackupна целевой сервер. - Переключаете приложение после синхронизации.
# На новом сервере в облаке
pg_basebackup -h old-server.internal -U backup -D $PGDATA -P -R --wal-method=stream
# Запускаете PostgreSQL
# Ждёте, пока отставание станет 0
# Меняете DNS или connection stringpg_dump (логический бэкап)
pg_dump, pg_dumpall, pg_restore - Применение
Принцип
- Подключается к БД как обычный клиент.
- Через SQL-запросы читает:
- Структуру (
CREATE TABLE,INDEX,FUNCTION), - Данные (
COPY ... TOилиINSERT).
- Структуру (
- Формирует логический поток, не зависящий от внутреннего устройства PostgreSQL.
# В SQL-формате
pg_dump -h localhost -U user mydb > mydb.sql
# В кастомном бинарном формате (рекомендуется)
pg_dump -Fc mydb > mydb.dump| Характеристика | pg_dump — plain SQL (-F p) | pg_dump — custom (-F c) | pg_dump — tar (-F t) | pg_dump — directory (-F d) | pg_restore |
|---|---|---|---|---|---|
| Тип файла | Текстовый SQL-скрипт | Двоичный архив (один файл) | TAR-архив (ограниченная структура) | Каталог с множеством файлов | Утилита для восстановления из архивов |
| Читаемость | ✅ Человекочитаемый | ❌ Нет | ❌ Нет (но можно распаковать как tar) | ❌ Нет (множество двоичных файлов) | — |
| Создаётся через | pg_dump db > file.sql или -F p | pg_dump -F c -f file.db db | pg_dump -F t -f file.tar db | pg_dump -F d -f dir/ db | — |
| Восстанавливается через | psql -f file.sql | pg_restore -d db file.db | pg_restore -d db file.tar | pg_restore -d db dir/ | Только с -F c, -F t, -F d |
| Поддержка частичного восстановления | ❌ Нет (только ручной фильтр) | ✅ Да (-t, -n, -T, -N и др.) | ✅ Да (но с ограничениями) | ✅ Да | ✅ Основная функция |
| Параллельное восстановление | ❌ Нет | ✅ Да (-j N) | ❌ Нет | ✅ Да (-j N) | Поддерживает -j только для -F c и -F d |
| Поддержка больших объектов (BLOB) | ✅ Да (через COPY или SELECT) | ✅ Полная | ⚠️ Ограничена (до 8 ГБ на объект) | ✅ Полная | ✅ Да |
| Сжатие | ❌ Нет (но можно gzip вручную) | ✅ Встроено (уровень по умолчанию) | ❌ Нет | ✅ Встроено (на уровне файлов) | — |
| Макс. размер объекта | Не ограничен | Не ограничен | ≤ 8 ГБ на объект | Не ограничен | — |
| Использование в продакшене | Для простых задач, миграций, отладки | ✅ Рекомендуется для резервного копирования | Редко (устаревший) | ✅ Для очень больших БД | ✅ Обязателен для работы с архивами |
| Просмотр содержимого без восстановления | Открыть в редакторе | pg_restore -l file.db | pg_restore -l file.tar | pg_restore -l dir/ | ✅ Команда -l (list) |
pg_restore - не работает с plain SQL. |
Подробнее о командах в pg_dump, pg_dumpall, pg_restore - Применение
Особенности
- Копирует только одну БД (по умолчанию).
- Не копирует: роли, табличные пространства, настройки сервера.
- Можно восстановить в другую версию PostgreSQL (в пределах совместимости).
- Можно выбрать подмножество: таблицы, схемы, данные без DDL и т.д.
Восстановление
- Для SQL:
psql -f mydb.sql - Для кастомного:
pg_restore -d newdb mydb.dump - Требует создания пустой БД и пользователя вручную.
Сценарии использования
- Миграция между версиями PostgreSQL
- Работает даже между очень разными версиями.
- Перенос БД на другой сервер или в облако Не требует доступа к файловой системе. Работает через обычное сетевое подключение.
- Создание тестовой/разработческой копии Нужна копия production-БД для отладки, но без чувствительных данных. Делаете дамп, При необходимости — очищаете/анонимизируете данные, Загружаете в dev-среду.
# Только структура (без данных)
pg_dump --schema-only mydb > schema.sql
# Только данные определённой таблицы
pg_dump -t users --data-only mydb > users_data.sql- Частичное резервное копирование Нужно сохранить только критически важные таблицы (например, orders, users), а не всю БД. Поддерживает фильтрацию по: Таблицам (-t), Схемам (-n), Условиям (—where).
- Клонирование БД внутри одного кластера
createdb prod_staging
pg_dump prod | psql prod_staging- Нужно перенести данные из PostgreSQL в MySQL, ClickHouse или CSV-файлы.
- Экстренное сохранение данных при повреждении Повреждённые строки будут пропущены (с ошибкой), но остальные — сохранены.
pg_dump --inserts --table=orders mydb > orders_recovery.sqlСравнение: ключевые различия pg_basebackup vs pg_dump
| Характеристика | pg_basebackup (физический) | pg_dump (логический) |
|---|---|---|
| Уровень | Файловая система (страницы, WAL) | SQL (таблицы, строки) |
| Что копируется | Весь кластер (все БД, системные данные) | Одна БД (или часть) |
| Скорость | Очень быстро (прямое копирование) | Медленнее (через SQL) |
| Размер бэкапа | = размеру PGDATA (может быть сжат) | Меньше (только данные + DDL) |
| Восстановление | Мгновенно (заменить каталог) | Требует pg_restore/psql |
| Версии PostgreSQL | Только та же major-версия | Можно в более новую версию |
| Требования | REPLICATION или superuser | Обычный пользователь с правами на SELECT |
| Использование | PITR, клонирование кластера, HA | Миграции, переносы, частичные бэкапы |
| Блокировки | Нет (hot backup) | Нет (MVCC), но может быть ACCESS SHARE |
| DDL | Копируется автоматически | Экспортируется как SQL |
| Роли, права | Да | Нет (только через pg_dumpall --roles-only) |
Важные нюансы
pg_basebackup
- Не может пропустить таблицу — только весь кластер.
- Требует много места — полная копия
PGDATA. - Нельзя восстановить в другую версию — даже minor-апдейт может сломать формат страниц.
- Идеален для disaster recovery и создания standby.
pg_dump
- Не сохраняет OID’ы (если не указано явно) → проблемы при восстановлении ссылок.
- Медленно на больших БД (особенно в текстовом формате).
- Требует ручной настройки окружения (пользователи, расширения).
- Идеален для миграций и переносов
Когда что использовать?
| Сценарий | Рекомендуемый инструмент |
|---|---|
| Полное аварийное восстановление | pg_basebackup + WAL archive |
| Создание standby-сервера | pg_basebackup |
| Миграция на новую версию PostgreSQL | pg_dump |
| Перенос одной БД на другой сервер | pg_dump |
| Резервная копия раз в день | Оба: pg_basebackup для DR, pg_dump для логических точек |
| Копирование части данных (например, только production) | pg_dump |
КАК ХОРОШАЯ ИДЕЯ: Используйте оба метода вместе
pg_basebackup+ WAL archiving → для Point-in-Time Recovery,pg_dump→ для логических снимков (например, «состояние на конец месяца»).