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.

Сценарии использования

  1. Сервер полностью вышел из строя (диск сгорел, данные повреждены).
    • Регулярно делаете pg_basebackup на удалённый сервер или в облако.
    • При аварии — разворачиваете бэкап на новом сервере.
# Ежедневный бэкап на NFS-шару
pg_basebackup -h prod-db -U backup_user -D /backup/nfs/prod-$(date +%F) -P -R --wal-method=stream
 
# Восстановление: просто скопировать каталог → запустить PostgreSQL.
  1. Нужна горячая резервная копия для отказоустойчивости или масштабирования чтения.
    • 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`.
  1. Переезд с физического сервера на виртуальную машину или в облако.
  • Делаете pg_basebackup на целевой сервер.
  • Переключаете приложение после синхронизации.
# На новом сервере в облаке
pg_basebackup -h old-server.internal -U backup -D $PGDATA -P -R --wal-method=stream
# Запускаете PostgreSQL
# Ждёте, пока отставание станет 0
# Меняете DNS или connection string

pg_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 dbpg_dump -F t -f file.tar dbpg_dump -F d -f dir/ db
Восстанавливается черезpsql -f file.sqlpg_restore -d db file.dbpg_restore -d db file.tarpg_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.dbpg_restore -l file.tarpg_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
  • Требует создания пустой БД и пользователя вручную.

Сценарии использования

  1. Миграция между версиями PostgreSQL
    • Работает даже между очень разными версиями.
  2. Перенос БД на другой сервер или в облако Не требует доступа к файловой системе. Работает через обычное сетевое подключение.
  3. Создание тестовой/разработческой копии Нужна копия production-БД для отладки, но без чувствительных данных. Делаете дамп, При необходимости — очищаете/анонимизируете данные, Загружаете в dev-среду.
# Только структура (без данных)
pg_dump --schema-only mydb > schema.sql
 
# Только данные определённой таблицы
pg_dump -t users --data-only mydb > users_data.sql
  1. Частичное резервное копирование Нужно сохранить только критически важные таблицы (например, orders, users), а не всю БД. Поддерживает фильтрацию по: Таблицам (-t), Схемам (-n), Условиям (—where).
  2. Клонирование БД внутри одного кластера
createdb prod_staging
pg_dump prod | psql prod_staging
  1. Нужно перенести данные из PostgreSQL в MySQL, ClickHouse или CSV-файлы.
  2. Экстренное сохранение данных при повреждении Повреждённые строки будут пропущены (с ошибкой), но остальные — сохранены.
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
Миграция на новую версию PostgreSQLpg_dump
Перенос одной БД на другой серверpg_dump
Резервная копия раз в деньОба: pg_basebackup для DR, pg_dump для логических точек
Копирование части данных (например, только production)pg_dump

КАК ХОРОШАЯ ИДЕЯ: Используйте оба метода вместе

  • pg_basebackup + WAL archiving → для Point-in-Time Recovery,
  • pg_dump → для логических снимков (например, «состояние на конец месяца»).