外观
PostgreSQL 增量备份与全量备份结合
备份策略设计
备份策略建议
| 备份类型 | 频率 | 保留周期 | 用途 |
|---|---|---|---|
| 全量备份 | 每周一次 | 4周 | 基础恢复点 |
| 增量备份 | 每天一次 | 1周 | 减少备份时间和存储空间 |
| WAL 备份 | 实时 | 2周 | 实现 PITR |
全量备份配置
使用 pg_basebackup 进行全量备份
bash
# 创建备份目录
mkdir -p /backup/postgresql/full/$(date +%Y%m%d)
# 执行全量备份
pg_basebackup -h localhost -U replication_user -D /backup/postgresql/full/$(date +%Y%m%d) -F p -X stream -R -P
# 验证备份完整性
pg_verifybackup /backup/postgresql/full/$(date +%Y%m%d)使用 Barman 进行全量备份
bash
# 配置 Barman 主库连接(barman.conf)
[main]
barman_home = /var/lib/barman
barman_user = barman
log_file = /var/log/barman/barman.log
compression = gzip
retention_policy = RECOVERY WINDOW OF 14 DAYS
# 添加主库配置(main.conf)
[main]
host = localhost
user = barman
dbname = postgres
port = 5432
backup_method = postgres
backup_options = exclusive_backup
streaming_archiver = on
slot_name = barman增量备份配置
使用 WAL-E 进行增量备份
bash
# 安装 WAL-E
pip install wal-e
# 配置环境变量
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
export WALE_S3_PREFIX=s3://your-bucket/postgresql/backup
# 执行基础备份(全量)
wal-e backup-push /var/lib/postgresql/15/main
# 查看备份列表
wal-e backup-list使用 pg_probackup 进行增量备份
bash
# 安装 pg_probackup
yum install -y pg_probackup15
# 初始化备份目录
pg_probackup-15 init -B /backup/postgresql/probackup
# 添加实例
pg_probackup-15 add-instance -B /backup/postgresql/probackup -D /var/lib/postgresql/15/main -i main
# 执行全量备份
pg_probackup-15 backup -B /backup/postgresql/probackup -i main -b full
# 执行增量备份
pg_probackup-15 backup -B /backup/postgresql/probackup -i main -b delta
# 查看备份列表
pg_probackup-15 show -B /backup/postgresql/probackup -i mainWAL 归档配置
配置 PostgreSQL WAL 归档
sql
-- 启用 WAL 归档
ALTER SYSTEM SET wal_level = 'replica';
ALTER SYSTEM SET archive_mode = 'on';
ALTER SYSTEM SET archive_command = 'cp %p /backup/postgresql/wal/%f';
ALTER SYSTEM SET archive_timeout = '300';
-- 重新加载配置
SELECT pg_reload_conf();验证 WAL 归档
sql
-- 查看 WAL 归档状态
SHOW archive_mode;
SHOW archive_command;
SHOW wal_level;
-- 手动触发 WAL 切换,验证归档
SELECT pg_switch_wal();
-- 检查归档目录
\! ls -la /backup/postgresql/wal/增量备份与全量备份结合恢复
使用 Barman 进行恢复
bash
# 查看可用备份
barman list-backups main
# 执行基础恢复(全量 + WAL)
barman recover main latest /var/lib/postgresql/15/main --target-time "2024-01-24 12:00:00"
# 执行增量恢复
barman recover main latest /var/lib/postgresql/15/main --incremental --target-time "2024-01-24 12:00:00"使用 pg_probackup 进行恢复
bash
# 停止 PostgreSQL
systemctl stop postgresql-15
# 清理数据目录
rm -rf /var/lib/postgresql/15/main/*
# 执行全量恢复
pg_probackup-15 restore -B /backup/postgresql/probackup -i main -D /var/lib/postgresql/15/main --restore-as-user postgres
# 执行增量恢复(基于时间点)
pg_probackup-15 restore -B /backup/postgresql/probackup -i main -D /var/lib/postgresql/15/main --restore-as-user postgres --target-time "2024-01-24 12:00:00"
# 启动 PostgreSQL
systemctl start postgresql-15备份监控与管理
监控备份状态
bash
# 检查 Barman 备份状态
barman check main
barman show-backup main latest
# 检查 pg_probackup 备份状态
pg_probackup-15 validate -B /backup/postgresql/probackup -i main
# 监控 WAL 归档延迟
psql -c "SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn) AS sent_delay, pg_wal_lsn_diff(pg_current_wal_lsn(), flush_lsn) AS flush_delay, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_delay FROM pg_stat_replication;"备份保留策略
bash
# Barman 配置保留策略
barman cron
barman delete main oldest
# pg_probackup 清理旧备份
pg_probackup-15 delete -B /backup/postgresql/probackup -i main --retention-redundancy=3 --retention-window=14
# 清理过期 WAL 文件
find /backup/postgresql/wal -name "000000010000*" -mtime +14 -delete最佳实践
备份性能优化
- 使用压缩:减少备份存储空间和传输时间
- 使用并行备份:提高备份速度
- 在低峰期执行备份:减少对生产环境的影响
- 使用流复制备份:减少备份窗口
备份安全性
- 加密备份:保护敏感数据
- 备份验证:确保备份可以用于恢复
- 离线存储:将备份存储在不同位置,防止灾难
- 访问控制:限制备份目录的访问权限
恢复测试
- 定期测试恢复:确保备份可以正常恢复
- 记录恢复时间:了解恢复所需时间
- 测试 PITR:确保可以恢复到任意时间点
- 文档化恢复流程:确保团队成员都了解恢复步骤
常见问题(FAQ)
Q:增量备份与全量备份相比有什么优势?
A:增量备份的优势包括:
- 减少备份时间
- 减少存储空间使用
- 减少对生产环境的影响
- 更快的备份速度
Q:如何选择合适的增量备份工具?
A:选择增量备份工具的考虑因素:
- 支持的 PostgreSQL 版本
- 备份速度和性能
- 恢复功能和灵活性
- 社区支持和活跃度
- 成本和许可证
Q:如何实现 Point-in-Time Recovery (PITR)?
A:实现 PITR 需要:
- 配置 WAL 归档
- 定期执行全量备份
- 保留足够的 WAL 文件
- 使用
pg_waldump或备份工具进行恢复
Q:备份过程中如何减少对生产环境的影响?
A:减少备份影响的方法:
- 在低峰期执行备份
- 使用压缩减少 I/O
- 使用流复制备份
- 限制备份的 I/O 优先级
- 使用专用备份服务器
Q:如何验证备份的完整性?
A:验证备份完整性的方法:
- 使用
pg_verifybackup验证pg_basebackup备份 - 使用
barman check验证 Barman 备份 - 使用
pg_probackup validate验证 pg_probackup 备份 - 定期测试恢复过程
Q:如何处理备份失败的情况?
A:处理备份失败的方法:
- 检查备份日志,找出失败原因
- 验证备份配置和权限
- 检查磁盘空间和 I/O 性能
- 考虑使用不同的备份工具或方法
- 配置备份失败告警
