DB2异机恢复实战:NetBackup配置与rollforward避坑指南 简介这份文档面向使用 NetBackup 实现 DB2 数据库异机恢复的运维与 DBA 人员聚焦备份配置与恢复流程中的关键环节适合具备一定 DB2 与 NBU 基础的中高级技术人员参考。资源包内共 1 个 doc 文件压缩包约 314KB内容围绕 DB2 Agent 配置、数据库参数调整、备份脚本与策略文件展开便于按模块查阅。文档系统梳理了 db2_config 运行、db2uext2 用户出口程序复制、userexit 与 logretain 等参数设置以及 db2_backup 脚本中 DB2_CLIENT、DB2_POLICY、DB2_FULL 等变量含义并给出 db2.conf 中 DATABASE、OBJECTTYPE、POLICY、SCHEDULE 及归档日志 ARCFUNC、RETDIR 的配置示例帮助读者理解异机恢复所需的备份链路与策略组织方式。目前已有 335 人学习可作为搭建 DB2 异机恢复环境、排查备份策略配置问题的实操参考。1. 异机恢复这件事真正卡人的从来不是 restore 命令生产库所在的那台机器突然起不来或者机房要整体搬迁你手上只有 NetBackup 里一份 DB2 的在线备份目标机器上连实例都还没建。这种场景下db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.sl这条命令本身并不难敲难的是让它在新机器上真的能跑通——源客户端名对不上、db2.conf里少一行CLIENT_NAME、归档日志路径没配、rollforward 卡在某个 LSN 上任何一处都能让你在凌晨三点对着报错发呆。DB2 异机恢复要解决的核心问题就是把一份属于 A 机器的备份完整、可回放地落到 B 机器上并且让数据库能正常打开。它适合两类人一是负责数据库容灾演练、机房迁移的 DBA二是需要在测试环境复刻生产数据的运维。下面按我实际拆过的顺序从 Agent 配置一路讲到 rollforward 的边界处理。2. 异机恢复的前置条件Agent 配置与数据库参数怎么改异机恢复不是拿到备份文件就能干的事源端备份时的配置决定了目标端能不能恢复。这一章先把源端该开的开关、该配的出口程序讲清楚再落到目标端的准备动作。2.1 db2_config 与 db2uext2 出口程序DB2 的 Agent 装完之后第一件事是运行db2_config。这个脚本干的事情很具体把 NetBackup 提供的用户出口程序db2uext2复制到 DB2 实例的sqllib/adm目录下。没有这个出口程序DB2 在归档日志时不会调用 NetBackup日志就落不到备份服务器上异机恢复时你只能恢复到全备时间点之后的增量日志全部丢失。# 以 root 或具备权限的用户执行脚本会交互式询问 DB2 实例信息 /usr/openv/netbackup/bin/db2_config # 执行完成后确认出口程序已就位 ls -l db2instance/sqllib/adm/db2uext2这里db2instance要替换成实际的实例家目录比如/db2inst1。脚本执行时会让你输入实例名和安装路径输错了出口程序就放错地方后面归档日志会静默失败——这是最常见的翻车点之一。确认db2uext2存在且权限正确后再往下走。2.2 三个必须打开的数据库参数源端数据库要支持在线备份和增量备份三个参数必须改。默认情况下 DB2 用的是循环日志模式日志写满就覆盖根本没法做前滚恢复。# 启用用户出口程序让 DB2 通过 db2uext2 归档日志 db2 update db cfg for sample using userexit on # 启用日志保留日志不再被循环覆盖 db2 update db cfg for sample using logretain on # 启用增量备份跟踪 db2 update db cfg for sample using trackmod yesuserexit和logretain两个参数一起打开数据库才从循环日志模式切到归档日志模式。trackmod打开之后才能做增量备份但注意改完trackmod必须做一次全备份否则数据库连不上。这是 DB2 的硬性要求不是建议。改参数时还有一个前提——所有应用必须断开连接否则参数修改不会生效你会看到命令返回成功但实际值没变。# 确认参数已生效 db2 get db cfg for sample | grep -i -E userexit|logretain|trackmod # 断开所有连接后执行一次全备份 db2 backup database sample to /tmp提示trackmod改完不做全备后续任何连接尝试都会报 SQL1117N 之类的错误别问我是怎么知道的。2.3 目标端的准备工作目标机器上需要装好同版本的 DB2 和 NetBackup 客户端实例名可以和源端不同但数据库名要一致或者用to参数重定向。最关键的一步在 Master Server 上默认情况下 NetBackup 不允许异机恢复必须创建一个空文件来放开限制。# 在 Master Server 上以 root 执行 touch /usr/openv/netbackup/db/altnames/No.Restrictions这个文件是空的就行它的存在本身就是许可。没有它恢复请求会被直接拒绝报错信息往往指向权限或客户端不匹配容易把人带偏。目标端还要确保db2.conf文件存在且配置正确这个文件是恢复时 NetBackup 读取策略信息的入口。3. db2.conf 与备份脚本异机恢复的配置核心异机恢复能不能成八成看db2.conf写得对不对。这个文件告诉 NetBackup 去哪个策略、哪个 Schedule 找备份异机场景下还要额外指定源客户端名。3.1 db2.conf 的异机关键行db2.conf分两段一段管数据库备份一段管归档日志备份。异机恢复和本机恢复的区别就在CLIENT_NAME这一行——不写它NetBackup 会去当前机器的客户端名下面找备份当然找不到。# 数据库备份段 DATABASE BI OBJECTTYPE DATABASE POLICY DB2_Backup SCHEDULE Default-Application-Backup CLIENT_NAME gdccas670 ENDOPER # 归档日志备份段 DATABASE BI OBJECTTYPE ARCHIVE POLICY User_Backup SCHEDULE UserBackup CLIENT_NAME gdccas670 ARCFUNC SAVE ENDOPERDATABASE指定要恢复的数据库名POLICY和SCHEDULE必须和源端备份时用的策略、计划完全一致大小写敏感。CLIENT_NAME填源端客户端名这是异机恢复的命门。ARCFUNC SAVE表示归档日志通过 NetBackup 保存如果源端用的是COPY模式落到本地磁盘这里要相应改成COPY并配ARCDIR和RETDIR。两段的CLIENT_NAME都要写只写一段是另一个高频坑。3.2 备份脚本里的变量与调度逻辑Agent 安装后会自动生成db2_backup脚本这个脚本在备份时由 NetBackup 调用恢复时一般不需要改它但理解它的逻辑有助于排查问题。脚本通过环境变量判断备份类型#!/bin/sh # NetBackup 注入的环境变量 echo DB2_CLIENT $DB2_CLIENT echo DB2_POLICY $DB2_POLICY echo DB2_FULL $DB2_FULL # 全备时为 1 echo DB2_CINC $DB2_CINC # 累积增量时为 1 echo DB2_INCR $DB2_INCR # 差异增量时为 1 # 根据调度类型决定备份模式 if [ $DB2_FULL 1 ] ; then MY_SCHED elif [ $DB2_CINC 1 ] ; then MY_SCHEDINCREMENTAL elif [ $DB2_INCR 1 ] ; then MY_SCHEDINCREMENTAL DELTA else MY_SCHED fi # 指定 NetBackup 的 DB2 库文件Linux 32 位是 nbdb2.so MY_LIB/usr/openv/netbackup/bin/nbdb2.so MY_DB2BI MY_USERdb2inst1 CMD_LINEdb2 BACKUP DATABASE $MY_DB2 ONLINE $MY_SCHED LOAD $MY_LIB su - $MY_USER -c $CMD_LINE exit $?MY_LIB要按平台选Linux 32 位用nbdb2.so64 位用nbdb2.so64AIX 用nbdb2.sl或nbdb2.sl64。选错了备份直接失败。MY_USER是执行备份的 DB2 用户权限不够也会失败。脚本里可以放多条CMD_LINE给不同数据库用但每条都要单独指定库文件和数据库名。3.3 备份策略的创建要点在 NetBackup 管理控制台里建策略时几个参数直接决定异机恢复能否成功。策略类型必须选DB2存储单元和卷池按实际环境选。客户端名要填源端主机名——异机恢复时目标端不在这个策略的客户端列表里靠的是No.Restrictions和db2.conf里的CLIENT_NAME来放行。Backup Selections 里填db2_backup脚本的完整路径。Schedule 类型按需选全备用Automatic Full Backup差异增量用Automatic Differential Incremental Backup累积增量用Automatic Cumulative Incremental Backup。如果是在线备份还要额外建一个 Standard 类型的策略配 User Backup 的 Schedule 来管归档日志。4. 异机恢复实操restore 与 rollforward 的完整命令链配置都对了恢复本身反而是最顺的一段。但离线备份和在线备份的恢复命令不一样恢复到最新和恢复到指定时间点也不一样下面分开说。4.1 离线备份的异机恢复离线备份恢复不需要 rollforward但 restore 命令里必须带without rolling forward否则 DB2 会等你前滚数据库打不开。su - db2inst1 # 恢复到最新备份 db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.so without rolling forward without prompting # 如果目标端数据库不存在加 to 参数指定新路径 db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.so to /db_dir without rolling forward without promptingload后面跟的是 NetBackup 的 DB2 库文件路径和备份脚本里的MY_LIB保持一致。without prompting避免交互式确认卡住自动化脚本。to /db_dir用于目标端没有同名数据库、需要重定向到新目录的场景。4.2 在线备份恢复到最新在线备份恢复后必须 rollforward否则数据库处于前滚暂挂状态连不上。su - db2inst1 # 恢复 db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.so # 如果数据库不存在加 to 参数 db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.so to /db_dir # 前滚到日志末尾并完成 db2 rollforward db bi to end of logs and completeto end of logs and complete表示把归档日志和在线日志全部回放完然后结束前滚。这一步会去 NetBackup 拉归档日志所以db2.conf里归档日志段的CLIENT_NAME必须正确否则日志拉不下来rollforward 会卡住或报错。4.3 恢复到指定时间点误删数据之后想恢复到删除之前的那一刻需要先找到备份的精确时间戳。# 列出可用的备份镜像 bplist -C gdccas670 -t 18 -R / # 输出示例找到目标时间点 # /DB2/BI/node0000/20050226120711/BI.0.dwccbxm.node0000.642.20050226120711.4 # /DB2/BI/node0000/20050226120711/BI.0.dwccbxm.node0000.642.20050226120711.3-C指定源客户端名-t 18是 DB2 备份的类型码-R /递归列出。输出里的20050226120711就是备份时间戳。拿到时间戳后su - db2inst1 # 恢复到指定备份版本 db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.so taken at 20050226120711 # 前滚到指定时间点 db2 rollforward db bi to 2005-02-26-12:07:11 using local time and completetaken at后面跟 bplist 查到的时间戳。rollforward的to后面跟目标时间点格式是YYYY-MM-DD-HH.MM.SS。有些 DB2 版本没有using local time选项如果操作系统时间和标准时间有偏差指定的时间要减去这个差值否则会前滚过头或不够。5. 避坑与排查异机恢复最常见的五类翻车异机恢复的报错往往不直接指向根因下面这几条是我踩过或见别人踩过的按「现象 → 原因 → 解决」整理。现象restore 报找不到备份镜像但 bplist 明明能列出。原因db2.conf里没写CLIENT_NAME或者只写了数据库段没写归档日志段NetBackup 去当前机器名下找备份自然找不到。 解决两段都补上CLIENT_NAME值填源端客户端名和bplist -C后面的一致。现象rollforward 卡住不动或者报无法获取归档日志。原因归档日志段的POLICY或SCHEDULE和源端不一致或者ARCFUNC写成了COPY但源端实际是SAVE。 解决核对源端备份策略的实际配置ARCFUNC和源端保持一致POLICY、SCHEDULE大小写完全匹配。现象restore 成功但数据库连不上报前滚暂挂。原因在线备份恢复后没执行 rollforward或者离线备份恢复时漏了without rolling forward。 解决在线备份补db2 rollforward db bi to end of logs and complete离线备份在 restore 命令里加without rolling forward。现象异机恢复请求被直接拒绝报权限或客户端不匹配。原因Master Server 上没有创建No.Restrictions文件。 解决在 Master Server 上touch /usr/openv/netbackup/db/altnames/No.Restrictions文件为空即可。现象改完trackmod后数据库连不上。原因trackmod打开后没做全备份DB2 要求必须有一次全备才能正常连接。 解决立即执行一次全备份db2 backup database sample to /tmp之后连接恢复正常。6. 验证恢复结果与几个压箱底的技巧恢复完成不等于万事大吉得验证数据真的可用。我一般会走一遍固定动作先db2 connect to bi确认能连上再跑db2 list tablespaces show detail看表空间状态是否正常然后抽查几张核心表的行数和最近几条记录的时间戳确认数据回放到了预期的时间点。如果是从生产异机恢复到测试环境还要检查 schema 权限和序列值这些在恢复后偶尔会出问题。# 连接并检查基本状态 db2 connect to bi db2 list tablespaces show detail db2 select count(*) from 核心表名 # 确认数据库不是前滚暂挂状态 db2 get db cfg for bi | grep -i rollforward一个容易被忽略的技巧如果目标端实例名和源端不同恢复后数据库的实例归属会跟着变但db2.conf里的DATABASE名不用改因为恢复是按数据库名走的。另一个技巧是bplist查时间戳时如果输出很多可以用grep过滤数据库名快速定位目标版本。还有异机恢复演练最好定期做一次别等到真出事才第一次跑——我见过太多环境平时备份正常真恢复时才发现db2uext2根本没配好归档日志一段都没备上去。从那以后我每次做异机恢复都强制先跑一遍bplist -C 源客户端 -t 18 -R /确认备份镜像真的在再动 restore 命令。希望帮到你。本文还有配套的精品资源点击获取