Автоматические бэкапы (pgBackRest/Barman/Xtrabackup/cron)
Симптом
Цель: автоматизировать бэкапы баз данных; построить надёжную цепочку восстановления с плановыми full+incremental бэкапами и архивированием WAL/binlog, хранением (retention), проверкой и внешней копией.
1. Выберите подходящий инструмент бэкапа
Выберите инструмент для вашего движка: pgBackRest или Barman для PostgreSQL (физический бэкап + архив WAL + PITR); Percona XtraBackup (онлайн физический бэкап) для MySQL/MariaDB или mysqldump/mydumper (логический) для небольших объёмов данных. Физические инструменты дают быстрые согласованные бэкапы + восстановление на момент времени для больших баз; логические дампы переносимы, но медленны на больших данных.
PostgreSQL
# pgBackRest or BarmanMySQL
# physical: xtrabackup
# logical: mysqldump / mydumper2. Постройте цепочку 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 backupMySQL
# full
xtrabackup --backup --target-dir=/backup/full
# incremental
xtrabackup --backup --target-dir=/backup/incr1 \
--incremental-basedir=/backup/full3. Планирование бэкапов через 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 backup4. Определите политику хранения
Не накапливайте бэкапы бесконечно; задайте, сколько полных бэкапов и сколько дней архивов хранить, и пусть инструмент автоматически удаляет устаревшие. В pgBackRest это управляется через repo1-retention-full и настройки хранения архива; в Barman — через retention_policy. Хранение должно соответствовать целям восстановления (на сколько дней назад нужно уметь вернуться).
PostgreSQL
# pgbackrest.conf
[global]
repo1-retention-full=4
repo1-retention-archive=8MySQL
# 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.com6. Проверьте бэкап
Наличие бэкапа не означает, что его можно восстановить; регулярно проверяйте целостность. В pgBackRest команда 'verify' и проверки согласованности архива, а в XtraBackup успешный шаг prepare (--prepare) показывают, что бэкап исправен. Запускайте проверку автоматически после каждого бэкапа и поднимайте тревогу при сбое.
PostgreSQL
pgbackrest --stanza=appdb verifyMySQL
# make the backup consistent (verification)
xtrabackup --prepare --target-dir=/backup/full7. Регулярно проводите учения по восстановлению
Самый важный шаг: периодически ДЕЙСТВИТЕЛЬНО восстанавливайте бэкап на отдельный сервер и проверяйте, что база данных открывается и данные согласованы. Такие учения позволяют измерить время восстановления (RTO) и найти пробелы в процедуре вне инцидента. Непроверенный бэкап — не бэкап.
PostgreSQL
# restore + PITR on a separate server
pgbackrest --stanza=appdb \
--type=time --target="2026-07-01 03:00:00" restoreMySQL
# copy the prepared backup back to the data directory
xtrabackup --copy-back --target-dir=/backup/full