DBAtlas · Атлас эксплуатации баз данных

Автоматические бэкапы (pgBackRest/Barman/Xtrabackup/cron)

Симптом

Цель: автоматизировать бэкапы баз данных; построить надёжную цепочку восстановления с плановыми full+incremental бэкапами и архивированием WAL/binlog, хранением (retention), проверкой и внешней копией.

1. Выберите подходящий инструмент бэкапа

Выберите инструмент для вашего движка: pgBackRest или Barman для PostgreSQL (физический бэкап + архив WAL + PITR); Percona XtraBackup (онлайн физический бэкап) для MySQL/MariaDB или mysqldump/mydumper (логический) для небольших объёмов данных. Физические инструменты дают быстрые согласованные бэкапы + восстановление на момент времени для больших баз; логические дампы переносимы, но медленны на больших данных.

PostgreSQL

# pgBackRest or Barman

MySQL

# physical: xtrabackup
# logical: mysqldump / mydumper

2. Постройте цепочку full + incremental + непрерывный архив

Настройте восстановление на момент времени с еженедельными/ежедневными полными бэкапами, инкрементальными/дифференциальными между ними и непрерывным архивированием WAL (PostgreSQL) или binlog (MySQL). pgBackRest управляет типами бэкапа full/diff/incremental и архивом WAL; в PostgreSQL archive_command указывает на pgBackRest. Инкрементальные бэкапы + архив позволяют вернуться к любому моменту времени.

PostgreSQL

# postgresql.conf
archive_mode = on
archive_command = 'pgbackrest --stanza=appdb archive-push %p'

# full backup
pgbackrest --stanza=appdb --type=full backup
# incremental
pgbackrest --stanza=appdb --type=incr backup

MySQL

# full
xtrabackup --backup --target-dir=/backup/full
# incremental
xtrabackup --backup --target-dir=/backup/incr1 \
  --incremental-basedir=/backup/full

3. Планирование бэкапов через cron/timer

Регулярно запускайте команды бэкапа через cron или systemd timer: например, полный бэкап в ночь на воскресенье и инкрементальные в остальные ночи. Планируйте вне рабочего времени и следите, чтобы задания full и incr не пересекались. Записывайте логи вывода и поднимайте оповещение при сбое.

PostgreSQL

# crontab
0 1 * * 0 pgbackrest --stanza=appdb --type=full backup
0 1 * * 1-6 pgbackrest --stanza=appdb --type=incr backup

4. Определите политику хранения

Не накапливайте бэкапы бесконечно; задайте, сколько полных бэкапов и сколько дней архивов хранить, и пусть инструмент автоматически удаляет устаревшие. В pgBackRest это управляется через repo1-retention-full и настройки хранения архива; в Barman — через retention_policy. Хранение должно соответствовать целям восстановления (на сколько дней назад нужно уметь вернуться).

PostgreSQL

# pgbackrest.conf
[global]
repo1-retention-full=4
repo1-retention-archive=8

MySQL

# purge old backups with cron (example)
find /backup -type d -mtime +14 -exec rm -rf {} +

5. Копируйте бэкапы на внешнюю площадку / в S3

Бэкапы не должны оставаться на той же машине/в том же регионе, что и база данных; копируйте их в другое место или объектное хранилище (S3, GCS). pgBackRest может писать напрямую в S3-совместимое хранилище; иначе синхронизируйте с внешней площадкой через rsync/rclone. При аварии (потеря локального диска/региона) спасёт только внешняя копия.

PostgreSQL

# pgbackrest.conf S3 repository
[global]
repo1-type=s3
repo1-s3-bucket=company-backup
repo1-s3-region=eu-central-1
repo1-s3-endpoint=s3.eu-central-1.amazonaws.com

6. Проверьте бэкап

Наличие бэкапа не означает, что его можно восстановить; регулярно проверяйте целостность. В pgBackRest команда 'verify' и проверки согласованности архива, а в XtraBackup успешный шаг prepare (--prepare) показывают, что бэкап исправен. Запускайте проверку автоматически после каждого бэкапа и поднимайте тревогу при сбое.

PostgreSQL

pgbackrest --stanza=appdb verify

MySQL

# make the backup consistent (verification)
xtrabackup --prepare --target-dir=/backup/full

7. Регулярно проводите учения по восстановлению

Самый важный шаг: периодически ДЕЙСТВИТЕЛЬНО восстанавливайте бэкап на отдельный сервер и проверяйте, что база данных открывается и данные согласованы. Такие учения позволяют измерить время восстановления (RTO) и найти пробелы в процедуре вне инцидента. Непроверенный бэкап — не бэкап.

PostgreSQL

# restore + PITR on a separate server
pgbackrest --stanza=appdb \
  --type=time --target="2026-07-01 03:00:00" restore

MySQL

# copy the prepared backup back to the data directory
xtrabackup --copy-back --target-dir=/backup/full
Открыть в DBAtlas →