备份做得再勤,如果不会清理,迟早有一天磁盘会被撑爆。Barman作为PostgreSQL生态中广泛使用的备份管理工具,本身自带一套完善的保留策略机制,能够根据管理员定义的规则自动判断哪些备份可以删除,哪些必须保留。这篇文章就来系统讲解Barman保留策略的配置思路和实操细节。

一、保留策略的核心参数:retention_policy
Barman的保留策略由配置文件(通常位于/etc/barman.conf或各服务器独立的配置段)中的retention_policy参数控制。这个参数定义了“我们希望保留多久的备份”,其基本语法是:
# 按时间保留:保留最近30天的备份 retention_policy = RECOVERY WINDOW OF 30 DAYS # 按数量保留:保留最近5个基础备份 retention_policy = REDUNDANCY 5
两种模式各有适用场景。RECOVERY WINDOW按时间窗口计算,凡是结束时间落在窗口之外的备份,都会被标记为可删除,这种方式适合有明确RPO和合规要求的业务,比如金融类系统常要求保留90天的可恢复点。REDUNDANCY则按备份个数计算,实现简单直观,适合数据变化快、备份频繁但整体留存要求不高的场景。
需要特别注意的是,retention_policy只是“标记”策略,它本身不会主动删除任何文件。被策略判定为过期的备份,只有在显式执行barman delete命令时才会真正清理,或者配合barman cron与定期任务实现半自动删除。这种设计是刻意的:宁可多占一点空间,也不能因为策略误判而丢掉还需要的备份。
二、minimum_redundancy:防止误删的安全阀
仅有retention_policy是不够的。假设策略是REDUNDANCY 1,而某天新备份刚完成、旧备份被标记过期,此时如果误删或新备份本身有问题,就可能陷入没有任何有效备份的窘境。为此Barman提供了minimum_redundancy参数作为安全底线:
# 无论策略如何判定,至少保留2份基础备份 minimum_redundancy = 2
它的含义是:即使保留策略判定某些备份已过期,只要当前有效备份数量不超过minimum_redundancy设定的值,这些备份就不会被标记为obsolete,从而避免被删除。换句话说,这是策略之下的兜底规则,优先级高于retention_policy的判定结果。
一个常见的推荐组合是:retention_policy = RECOVERY WINDOW OF 7 DAYS搭配minimum_redundancy = 2。这样在常规情况下保留一周的可恢复窗口,而如果因为某种原因一周内的备份不足两份,系统也不会把仅存的备份清掉。运维实践中,minimum_redundancy的值至少设为1,生产环境建议设为2或以上。
三、WAL归档的保留与备份策略的联动
Barman不仅管理基础备份,还负责WAL归档文件的留存。这里的关键参数是wal_retention_policy,默认值为main,表示WAL的保留跟随主保留策略:只有当一个WAL段不再被任何“需要保留”的备份所依赖时,它才会被标记为可清理。
# WAL保留与备份策略保持一致(默认行为) wal_retention_policy = main
理解这个联动关系很重要。PostgreSQL的恢复依赖“基础备份+WAL连续序列”,如果只保留备份却把中间的WAL删了,恢复就会在中途失败。Barman会自动计算每个保留备份所需的WAL范围(从备份开始到下一个保留备份开始之间的所有WAL),确保删除决策不会破坏可恢复性。执行barman check时输出的各项状态,就包含这类一致性校验。
如果磁盘上的WAL占用增长过快,可以关注压缩选项和归档频率的配置,而不是贸然改小wal_retention_policy。手动缩短WAL保留可能造成“备份还在但WAL断了”的隐患,得不偿失。
四、查看与执行:让策略真正落地
配置完成后,可以用barman list-backup查看备份列表,被保留策略判定为过期的备份会显示为EXPIRED状态:
# 查看某台服务器的备份列表 barman list-backup pg_main # 输出示例: # pg_main 20240610T030000 - Wed Jun 10 03:00:00 2024 - Size: 12.0 GiB # pg_main 20240601T030000 - Wed Jun 1 03:00:00 2024 - EXPIRED
确认无误后,执行删除操作真正释放空间:
# 删除最老的一个过期备份 barman delete pg_main oldest # 或者删除指定ID的备份 barman delete pg_main 20240601T030000
如果想实现全自动清理,可以把barman cron加入系统定时任务,并配合barman delete的批量模式使用。此外还有barman keep这个反向操作——给关键备份打上“永久保留”标记,即使策略判定过期也不清理,非常适合月底归档或重大变更前的快照留存:
# 给某个重要备份设置永久保留标记 barman keep pg_main 20240610T030000 # 取消保留标记 barman keep --release pg_main 20240610T030000
这套组合的典型用法是:日常备份按7天或30天窗口自动滚动,每逢月底或重大变更前手动执行一次备份并用barman keep锁定,满足长期归档需求的同时控制日常空间占用。定期跑一次barman check pg_main确认策略、磁盘和WAL状态正常,就能让备份体系长期稳定运行。
Barman备份保留策略PostgreSQL备份retention_policy修改时间:2026-09-15 03:00:42