PgBackRest备份空间远超生产数据库的优化方案咨询
问题描述
我使用PgBackRest备份PostgreSQL数据库,策略为每周一次全量备份、连续五天增量备份,备份存储在独立于生产服务器的专用备份服务器中。目前发现备份文件占用空间已超过生产数据库的两倍,其中备份服务器上的Archive文件夹体积过大,Backup文件夹体积也超出合理范围,寻求解决方法。
生产数据库磁盘信息

备份服务器磁盘信息

备份归档与备份文件夹大小信息

生产服务器PgBackRest配置
[global] log-level-file=info repo1-host=(备份服务器主机名) archive-async = y process-max = 2 spool-path = /var/spool/pgbackrest [global:archive-get] process-max=8 [global:archive-push] process-max=8 [my_stanza] pg1-path=/集群路径 pg1-port=集群端口
备份服务器PgBackRest配置
[global] repo1-path=/备份路径 repo1-retention-full=1 process-max=8 start-fast=y log-level-console=info log-level-file=info [my_stanza] pg1-host=(生产服务器主机名) pg1-path=/集群路径 pg1-port=集群端口
pgbackrest info 输出
db (当前) wal归档最小/最大 (13): 000000010000018700000057/0000000100000222000000C0 全量备份: 20240512-090003F 时间戳开始/结束: 2024-05-12 09:00:03+03 / 2024-05-12 10:13:21+03 wal开始/结束: 000000010000018700000057 / 000000010000018700000057 数据库大小: 586.8GB, 数据库备份大小: 586.8GB repo1: 备份集大小: 560.8GB, 备份大小: 560.8GB 增量备份: 20240512-090003F_20240513-000005I 时间戳开始/结束: 2024-05-13 00:00:05+03 / 2024-05-13 00:14:44+03 wal开始/结束: 000000010000018B000000AC / 000000010000018B000000AC 数据库大小: 595.5GB, 数据库备份大小: 98GB repo1: 备份集大小: 569GB, 备份大小: 91.6GB 备份参考列表: 20240512-090003F 增量备份: 20240512-090003F_20240514-000005I 时间戳开始/结束: 2024-05-14 00:00:05+03 / 2024-05-14 00:26:27+03 wal开始/结束: 00000001000001AE0000008E / 00000001000001AE00000096 数据库大小: 652.3GB, 数据库备份大小: 191GB repo1: 备份集大小: 623GB, 备份大小: 181GB 备份参考列表: 20240512-090003F, 20240512-090003F_20240513-000005I 增量备份: 20240512-090003F_20240515-000006I 时间戳开始/结束: 2024-05-15 00:00:06+03 / 2024-05-15 00:29:44+03 wal开始/结束: 00000001000001CD000000E5 / 00000001000001CE0000001D 数据库大小: 704GB, 数据库备份大小: 200.2GB repo1: 备份集大小: 673.2GB, 备份大小: 189.3GB 备份参考列表: 20240512-090003F, 20240512-090003F_20240513-000005I, 20240512-090003F_20240514-000005I 增量备份: 20240512-090003F_20240516-000005I 时间戳开始/结束: 2024-05-16 00:00:05+03 / 2024-05-16 00:44:23+03 wal开始/结束: 00000001000001F800000051 / 00000001000001F80000006E 数据库大小: 773GB, 数据库备份大小: 292.8GB repo1: 备份集大小: 738.2GB, 备份大小: 277.5GB 备份参考列表: 20240512-090003F, 20240512-090003F_20240513-000005I, 20240512-090003F_20240514-000005I, 20240512-090003F_20240515-000006I 增量备份: 20240512-090003F_20240517-000003I 时间戳开始/结束: 2024-05-17 00:00:03+03 / 2024-05-17 00:33:44+03 wal开始/结束: 000000010000020A00000008 / 000000010000020A000000A7 数据库大小: 794.7GB, 数据库备份大小: 226.9GB repo1: 备份集大小: 759.0GB, 备份大小: 213.3GB 备份参考列表: 20240512-090003F, 20240512-090003F_20240513-000005I, 20240512-090003F_20240514-000005I, 20240512-090003F_20240515-000006I, 20240512-090003F_20240516-000005I
解决方法
一、清理冗余WAL归档文件
从pgbackrest info输出可以看到,当前仅保留了1个全量备份,但WAL归档文件未自动清理,这是Archive文件夹膨胀的核心原因。
- 添加归档保留规则
在备份服务器的pgbackrest.conf的[global]段中加入以下配置:
repo1-retention-archive=1 repo1-retention-archive-type=full
repo1-retention-archive=1:仅保留最近1个全量备份对应的WAL归档repo1-retention-archive-type=full:基于全量备份数量而非时间来保留归档
- 手动执行归档清理
运行命令立即清理超出保留规则的冗余归档:
pgbackrest archive-purge --stanza=my_stanza
二、优化增量备份保留策略
当前全量备份是5月12日的,后续所有增量都依赖它,若未按时生成新的全量备份,旧增量会持续堆积。
- 确认全量备份任务状态
检查每周全量备份的定时任务是否正常执行,若5月12日后未生成新全量,需排查任务触发机制或手动生成一次全量备份:
pgbackrest backup --stanza=my_stanza --type=full
- 配置增量备份保留规则
在备份服务器的pgbackrest.conf的[global]段添加:
repo1-retention-incr=5
新全量备份生成后,会自动清理超过5天的旧增量备份。
三、提升备份压缩率
当前全量备份压缩率不足5%,可通过调整压缩参数减少备份体积:
在备份服务器的[global]段添加:
compress-type=zstd compress-level=6
zstd比gzip压缩效率更高、速度更快,优先推荐compress-level取值1-9,级别越高压缩率越高,备份耗时会略有增加
四、紧急释放空间(手动清理旧备份)
若当前磁盘空间不足,可手动删除最早的增量备份(注意:不要删除全量备份,所有增量都依赖它):
pgbackrest delete --stanza=my_stanza --backup=20240512-090003F_20240513-000005I
更推荐使用自动清理命令,避免误删:
pgbackrest expire --stanza=my_stanza
五、排查异步归档堆积
生产服务器启用了异步归档archive-async=y,需检查是否有未推送的WAL堆积在本地:
ls -lh /var/spool/pgbackrest/my_stanza/archive/
若存在堆积,可:
- 增大
archive-push的process-max(当前为8,可尝试调至16) - 检查生产与备份服务器之间的网络带宽是否满足需求
- 手动推送堆积的WAL:
pgbackrest archive-push --stanza=my_stanza --spool
内容的提问来源于stack exchange,提问作者Abdullah Ergin
相关产品推荐
相关产品推荐

