外观
PostgreSQL 备份类型选择
全量备份
全量备份是指备份数据库的完整内容,包括所有表、索引、序列、视图、函数等数据库对象以及它们的数据。
全量备份的特点
优点:
- 恢复速度快,只需恢复一个备份文件
- 恢复过程简单,不需要依赖其他备份
- 备份文件独立完整,不受其他备份影响
缺点:
- 备份时间长,尤其是对于大型数据库
- 占用存储空间大
- 对系统资源消耗大,可能影响生产系统性能
全量备份的实现方式
使用 pg_basebackup 进行物理全量备份
bash
# 基本用法
pg_basebackup -h localhost -U repl -D /backup/$(date +%Y%m%d_%H%M%S) -Ft -z -P
# 使用表空间映射
pg_basebackup -h localhost -U repl -D /backup/$(date +%Y%m%d_%H%M%S) -Ft -z -P -T /tablespace1=/backup/tablespace1 -T /tablespace2=/backup/tablespace2使用文件系统级备份
bash
# 使用 tar 命令备份数据目录
pg_ctl -D /var/lib/pgsql/13/data stop
tar -czf /backup/$(date +%Y%m%d_%H%M%S).tar.gz /var/lib/pgsql/13/data
pg_ctl -D /var/lib/pgsql/13/data start全量备份的适用场景
- 数据库规模较小,备份时间可接受
- 对恢复速度要求较高
- 希望备份文件独立完整,便于管理
- 作为增量备份或差异备份的基础
增量备份
增量备份是指仅备份自上次备份(可以是全量备份或增量备份)以来更改的数据。
增量备份的特点
优点:
- 备份时间短,只备份更改的数据
- 占用存储空间小
- 对系统资源消耗相对较小
缺点:
- 恢复过程复杂,需要恢复多个备份文件(基础全量备份 + 所有后续增量备份)
- 恢复速度慢,需要按顺序应用多个备份
- 备份依赖关系复杂,某个增量备份损坏可能影响后续所有备份
增量备份的实现方式
使用 pg_basebackup + WAL 归档
bash
# 1. 配置 WAL 归档
# 在 postgresql.conf 中设置
wal_level = replica
archive_mode = on
archive_command = 'cp %p /archive/%f'
# 2. 执行基础全量备份
pg_basebackup -h localhost -U repl -D /backup/base -Ft -z -P
# 3. 定期备份 WAL 归档文件
rsync -a /archive/ /backup/incremental/$(date +%Y%m%d_%H%M%S)/使用第三方工具
可以使用第三方工具如 Barman、pgBackRest 或 WAL-G 来实现增量备份:
bash
# 使用 pgBackRest 执行增量备份
pgbackrest --stanza=main --log-level-console=info backup --type=incr增量备份的适用场景
- 数据库规模较大,全量备份时间过长
- 对备份窗口要求严格
- 存储空间有限
- 希望减少备份对生产系统的影响
差异备份
差异备份是指仅备份自上次全量备份以来更改的数据。
差异备份的特点
优点:
- 备份时间比全量备份短,比增量备份长
- 占用存储空间比全量备份小,比增量备份大
- 恢复过程比增量备份简单,只需恢复基础全量备份 + 最后一个差异备份
- 恢复速度比增量备份快
缺点:
- 恢复速度比全量备份慢
- 随着时间推移,差异备份文件会越来越大
- 对系统资源消耗比增量备份大
差异备份的实现方式
使用 pgBackRest 执行差异备份
bash
# 执行全量备份作为基础
pgbackrest --stanza=main --log-level-console=info backup --type=full
# 执行差异备份
pgbackrest --stanza=main --log-level-console=info backup --type=diff使用 Barman 执行差异备份
bash
# 执行全量备份
barman backup main
# 执行差异备份
barman backup main --wait --job-id 1 --type=diff差异备份的适用场景
- 数据库规模较大,全量备份时间过长
- 希望恢复过程比增量备份简单
- 对恢复速度要求较高,但可以接受比全量备份慢
- 希望备份依赖关系比增量备份简单
WAL 归档备份
WAL(Write-Ahead Log)归档备份是指备份 PostgreSQL 生成的事务日志,用于时间点恢复(PITR)。
WAL 归档备份的特点
优点:
- 可以恢复到任意时间点
- 备份粒度细,最小可以恢复到单个事务
- 对生产系统影响小,WAL 文件通常较小
缺点:
- 不能单独使用,需要结合全量备份
- 恢复过程复杂,需要先恢复全量备份,再应用所有后续 WAL 文件
- 长时间保留 WAL 文件会占用大量存储空间
WAL 归档备份的配置
sql
-- 在 postgresql.conf 中配置 WAL 归档
wal_level = replica -- 或 logical
archive_mode = on
archive_command = 'cp %p /archive/%f' -- 基本配置
-- 更可靠的配置,使用 rsync 和错误检查
archive_command = 'rsync -a %p archive@backup-server:/archive/%f && echo success > /tmp/archive_success'
archive_timeout = 300 -- 每 5 分钟强制切换 WAL 文件,确保及时归档WAL 归档备份的适用场景
- 需要时间点恢复能力
- 希望能够恢复到任意时间点
- 对数据丢失容忍度低
- 作为全量备份的补充,提供更细粒度的恢复能力
逻辑备份
逻辑备份是指备份数据库对象的逻辑定义和数据,而不是物理文件。
逻辑备份的特点
优点:
- 备份文件可读性强,可以直接查看
- 可以跨版本恢复,支持不同 PostgreSQL 版本之间的迁移
- 可以选择性备份,只备份特定数据库、表或对象
- 恢复时可以重新组织数据,优化存储结构
缺点:
- 备份和恢复速度慢,尤其是对于大型数据库
- 备份文件通常比物理备份大
- 恢复时需要重新构建索引和约束,耗时较长
- 不能恢复到精确的时间点
逻辑备份的实现方式
使用 pg_dump 进行单数据库备份
bash
# 备份整个数据库
pg_dump -h localhost -U postgres -d mydb -F t -f /backup/mydb_$(date +%Y%m%d_%H%M%S).tar
# 只备份特定表
pg_dump -h localhost -U postgres -d mydb -t users -t orders -F t -f /backup/mydb_tables_$(date +%Y%m%d_%H%M%S).tar
# 只备份数据,不备份模式
pg_dump -h localhost -U postgres -d mydb --data-only -F t -f /backup/mydb_data_$(date +%Y%m%d_%H%M%S).tar使用 pg_dumpall 进行全集群备份
bash
# 备份所有数据库和全局对象
pg_dumpall -h localhost -U postgres -f /backup/all_databases_$(date +%Y%m%d_%H%M%S).sql逻辑备份的适用场景
- 需要跨版本迁移数据
- 只需要备份特定数据库、表或对象
- 希望备份文件可读性强,便于查看和修改
- 数据库规模较小,备份和恢复时间可接受
- 需要在恢复时重新组织数据
备份类型选择策略
选择合适的备份类型需要考虑多种因素,包括数据库规模、备份窗口、恢复时间目标(RTO)、恢复点目标(RPO)、存储空间、系统资源等。
1. 考虑数据库规模
- 小型数据库(< 100GB):可以使用全量备份为主,结合 WAL 归档
- 中型数据库(100GB - 1TB):可以使用全量备份 + 差异备份,结合 WAL 归档
- 大型数据库(> 1TB):建议使用全量备份 + 增量备份,结合 WAL 归档
2. 考虑备份窗口
- 备份窗口充裕(> 24小时):可以使用全量备份为主
- 备份窗口有限(< 8小时):建议使用增量备份或差异备份
- 备份窗口非常严格(< 2小时):必须使用增量备份
3. 考虑恢复时间目标(RTO)
- RTO 要求高(< 1小时):建议使用全量备份为主
- RTO 要求中等(1-4小时):可以使用全量备份 + 差异备份
- RTO 要求宽松(> 4小时):可以使用全量备份 + 增量备份
4. 考虑恢复点目标(RPO)
- RPO 要求高(< 5分钟):必须配置 WAL 归档,结合全量备份
- RPO 要求中等(5-30分钟):建议配置 WAL 归档,结合全量备份
- RPO 要求宽松(> 30分钟):可以只使用全量备份
5. 考虑存储空间
- 存储空间充足:可以使用全量备份为主
- 存储空间有限:建议使用增量备份或差异备份
- 存储空间紧张:必须使用增量备份
6. 考虑系统资源
- 系统资源充足:可以使用全量备份为主
- 系统资源紧张:建议使用增量备份或差异备份
不同版本的备份支持
PostgreSQL 9.6 及以下版本
- 支持基本的全量备份(pg_basebackup)
- 支持 WAL 归档,但配置选项相对简单
- 增量备份和差异备份需要依赖第三方工具
- 逻辑备份功能相对简单
PostgreSQL 10 及以上版本
- 增强了 pg_basebackup 功能,支持并行备份
- 支持更灵活的 WAL 归档配置
- 引入了逻辑复制,增强了逻辑备份能力
- 支持更多的备份格式和选项
PostgreSQL 13 及以上版本
- 进一步增强了 pg_basebackup 功能,支持压缩备份
- 支持更细粒度的 WAL 归档控制
- 引入了增量备份的实验性支持
- 增强了逻辑备份的性能
生产环境最佳实践
1. 采用混合备份策略
- 定期执行全量备份(如每周一次)
- 定期执行增量备份或差异备份(如每天一次)
- 配置 WAL 归档,确保可以进行时间点恢复
- 根据业务需求调整备份频率
2. 验证备份的完整性和可恢复性
- 定期测试备份的恢复过程,确保备份可用
- 使用 pg_verifybackup 工具验证全量备份的完整性
- 定期检查 WAL 归档文件的完整性
3. 备份存储策略
- 将备份存储在与生产数据库不同的物理位置
- 考虑使用异地备份,防止本地灾难
- 定期将备份复制到离线存储,防止勒索软件攻击
- 实施备份 retention 策略,定期清理过期备份
4. 监控备份过程
- 监控备份作业的执行状态
- 设置备份失败告警
- 监控备份存储空间使用情况
- 记录备份执行日志,便于审计
5. 文档化备份策略
- 详细记录备份策略,包括备份类型、频率、存储位置等
- 记录恢复过程,便于在灾难发生时快速恢复
- 定期更新备份文档,反映最新的备份策略
常见问题(FAQ)
Q1: 全量备份和增量备份的主要区别是什么?
A1: 全量备份备份数据库的完整内容,恢复简单但备份时间长、占用空间大;增量备份只备份自上次备份以来更改的数据,备份时间短、占用空间小但恢复过程复杂。
Q2: 差异备份和增量备份的主要区别是什么?
A2: 差异备份只备份自上次全量备份以来更改的数据,恢复时只需要基础全量备份 + 最后一个差异备份;增量备份备份自上次备份(可以是全量或增量)以来更改的数据,恢复时需要基础全量备份 + 所有后续增量备份。
Q3: 逻辑备份和物理备份的主要区别是什么?
A3: 物理备份备份数据库的物理文件,恢复速度快但不支持跨版本恢复;逻辑备份备份数据库对象的逻辑定义和数据,支持跨版本恢复但恢复速度慢。
Q4: 如何选择合适的备份类型?
A4: 选择备份类型需要考虑数据库规模、备份窗口、恢复时间目标、恢复点目标、存储空间和系统资源等因素。建议采用混合备份策略,结合全量备份、增量/差异备份和 WAL 归档。
Q5: 备份频率应该如何设置?
A5: 备份频率应该根据业务需求和数据变更频率来设置。一般来说,全量备份可以每周执行一次,增量/差异备份可以每天执行一次,WAL 归档应该持续启用。对于数据变更频繁的系统,可以适当增加备份频率。
