Резервное копирование данных — это критически важный процесс для обеспечения безопасности и доступности информации.важно настроить корректный и надежный механизм резервного копирования. В данной статье рассмотрим основные подходы к резервному копированию 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="/mnt/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-17/bin/"
MUTT_CFG="$HOME/.muttrc"
EMAIL="test@test.ru" # Email для уведомлений
# Создание директории для резервных копий, если её нет
mkdir -p "$BACKUP_DIR"
# Функция для логирования
log() {
echo "$(date +%Y-%m-%d\ %H:%M:%S) - $1" | tee -a "$LOG_FILE"
}
Функция отправки email через mutt
send_email() {
local subject=$1
local body=$2
local attachment=${3:-}
# Базовые параметры отправки
local mutt_cmd="mutt"
# Добавляем конфиг если существует
[ -f "$MUTT_CFG" ] && mutt_cmd+=" -F $MUTT_CFG"
# Формируем команду
mutt_cmd+=" -s \"$subject\""
[ -n "$attachment" ] && mutt_cmd+=" -a \"$attachment\""
mutt_cmd+=" -- \"$EMAIL\""
# Отправляем письмо
echo -e "$body" | eval "$mutt_cmd" >/dev/null 2>&1
if [ $? -eq 0 ]; then
log "Уведомление отправлено: $subject"
else
log "Ошибка отправки уведомления: $subject"
fi
}
# Определяем сервис
SERVICE=$(systemctl list-units --type=service --all | grep "srv1cv8" | grep ".service" | awk '{print $1}')
яем, найден ли сервис
if [ -n "$SERVICE" ]; then
echo "Найден сервис: $SERVICE" >> "$BACKUP_DIR"/backup.log
# Останавливаем сервис
sudo /bin/systemctl stop "$SERVICE"
else
echo "Сервис не найден!" >> "$BACKUP_DIR"/backup.log
fi
# Функция для логирования
log() {
echo "$(date +%Y-%m-%d\ %H:%M:%S) - $1" | tee -a "$LOG_FILE"
}
# Проверка доступности pg_basebackup и zstd
if ! command -v $PG_DIR/pg_basebackup &> /dev/null; then
log "Ошибка: Команда pg_basebackup не найдена!"
exit 1
fi
if ! command -v zstd &> /dev/null; then
log "Ошибка: Команда zstd не найдена!"
exit 1
fi
if ! command -v mutt &> /dev/null; then
log "Ошибка: Команда mutt не найдена!"
exit 1
fi
if ! command -v lftp &> /dev/null; then
log "Ошибка: Команда lftp не найдена!"
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 "Ошибка при выполнении резервного копирования! $BACKUP_DIR/$PG_LABEL.tar.zst"
send_email "шибка при выполнении резервного копирования! $BACKUP_DIR/$PG_LABEL.tar.zst"
# Попытка перезапуска 1С
log "Попытка аварийного перезапуска 1С"
if service_control restart; then
log "Сервис 1С успешно перезапущен после сбоя"
else
log "НЕУДАЧНЫЙ ПЕРЕЗАПУСК 1С! Требуется ручное вмешательство!"
send_email "НЕУДАЧНЫЙ ПЕРЕЗАПУСК 1С! Требуется ручное вмешательство!"
fi
exit 1
fi
# Запускаем сервис обратно, если он был остановлен
if [ -n "$SERVICE" ]; then
log "Запускаем сервис: $SERVICE"
sudo /bin/systemctl start "$SERVICE"
else
log "Сервис не найден для запуска! "$SERVICE""
send_email "Сервис не найден для запуска! "$SERVICE" "
fi
# Удаление старых резервных копий (опционально, например, старше 21 дней)
find "$BACKUP_DIR" -type f -name "*.tar.zst" -mtime +4 -exec rm -rf {} \; && log "Удалены старые резервные копии старше 4 дней"
# Удаление старых резервных копий (опционально, например, старше 21 дней)
find /mnt/backup/week/ -mtime +4 -exec rm -rf {} \; && log "Удалены старые резервные копии старше 4 дней"
# Провер
Параметры команды:
-U— пользователь PostgreSQL.-D— каталог для сохранения резервной копии.-F tar— формат резервной копии (tar)-z— сжатие данных.-P— отображение прогресса
-X метод —wal-method — Включает в резервную копию все необходимые файлы журнала предзаписи (файлы WAL). В том числе включаются все файлы журнала, сгенерированные в процессе создания резервной копии. Любой метод, кроме none, позволяет запустить сервер с восстановленным каталогом, не используя архив WAL.
Таким образом будет получена полностью самодостаточная резервная копия. Fetch Файлы журнала предзаписи собираются в конце процесса копирования. Таким образом необходимо установить достаточно большое значение параметра wal_keep_size, чтобы избежать преждевременного удаления нужных данных журнала. В случае переработки этих данных до завершения процесса копирования возникнет ошибка, а копия будет непригодной к использованию.
Настройка отправки писем через mutt можно ознакомится в статье Mutt почтовый клиент для linux
Для автоматизации процесса создайте скрипт и добавьте его в планировщик задач (например, 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 — это гарантия защиты данных и минимизации рисков потери информации. Используйте описанные методы в зависимости от ваших задач и инфраструктуры.