DBAtlas · 数据库运维图谱

自动化备份(pgBackRest/Barman/Xtrabackup/cron)

症状

目标:自动化数据库备份;通过定时的完整+增量+WAL/binlog 归档、保留策略、验证和异地副本,构建可靠的恢复链。

1. 选择合适的备份工具

为你的引擎选择工具:PostgreSQL 可选 pgBackRest 或 Barman(物理备份 + WAL 归档 + PITR);MySQL/MariaDB 可选 Percona XtraBackup(在线物理备份),小数据集可用 mysqldump/mydumper(逻辑备份)。物理工具在大型数据库上提供快速、一致的备份 + 时间点恢复;逻辑导出可移植,但在大数据量下较慢。

PostgreSQL

# pgBackRest or Barman

MySQL

# physical: xtrabackup
# logical: mysqldump / mydumper

2. 构建完整 + 增量 + 持续归档链

通过每周/每天的完整备份、其间的增量/差异备份,以及持续的 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 中打开 →