В работе системного администратора 1С часто возникает ситуация, когда в одном кластере PostgreSQL находятся несколько высоконагруженных баз (например, ERP и Документооборот). Использование утилиты pg_probackup позволяет создавать надежные физические бэкапы всего кластера, однако стандартный механизм восстановления подразумевает развертывание всего кластера целиком. Рассмотрим, как решить задачу восстановления только одной конкретной базы на определенную точку во времени (Point-in-Time Recovery — PITR), не затрагивая остальные работающие базы.
Для начала проанализируем ситуацию: в PostgreSQL понятие «кластер» (экземпляр) означает запущенный процесс СУБД, который управляет набором баз данных. Все базы внутри одного кластера используют общий журнал транзакций (WAL). Именно поэтому физическое восстановление на момент времени (PITR) технически сложно выполнить для одной базы внутри «живого» кластера — журналы содержат перемешанные записи всех транзакций всех баз.
Разберем встроенную возможность pg_probackup, которая позволяет извлечь только нужные данные из общего бэкапа. Утилита поддерживает параметры фильтрации при восстановлении. Рассмотрим команду подробнее:
pg_probackup restore -B /path/to/backup_dir \
--instance my_instance \
--db-include=my_target_db \
--recovery-target-time='2023-10-27 17:20:00' \
-D /path/to/new_data_directory
При выполнении этой команды мы должны учитывать несколько важных моментов:
-D.--db-include заставляет утилиту копировать только файлы выбранной базы и необходимые системные таблицы. Однако процесс PITR все равно потребует проигрывания журналов транзакций, чтобы довести базу до нужного состояния.pg_dump нужной базы и загрузить её в основной кластер.Выясним, является ли правильным запуск нескольких экземпляров PostgreSQL на одном сервере. На практике для крупных внедрений 1С (ERP, Управление холдингом) это часто считается лучшей практикой. Разделив базы по разным кластерам, мы получаем полную изоляцию ресурсов и журналов транзакций.
Разберем по шагам, как настроить второй инстанс в Linux (Debian):
mkdir /var/lib/postgresql/12/erp_cluster.sudo -u postgres pg_ctlinitdb -D /var/lib/postgresql/12/erp_cluster.postgresql.conf нового кластера меняем порт: port = 5433.shared_buffers и другие параметры памяти под конкретную задачу базы.Преимущества такого подхода:
pg_probackup настраивается для каждого инстанса отдельно.Если разделение на разные инстансы сейчас невозможно, проанализируем сценарий «аварийного восстановления» через промежуточный сервер или временную директорию. Этот метод позволяет не перегружать основной сервер в процессе восстановления.
Рассмотрим алгоритм действий:
--db-include) восстановление бэкапа на свободное место на диске.
pg_dump -p 5433 -d target_db -F c -f /tmp/target_db_pitr.backup
pg_restore -p 5432 -d target_db /tmp/target_db_pitr.backup
Посмотрим на ситуацию шире. Если требования к восстановлению отдельных баз критичны, стоит рассмотреть утилиту pgBackRest. Она считается «золотым стандартом» для работы с большими объемами данных в PostgreSQL.
В pgBackRest параметр --db-include работает аналогично, но механизмы проверки целостности и параллельного восстановления часто показывают более высокую производительность. Принцип остается тем же: физический бэкап всегда восстанавливается как новый кластер, из которого затем извлекается нужная база через логический дамп.
Проанализировав все варианты, сформируем оптимальную стратегию для системного администратора 1С:
1. Комбинируйте методы: Используйте pg_probackup для ежедневных полных копий и хранения WAL (для PITR). Параллельно делайте pg_dump наиболее важных баз раз в сутки (например, в обед), чтобы иметь возможность быстро «откатить» мелкие ошибки пользователей без запуска процедуры физического восстановления.
2. Изолируйте ERP: Для критически важных баз ERP, где простой стоит очень дорого, выделите отдельный инстанс PostgreSQL. Это упростит жизнь при необходимости восстановления «на 15 минут назад».
3. Проверяйте бэкапы: Регулярно проводите тестовое восстановление. Помните, что наличие файлов бэкапа не гарантирует успешность восстановления, пока вы не проверили это на практике.
Для автоматизации создания бэкапов через pg_dump в Linux можно использовать простой скрипт в cron:
#!/bin/bash
DATE=$(date +%Y-%m-%d_%H-%M)
PGPASSWORD="ваш_пароль" pg_dump -U postgres -h localhost -p 5432 -F c my_database > /backup/1c/my_db_$DATE.backup
Однако помните, что такой метод (дамп) не заменяет полноценный физический бэкап с поддержкой PITR, а лишь дополняет его для удобства точечного восстановления.