Bacula删除废弃客户端后备份报错 提示找不到旧作业资源如何排查
问题背景
- 运维接手已完成搭建部署的Bacula 9.4.2生产运行环境
- 一台纳入长期备份范围的服务器server2发生故障无修复价值,按要求从Bacula客户端列表移除后,每日凌晨固定触发备份作业失败
- 已全量排查所有作业配置文件,未找到任何关联server2的配置条目,无法定位报错触发点
故障触发时的日志如下:
15-Jun 01:00 bacula-dir JobId 56332: Copying using JobId=55657 Job=server2-fd.2022-05-31_18.00.01_46 15-Jun 01:00 bacula-dir JobId 56332: Fatal error: Previous Job resource not found for "server2-fd". 15-Jun 01:00 bacula-dir JobId 56332: Error: Bacula bacula-dir 9.4.2 (04Feb19): Build OS: x86_64-pc-linux-gnu redhat Enterprise release Prev Backup JobId: 55657 Prev Backup Job: server2-fd.2022-05-31_18.00.01_46 New Backup JobId: 0 Current JobId: 56332 Current Job: CopyDiskToTape.2022-06-15_01.00.01_17 Backup Level: Incremental
故障根因
报错不是因为配置文件残留了server2的客户端或备份作业配置,是漏排查了副本(Copy)/迁移(Migrate)类作业的选择逻辑。
从日志可以看到失败的是CopyDiskToTape磁盘转磁带的副本作业,这类作业默认会扫描备份目录库中所有符合留存规则的备份记录,只要历史备份元数据还存在于Bacula数据库中,就会被纳入待复制队列——哪怕对应客户端的Job资源已经被删除。
副本作业执行增量复制前会校验待复制备份对应的原始Job资源是否存在,找不到server2-fd的Job定义就会直接抛出致命错误中断作业。
修复操作
按以下顺序操作即可消除报错:
- 连接bconsole控制台,清理关联已下线server2的历史作业元数据
如果server2的历史备份已经没有留存必要,直接执行purge命令清除数据库中关联记录即可:*purge jobs job=server2-fd注意:执行purge操作会同步清除对应备份记录在Bacula目录库中的元数据,清除后将无法通过Bacula恢复对应备份,操作前务必确认历史数据已无留存需求。
如果还需要留存server2的历史备份做归档,不要purge记录,只需要在配置中保留一个禁用状态的server2-fd Job资源占位,等所有关联备份过了留存周期再删除即可,不会触发资源找不到的报错。 - 调整副本作业的选择规则
编辑bacula-dir配置中CopyDiskToTape作业的定义,不要使用无差别的全量备份选择规则,通过Selection或Job参数明确指定需要复制的作业范围,避免后续副本作业扫描到已下线客户端的孤立备份记录。 - 验证修复效果
配置修改完成后在bconsole执行重载,手动触发一次副本作业验证:
作业运行无报错即修复完成。*reload *run job=CopyDiskToTape yes
内容的提问来源于stack exchange,提问作者Xyz
相关产品推荐
相关产品推荐

