Резервное копирование данных — это критически важный процесс для обеспечения безопасности и доступности информации.важно настроить корректный и надежный механизм резервного копирования. В данной статье рассмотрим основные подходы к резервному копированию PostgreSQL .
Способы резервного копирования
Существует несколько подходов к резервному копированию PostgreSQL
- Логическое резервное копирование с помощью pg_dump.
- Физическое резервное копирование с помощью pg_basebackup.
Логическое резервное копирование с pg_dump
Логическое резервное копирование позволяет сохранить структуру базы данных и её содержимое в виде SQL-скриптов или архивов. Это наиболее простой способ резервного копирования.
Скрипт для резервного копирования базы:
# Email для уведомлений
email="указать вашь адрес электроной почты"
# Создаём директорию для бэкапа
mkdir -p /home/backup/day/"$DATA"
BACKUP_DIR="/home/backup/day/$DATA"
PG_DIR="/opt/pgpro/1c-15/bin/"
# Список баз данных
DB_BASE="$($PG_DIR/psql -qAt -c 'SELECT * FROM pg_database;' | cut -d"|" -f2 | grep -v 'template' | grep -v 'postgres')"
# Определяем сервис
#SERVICE=$(systemctl | grep "srv1cv8" | grep ".service" | awk '{print $1}')
SERVICE=$(systemctl list-units --type=service --all | grep "srv1cv8" | grep ".service" | awk '{print $1}')
# Удаляем старые бэкапы старше 21 дня
/usr/bin/find /home/backup/day -mtime +21 -delete
# Проверяем, найден ли сервис
if [ -n "$SERVICE" ]; then
echo "Найден сервис: $SERVICE" >> "$BACKUP_DIR"/backup.log
# Останавливаем сервис
sudo /bin/systemctl stop "$SERVICE"
else
echo "Сервис не найден!" >> "$BACKUP_DIR"/backup.log
fi
# Цикл по базам данных
for DB_NAME in $DB_BASE; do
echo "$DATA Начало backup базы ${DB_NAME}" | tee -a "$BACKUP_DIR"/backup.log
# "$PG_DIR"/pg_dump -Fc $"{DB_NAME}" > "$BACKUP_DIR"/${DB_NAME}_$DATA.dump
if ! "$PG_DIR/pg_dump" -Fc "${DB_NAME}" > "${BACKUP_DIR}/${DB_NAME}_${DATA}.dump"; then
echo "$DATA Ошибка завершения backup для базы ${DB_NAME}" | tee -a "$BACKUP_DIR"/backup.log
echo "Postgres ${DB_NAME} failed $DATA for $(hostname)" | /usr/bin/mail -s "Postgres ${DB_NAME} failed" $email
exit 1
else
echo "$DATA Успешное завершение backup для базы ${DB_NAME}" | tee -a "$BACKUP_DIR"/backup.log
fi
echo "--------------------------------------------------------------------" >> "$BACKUP_DIR"/backup.log
done
# Запускаем сервис обратно, если он был остановлен
if [ -n "$SERVICE" ]; then
echo "Запускаем сервис: $SERVICE" >> "$BACKUP_DIR"/backup.log
sudo /bin/systemctl start "$SERVICE"
else
echo "Сервис не найден для запуска!" >> "$BACKUP_DIR"/backup.log
fi
Параметры команды:
-F c
— формат файла (custom).-b
— включает копирование больших объектов (large objects).
Для автоматизации процесса создайте скрипт и добавьте его в планировщик задач (например, cron
) из под пользователя postgres
su - postgres
crontab -e
11 22 * * 1-5 /usr/scripts/postgres_backup.sh
Скрипт будет выполняться с понедельника по пятницу в 22:11
Физическое резервное копирование с pg_basebackup
Физическое резервное копирование сохраняет копию всех данных PostgreSQL. Этот метод подходит для больших баз данных и обеспечивает возможность быстрого восстановления.
Для работы скрипта необходимо установить пакет zstd
apt install zstd
Скрипт для резервного копирования базы:
#!/bin/bash
# Настройки
DATA="$(/bin/date +%Y-%m-%d)"
BACKUP_DIR="/home/backup/week/$DATA" # Директория для резервных копий
PG_USER="postgres" # Пользователь PostgreSQL
PG_LABEL="backup_$(date +%Y%m%d)" # Метка для резервной копии
LOG_FILE="$BACKUP_DIR/backup.log" # Файл для логов
DATA="$(/bin/date +%Y-%m-%d)"
PG_DIR="/opt/pgpro/1c-15/bin/"
# Создание директории для резервных копий, если её нет
mkdir -p "$BACKUP_DIR"
# Функция для логирования
log() {
echo "$(date +%Y-%m-%d\ %H:%M:%S) - $1" | tee -a "$LOG_FILE"
}
# Проверка доступности pg_basebackup и zstd
if ! command -v /opt/pgpro/1c-15/bin/pg_basebackup &> /dev/null; then
log "Ошибка: Команда pg_basebackup не найдена!"
exit 1
fi
if ! command -v zstd &> /dev/null; then
log "Ошибка: Команда zstd не найдена!"
exit 1
fi
# Выполнение резервного копирования с использованием zstd
log "Начало резервного копирования PostgreSQL с сжатием zstd"
if $PG_DIR/pg_basebackup -D - -F tar -X fetch -P -U "$PG_USER" | zstd -o "$BACKUP_DIR/$PG_LABEL.tar.zst" -T0; then
log "Резервное копирование завершено успешно: $BACKUP_DIR/$PG_LABEL.tar.zst"
else
log "Ошибка при выполнении резервного копирования!"
exit 1
fi
# Удаление старых резервных копий (опционально, например, старше 21 дней)
find "$BACKUP_DIR" -type f -name "*.tar.zst" -mtime +21 -exec rm -rf {} \; && log "Удалены старые резервные копии старше 21 дней"
exit 0
Параметры команды:
-U
— пользователь PostgreSQL.-D
— каталог для сохранения резервной копии.-F tar
— формат резервной копии (tar)-z
— сжатие данных.-P
— отображение прогресса
-X метод –wal-method – Включает в резервную копию все необходимые файлы журнала предзаписи (файлы WAL). В том числе включаются все файлы журнала, сгенерированные в процессе создания резервной копии. Любой метод, кроме none, позволяет запустить сервер с восстановленным каталогом, не используя архив WAL.
Таким образом будет получена полностью самодостаточная резервная копия. Fetch Файлы журнала предзаписи собираются в конце процесса копирования. Таким образом необходимо установить достаточно большое значение параметра wal_keep_size, чтобы избежать преждевременного удаления нужных данных журнала. В случае переработки этих данных до завершения процесса копирования возникнет ошибка, а копия будет непригодной к использованию.
Для автоматизации процесса создайте скрипт и добавьте его в планировщик задач (например, cron
) из под пользователя postgres
su - postgres
crontab -e
11 22 * * 7 /usr/scripts/postgres_backup_week.sh
Восстановление данных
Для восстановления базы данных из логической резервной копии выполните:
pg_restore -U postgres -d <имя_базы> /backup/<имя_базы>
Для восстановления из физической копии:
- Остановите сервер PostgreSQL.
- Скопируйте данные из резервной копии в каталог данных PostgreSQL.
- Запустите сервер.
Рекомендации
- Проверка резервных копий. Регулярно проверяйте возможность восстановления данных.
- Хранение копий в разных местах. Используйте облачные хранилища или удалённые серверы для дополнительной защиты.
- Шифрование. Защищайте резервные копии паролями или средствами шифрования.
Настройка надёжного резервного копирования PostgreSQL для 1C — это гарантия защиты данных и минимизации рисков потери информации. Используйте описанные методы в зависимости от ваших задач и инфраструктуры.