Резервное копирование PostgreSQL: pg_dump, pg_dumpall и pg_basebackup
- Ошибка
pg_dump: error: query failed: canceling statement due to statement_timeout. - Многочасовое создание дампа крупной базы данных 1С в один поток.
- Потеря ролей пользователей, прав доступа и табличных пространств при разворачивании дампа на новом сервере.
1. Быстрое многопоточное логическое копирование через pg_dump (Custom Format)
Всегда используйте кастомный сжатый формат -Fc или формат каталога -Fd для распараллеливания:
# Многопоточный бэкап базы в 4 потока со сжатием Zstandard
pg_dump -h 127.0.0.1 -p 5432 -U postgres -d Enterprise1C \
-Fd -j 4 -Z zstd:6 \
-f /mnt/backups/Enterprise1C_dump_dir2. Сохранение глобальных объектов кластера (логины, роли, таблицы)
# Сохранение только глобальных ролей и паролей (без данных баз)
pg_dumpall -h 127.0.0.1 -p 5432 -U postgres --globals-only -f /mnt/backups/globals.sql3. Создание физического бинарного бэкапа через pg_basebackup
# Полная бинарная копия экземпляра с включением всех WAL файлов
pg_basebackup -h 127.0.0.1 -p 5432 -U replicator \
-D /mnt/backups/physical_basebackup/ \
-Ft -z -Xs -P -v4. Восстановление логического дампа через pg_restore
# 1. Восстановление глобальных пользователей
psql -h 127.0.0.1 -U postgres -f /mnt/backups/globals.sql
# 2. Параллельное восстановление структуры и данных в 4 потока
pg_restore -h 127.0.0.1 -p 5432 -U postgres -d Enterprise1C_New \
-j 4 --clean --if-exists /mnt/backups/Enterprise1C_dump_dir Частые вопросы (FAQ)
В чем главное отличие логического бэкапа (pg_dump) от физического (pg_basebackup)?
pg_dump экспортирует SQL-команды/схемы и данные таблиц (работает медленнее, но позволяет восстанавливать отдельные таблицы и переносить данные между разными версиями PostgreSQL). pg_basebackup создает точную бинарную копию файлов кластера (работает быстро, идеален для DR и создания реплик).
Блокирует ли pg_dump работу пользователей в базе данных?
Нет. pg_dump использует транзакцию с уровнем изоляции REPEATABLE READ и читает консистентный снимок данных без блокировки операций SELECT, INSERT, UPDATE, DELETE (блокируются только DDL операции ALTER/DROP TABLE).
Почему нельзя использовать флаг -j (параллелизм) с обычным текстовым форматом .sql?
Параллельный сброс и восстановление поддерживаются только для формата каталога (-Fd) и сжатого кастомного архива (-Fc), так как СУБД требуется TOC-оглавление для распределения объектов между воркерами.
Как избежать падения pg_dump по statement_timeout на тяжелых базах?
Передайте команду отключения таймаута сессии через переменную окружения или флаг: PGOPTIONS="-c statement_timeout=0" pg_dump ...