Skip to content

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 main

WAL 归档配置

配置 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 需要:

  1. 配置 WAL 归档
  2. 定期执行全量备份
  3. 保留足够的 WAL 文件
  4. 使用 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 性能
  • 考虑使用不同的备份工具或方法
  • 配置备份失败告警