Резервное копирование данных — это критически важный процесс для обеспечения безопасности и доступности информации.важно настроить корректный и надежный механизм резервного копирования. В данной статье рассмотрим основные подходы к резервному копированию 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 — это гарантия защиты данных и минимизации рисков потери информации. Используйте описанные методы в зависимости от ваших задач и инфраструктуры.