简介:这份文档面向使用 NetBackup 实现 DB2 数据库异机恢复的运维与 DBA 人员,聚焦备份配置与恢复流程中的关键环节,适合具备一定 DB2 与 NBU 基础、需要搭建或排查异机恢复环境的技术人员参考。资源包内共 1 个 doc 文件,压缩包约 314KB,内容以配置说明与脚本示例为主,便于直接对照操作。文档围绕 DB2 Agent 配置、db2_config 运行与 db2uext2 用户出口程序部署展开,并给出 userexit、logretain、trackmod 等参数设置方法,使数据库进入归档日志与增量备份模式。同时涵盖 db2_backup 备份脚本中 DB2_CLIENT、DB2_SERVER、DB2_POLICY、DB2_SCHED 等变量含义,以及 db2.conf 中 DATABASE、OBJECTTYPE、POLICY、SCHEDULE、ARCFUNC、RETDIR 等策略配置写法,帮助读者理清异机恢复所需的备份策略与归档日志管理思路。目前已有 335 人学习下载,适合需要快速掌握 DB2 异机恢复配置要点的读者参考。
1. DB2 异机恢复环境搭建:从 Agent 配置到归档日志模式的一次性踩坑记录
DB2 异机恢复这件事,听起来像是 DBA 的活,但真正落地的时候,卡住你的往往不是 restore 命令本身,而是 NetBackup Agent 装完之后那一堆参数没配对。我见过太多人拿到一份备份,在目标机上敲完db2 restore直接报 SQL2071N,或者恢复出来只有表结构没有数据,最后发现是db2.conf里少写了一行CLIENT_NAME。这套环境的核心组件就三个:DB2 实例、NetBackup Agent、以及连接两者的用户出口程序db2uext2。装不好,备份文件就在磁带里躺着,你连读都读不出来。这篇笔记适合正在做 DB2 异机恢复、或者准备把生产库备份恢复到测试环境的运维和 DBA,我会把从 Agent 配置到最终验证的完整路径拆开,每一步都给出可抄的命令和参数说明。
2. 安装前必须锁死的环境参数:DB2 实例与 NBU Agent 版本对齐
2.1 确认 DB2 实例状态与归档日志模式
在碰 NetBackup 之前,先把 DB2 这边的底子摸清楚。异机恢复能不能成,第一道门槛就是源库是不是归档日志模式。如果源库还在循环日志模式,你拿到的备份只能恢复到备份完成那个时间点,后面的日志全丢,异机恢复基本没意义。
登录到 DB2 实例用户下,先看当前数据库的配置:
su - db2inst1 db2 get db cfg for sample | grep -i "log retain\|user exit\|track mod"输出里重点看三个参数:Log retain for recovery status、User exit for logging status、Track modified pages。如果Log retain是No,说明数据库还在循环日志模式,这时候做在线备份,恢复时只能恢复到备份结束点,没法做 rollforward。我一般会先把这三个参数改掉:
db2 update db cfg for sample using logretain on db2 update db cfg for sample using userexit on db2 update db cfg for sample using trackmod yes这三条命令执行完,数据库会进入归档日志模式。注意,userexit on是让 DB2 调用 NetBackup 提供的db2uext2程序来归档日志,trackmod yes是开启增量备份跟踪。改完参数后,数据库会处于 backup pending 状态,必须做一次全备份才能继续连接:
db2 backup database sample to /tmp这个全备份路径可以自己指定,但一定要做,否则应用连不上库。常见做法是改完参数立刻做一次全备,然后再继续后面的 Agent 配置。
2.2 运行 db2_config 完成 Agent 与 DB2 的对接
NetBackup Agent 装完之后,不会自动把db2uext2放到 DB2 的目录里。需要手动跑一次配置脚本:
/usr/openv/netbackup/bin/db2_config这个脚本做的事情很简单:把 NBU 提供的用户出口程序db2uext2复制到<db2instance>/sqllib/adm目录下。比如实例是db2inst1,那目标路径就是/home/db2inst1/sqllib/adm/db2uext2。跑完之后可以验证一下:
ls -l /home/db2inst1/sqllib/adm/db2uext2如果文件存在且权限是db2inst1可执行,说明 Agent 对接完成。这一步经常被跳过,结果就是 DB2 归档日志时找不到出口程序,日志归档失败,异机恢复时日志链断裂。
2.3 配置 db2.conf 文件:异机恢复的关键在 CLIENT_NAME
db2.conf是 NetBackup for DB2 的核心配置文件,位置在/usr/openv/netbackup/db2.conf。这个文件分两段:一段管数据库备份,一段管归档日志备份。异机恢复和本机恢复最大的区别,就是要在两段里都加上CLIENT_NAME,指向源客户端的主机名。
# 数据库备份段 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 ENDOPER这里DATABASE BI指定要恢复的数据库名,POLICY和SCHEDULE必须和源端备份策略完全一致,否则 NBU 找不到对应的备份镜像。CLIENT_NAME是异机恢复的开关,不写这行,NBU 会默认去当前主机名下面找备份,找不到就报错。ARCFUNC SAVE表示归档日志通过 NetBackup 保存到存储单元,如果是COPY模式,日志会落到本地磁盘目录,需要配合ARCDIR和RETDIR使用。
提示:
db2.conf修改后不需要重启 NBU 服务,但需要确保 DB2 实例用户对文件有读权限。
2.4 在 Master Server 上打开异机恢复权限
默认情况下,NetBackup 不允许异机恢复。需要在 Master Server 上用 root 权限创建一个空文件:
touch /usr/openv/netbackup/db/altnames/No.Restrictions这个文件的作用是解除恢复目标主机的限制。如果不创建,恢复时会报cannot connect to client或者restore not allowed。创建完之后不需要重启服务,NBU 会实时读取这个目录下的配置。
3. 异机恢复实操:从 bplist 定位备份镜像到 rollforward 收尾
3.1 用 bplist 找到可恢复的备份时间点
异机恢复的第一步不是敲 restore,而是先确认目标机上能看到源端的备份镜像。用bplist命令列出指定客户端的 DB2 备份:
bplist -C gdccas670 -t 18 -R /参数说明:-C指定源客户端名,-t 18是 DB2 备份的类型代码,-R /表示递归列出根目录下所有备份。输出会类似这样:
/DB2/BI/node0000/20050226120711/BI.0.dwccbxm.node0000.642.20050226120711.4 /DB2/BI/node0000/20050226120711/BI.0.dwccbxm.node0000.642.20050226120711.3 /DB2/BI/node0000/20050226120711/BI.0.dwccbxm.node0000.642.20050226120711.2 /DB2/BI/node0000/20050226120711/BI.0.dwccbxm.node0000.642.20050226120711.1路径里的20050226120711就是备份的精确时间点。如果只想恢复到某个特定版本,记下这个时间戳,restore 时用taken at指定。
3.2 OFFLINE 备份的异机恢复命令
如果源端做的是离线备份,恢复时不需要 rollforward,但必须在 restore 命令里加without rolling forward:
su - db2inst1 db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.sl without rolling forward without prompting如果目标机上数据库不存在,需要加to参数指定恢复路径:
db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.sl to /db_dir without rolling forward without promptingload后面跟的是 NBU 的 DB2 库文件路径,Linux 32 位是nbdb2.so,64 位是nbdb2.so64,AIX 和 HPUX 对应.sl和.sl64。这个库文件是 NBU 提供的 Vendor I/O Library,restore 命令通过它从 NBU 存储里读备份数据。
如果要恢复到指定版本,加上taken at:
db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.sl taken at 20050226120711 without rolling forward without prompting3.3 ONLINE 备份的异机恢复与 rollforward
在线备份的恢复必须做 rollforward,否则数据库处于 rollforward pending 状态,无法连接。先执行 restore:
db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.sl如果数据库不存在,同样加to参数:
db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.sl to /db_dir然后执行 rollforward 到日志末尾:
db2 rollforward db bi to end of logs and complete如果要恢复到指定时间点,restore 时用taken at指定备份版本,rollforward 时用to指定时间:
db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.sl taken at 20050226120711 db2 rollforward db bi to 2005-02-26-12:07:11 using local time and complete注意,有些 DB2 版本没有using local time选项。如果操作系统时间和标准时间有差异,rollforward 指定的时间要减去这个差值。我一般会先用date命令确认系统时间,再决定要不要调整。
3.4 恢复后的连接验证与日志检查
rollforward 完成后,数据库应该处于正常状态。用db2 connect验证:
db2 connect to bi db2 "select count(*) from syscat.tables"如果能连上且能查系统表,说明恢复基本成功。然后检查归档日志状态:
db2 get db cfg for bi | grep -i "log retain\|user exit"确认Log retain和User exit都是Yes,否则后续日志归档会出问题。最后看一眼db2diag.log有没有报错:
tail -50 /home/db2inst1/sqllib/db2dump/db2diag.log重点看有没有SQL2071N或者db2uext2相关的错误。如果有,说明归档日志链路还有问题,需要回头检查db2.conf和db2uext2的权限。
4. 避坑与排查:DB2 异机恢复最常见的 5 个翻车点
4.1 恢复报 SQL2071N:找不到备份镜像
现象:执行db2 restore时直接报SQL2071N An error occurred while accessing the NetBackup vendor library。
原因:db2.conf里没有写CLIENT_NAME,或者写错了源客户端名。NBU 默认去当前主机名下面找备份,异机恢复时当前主机名和源客户端不一致,自然找不到。
解决:检查/usr/openv/netbackup/db2.conf里两段配置是否都加了CLIENT_NAME,值必须是源端备份时的客户端名。可以用bplist -C <源客户端名> -t 18 -R /确认源端备份可见。
4.2 恢复后数据库无法连接:rollforward 没做
现象:restore 成功,但db2 connect to bi报SQL1117N或者数据库处于 rollforward pending 状态。
原因:在线备份恢复后必须做 rollforward,离线备份恢复时如果没加without rolling forward,数据库也会处于 pending 状态。
解决:在线备份执行db2 rollforward db bi to end of logs and complete;离线备份在 restore 命令里加without rolling forward。
4.3 归档日志恢复失败:db2uext2 权限不对
现象:rollforward 时提示找不到归档日志,或者db2diag.log里报db2uext2执行失败。
原因:db2_config脚本没有以正确用户运行,导致db2uext2复制到sqllib/adm后权限不对,DB2 实例用户无法执行。
解决:用db2inst1用户重新运行/usr/openv/netbackup/bin/db2_config,然后检查ls -l /home/db2inst1/sqllib/adm/db2uext2,确保属主是db2inst1且有执行权限。
4.4 异机恢复被拒绝:No.Restrictions 文件没建
现象:restore 时报restore not allowed或者cannot connect to client。
原因:Master Server 上没有创建/usr/openv/netbackup/db/altnames/No.Restrictions文件,NBU 默认禁止异机恢复。
解决:在 Master Server 上用 root 执行touch /usr/openv/netbackup/db/altnames/No.Restrictions,不需要重启服务。
4.5 恢复到指定时间点失败:时间差没算对
现象:db2 rollforward db bi to 2005-02-26-12:07:11 using local time and complete报错,提示时间点无效。
原因:有些 DB2 版本不支持using local time,或者操作系统时间与标准时间有偏差,导致指定的时间点不在日志范围内。
解决:先确认 DB2 版本是否支持using local time,不支持就去掉这个选项。如果系统时间有偏差,rollforward 的时间要减去差值。我一般会先用bplist确认备份时间戳,再用db2 rollforward db bi query status看当前日志范围。
5. 装完怎么验证:异机恢复后的三项强制检查
恢复完成不代表万事大吉,我一般会强制走一遍下面三项检查,确认数据库真的可用。
第一项,连接与查询验证。用db2 connect to bi连上数据库,然后跑一条业务相关的查询,比如select count(*) from <业务表>。这一步能排除掉“数据库能连但表空间损坏”的情况。如果查询报SQL0290N或者表空间不可用,说明恢复过程中表空间路径有问题,需要检查to /db_dir指定的路径是否和源端一致。
第二项,归档日志状态检查。执行db2 get db cfg for bi | grep -i "log retain\|user exit\|track mod",确认三个参数都是开启状态。如果Log retain变成No,说明恢复过程中数据库配置被重置了,需要重新执行db2 update db cfg改回来。这一步经常被忽略,结果就是恢复完的库没法做增量备份,下次恢复又得从头来。
第三项,备份链路验证。在恢复后的数据库上做一次全备份,确认 NBU 能正常抓取:
db2 backup database bi online to /tmp如果备份成功,说明db2uext2和db2.conf配置都没问题。如果报错,回头检查db2.conf里的POLICY和SCHEDULE是否和当前 NBU 策略匹配。
下面这张表是我整理的环境参数对照,恢复前后都可以拿来核对:
| 检查项 | 恢复前要求 | 恢复后验证命令 |
|---|---|---|
| 归档日志模式 | Log retain = Yes | db2 get db cfg for bi | grep -i "log retain" |
| 用户出口程序 | User exit = Yes | db2 get db cfg for bi | grep -i "user exit" |
| 增量备份跟踪 | Track mod = Yes | db2 get db cfg for bi | grep -i "track mod" |
| db2uext2 权限 | db2inst1 可执行 | ls -l /home/db2inst1/sqllib/adm/db2uext2 |
| 异机恢复权限 | No.Restrictions 存在 | ls -l /usr/openv/netbackup/db/altnames/No.Restrictions |
| 备份镜像可见 | bplist 能列出 | bplist -C <源客户端> -t 18 -R / |
从那以后我每次做异机恢复,都会在 restore 之前先跑一遍bplist确认镜像可见,恢复完立刻做一次全备份验证链路。这个习惯帮我省掉了至少三次“恢复成功但备份失败”的返工。希望帮到你。
本文还有配套的精品资源,点击获取