news 2026/10/17 16:36:05

DB2异机恢复实战:NetBackup Agent配置与避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DB2异机恢复实战:NetBackup Agent配置与避坑指南

简介:这份文档面向DB2数据库管理员与备份运维人员,聚焦使用NetBackup实现DB2数据库的异机恢复场景,适合已具备一定DB2运维基础、需要掌握跨主机恢复流程的技术人员参考。资源包内共1个doc文件,压缩包约314KB,内容围绕DB2 Agent配置、数据库参数调整、备份脚本编写及db2.conf策略设定等核心环节展开,涵盖userexit、logretain、trackmod等关键参数的启用方法,以及db2_backup脚本中DB2_CLIENT、DB2_POLICY、DB2_FULL等变量的设置说明。文档还给出DATABASE、OBJECTTYPE、POLICY、SCHEDULE等策略配置示例,并涉及归档日志备份的ARCFUNC与RETDIR设定,帮助读者理清异机恢复所需的完整配置链路。目前已有335人学习,适合需要快速查阅DB2异机恢复配置要点、对照排查备份策略问题的运维人员收藏使用。

1. 异机恢复这件事,坑在恢复之前就埋好了

DB2 异机恢复,听起来像是“把备份拿过来 restore 一下”的事,但真正翻过车的人都知道,恢复命令本身反而是最简单的部分。我见过太多案例:备份策略跑了大半年,日志归档看着也正常,结果真到异机恢复那天,db2 restore一执行就报找不到映像、找不到日志、rollforward 卡在某个 LSN 上不动。问题从来不在恢复那一刻,而在备份配置阶段就埋下了。

这套环境的核心是 NetBackup(NBU)配合 DB2 Agent,通过db2uext2用户出口程序把 DB2 的备份和归档日志交给 NBU 管理。异机恢复能不能成,取决于三件事:源端的db2.conf有没有写CLIENT_NAME、Master Server 上有没有放开异机恢复限制、目标端的 DB2 实例和 NBU 客户端有没有配对。这三件事任何一件没做,恢复就是空谈。

这篇文章适合正在配 DB2 备份恢复的运维,也适合第一次做异机恢复演练的 DBA。下面从 Agent 配置一路写到恢复验证,每一步都给命令和参数说明,照着走能跑通。

2. 环境准备与 Agent 配置:db2_config 到底改了什么

2.1 版本与组件对照

在动手之前,先把环境对齐。DB2 异机恢复依赖 NBU 的 DB2 Agent,版本不匹配是第一个大坑。NBU 的 DB2 Agent 版本必须和 NBU Master Server、Media Server 的主版本一致,DB2 侧则要求 8.x 以上(原文涉及的db2uext2接口在 DB2 9.7 之后行为有变化,但基本流程不变)。

组件作用版本要求检查命令
NBU Master Server管理备份策略和映像目录与 Agent 主版本一致/usr/openv/netbackup/bin/version
NBU DB2 Agent提供db2uext2出口程序和nbdb2库与 Master 主版本一致ls /usr/openv/netbackup/bin/nbdb2.*
DB2 实例被备份的数据库8.x 及以上db2level
NBU 客户端目标机上的客户端软件与 Master 主版本一致bpps -x

我一般会在源端和目标端都跑一遍bpps -x,确认 NBU 进程正常。如果目标端连 NBU 客户端都没装,异机恢复根本无从谈起——恢复时db2 restore要调用nbdb2.sl,这个库是 NBU 客户端的一部分。

2.2 运行 db2_config 完成出口程序部署

Agent 安装完之后,第一件事是运行db2_config。这个脚本做的事很具体:把 NBU 提供的db2uext2用户出口程序复制到 DB2 实例的sqllib/adm目录下,同时生成备份脚本模板。

# 以 root 身份运行,脚本会交互式询问 DB2 实例信息 /usr/openv/netbackup/bin/db2_config # 执行过程中会提示输入 DB2 实例名和实例属主 # 完成后验证 db2uext2 是否就位 ls -l /home/db2inst1/sqllib/adm/db2uext2 # 期望输出类似: # -r-sr-xr-x 1 db2inst1 db2iadm1 123456 Jan 1 00:00 /home/db2inst1/sqllib/adm/db2uext2

这里有个细节:db2uext2需要 setuid 位。如果复制过去之后权限不对,DB2 在归档日志时会报“user exit program not found”或者“permission denied”。我遇到过因为 umask 设置导致 setuid 丢失的情况,chmod u+s补上就行。

db2_config还会在/usr/openv/netbackup/ext/db_ext/db2/下生成脚本模板,包括db2_backup和db2.conf的样例。这些模板不要直接改,复制到实例属主可访问的目录再编辑。

2.3 DB2 数据库参数配置

Agent 就位之后,接下来改 DB2 参数。原文列了三个关键参数,我逐个说清楚它们的作用和修改时机。

# 切换到 DB2 实例属主 su - db2inst1 # 启用用户出口程序,让 DB2 把归档日志交给 NBU 处理 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 yes

这三个参数改完之后,数据库会进入“备份暂挂”状态。什么意思?DB2 要求你必须做一次全备份,否则数据库不可连接。这是很多人第一次配的时候会慌的地方——改完参数发现连不上了,以为搞坏了。其实这是正常行为,做一次全备份就恢复。

# 做一次全备份,解除备份暂挂状态 db2 backup database sample to /tmp # 验证参数是否生效 db2 get db cfg for sample | grep -i -E "userexit|logretain|trackmod"

注意:修改这些参数必须在所有应用断开连接之后进行。如果有活动连接,db2 update db cfg会报 SQL1363N 或者直接挂起。我一般会先db2 force applications all,再改参数。

userexit on和logretain on配合使用,效果是归档日志模式加用户出口归档。如果只开logretain不开userexit,日志会堆在db2dump目录下,时间一长磁盘就满了。trackmod yes是增量备份的前提,不开这个参数,NBU 策略里配的增量备份调度会失败。

3. 备份脚本与 db2.conf:异机恢复的关键配置在这里

3.1 db2_backup 脚本拆解

db2_backup是 NBU 调度器调用的入口脚本,它接收 NBU 传入的环境变量,拼出db2 backup命令并执行。原文给的脚本模板里,有几个地方必须改。

#!/bin/sh # NBU 传入的环境变量,脚本直接引用 echo "DB2_CLIENT = $DB2_CLIENT" echo "DB2_SERVER = $DB2_SERVER" echo "DB2_POLICY = $DB2_POLICY" echo "DB2_SCHED = $DB2_SCHED" echo "DB2_FULL = $DB2_FULL" # 全备份时为 1 echo "DB2_CINC = $DB2_CINC" # 累积增量时为 1 echo "DB2_INCR = $DB2_INCR" # 差异增量时为 1 # 指定 NBU 的 DB2 库文件,Linux 32 位用 nbdb2.so,64 位用 nbdb2.so64 MY_LIB=/usr/openv/netbackup/bin/nbdb2.so64 # 指定要备份的数据库名 MY_DB2=DWDB # 根据 NBU 调度类型决定备份模式 if [ "$DB2_FULL" = "1" ] ; then MY_SCHED="" elif [ "$DB2_CINC" = "1" ] ; then MY_SCHED="INCREMENTAL" elif [ "$DB2_INCR" = "1" ] ; then MY_SCHED="INCREMENTAL DELTA" else MY_SCHED="" fi # 拼出备份命令,ONLINE 表示在线备份 CMD_LINE="db2 BACKUP DATABASE $MY_DB2 ONLINE $MY_SCHED LOAD $MY_LIB" # 指定执行备份的 DB2 用户 MY_USER=db2inst1 echo "Executing: $CMD_LINE" su - $MY_USER -c "$CMD_LINE" RETURN_STATUS=$? exit $RETURN_STATUS

几个关键点:MY_LIB的路径和文件名取决于操作系统和位数,Linux 64 位是nbdb2.so64,AIX 64 位是nbdb2.sl64,写错了会报“load shared library failed”。MY_DB2是要备份的数据库名,如果有多个库要备份,就复制多行CMD_LINE和su命令,原文里CMD_LINE1就是干这个的。

MY_SCHED的取值直接对应 DB2 的备份语法:全备份不加参数,累积增量是INCREMENTAL,差异增量是INCREMENTAL DELTA。NBU 调度类型和这个的对应关系是:Automatic Full Backup 对应全备份,Automatic Cumulative Incremental Backup 对应累积增量,Automatic Differential Incremental Backup 对应差异增量。

3.2 db2.conf 配置详解

db2.conf是 NBU 用来定位备份策略和调度的地方,备份和恢复都靠它。原文给了两段配置,一段管数据库备份,一段管归档日志备份。

# 数据库备份配置段 DATABASE DWDB OBJECTTYPE DATABASE POLICY s80a_DB2_everyday_to_tape SCHEDULE Default-Application-Backup ENDOPER # 归档日志备份配置段 DATABASE DWDB OBJECTTYPE ARCHIVE POLICY DB2_log SCHEDULE user_backup ARCFUNC SAVE #ARCFUNC COPY #ARCDIR /home/db2inst1/arcdir #RETDIR /home/db2inst1/arcdir ENDOPER

DATABASE指定数据库名,OBJECTTYPE DATABASE表示这是数据库备份配置,POLICY和SCHEDULE必须和 NBU 上创建的策略名、调度名完全一致,大小写敏感。OBJECTTYPE ARCHIVE那段管归档日志,ARCFUNC SAVE表示日志归档到 NBU 存储,如果改成ARCFUNC COPY,日志会复制到本地目录,由ARCDIR指定。

异机恢复的时候,db2.conf里必须加一行CLIENT_NAME,指定源客户端名。这是异机恢复和本机恢复最大的区别。

# 异机恢复时的 db2.conf 配置 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

CLIENT_NAME告诉 NBU:“我要恢复的这个数据库,备份是从gdccas670这台机器上做的。”没有这行,NBU 会在本地客户端的映像目录里找,找不到就报“no backup image found”。

3.3 创建 NBU 备份策略

NBU 侧的配置在 Administration Console 里完成,步骤原文列了 14 步,我挑关键的说。

策略类型必须选DB2,存储单元和卷池按实际环境选。客户端名填 DB2 所在主机名,这个名必须和db2.conf里的CLIENT_NAME对应。Backup Selections 里填db2_backup脚本的完整路径,比如/usr/openv/netbackup/ext/db_ext/db2/db2_backup。

调度配置里,全备份选Automatic Full Backup,差异增量选Automatic Differential Incremental Backup,累积增量选Automatic Cumulative Incremental Backup。保留周期按业务需求设,我一般全备份保留 4 周,增量保留 2 周。

注意:如果做 ONLINE 备份,还需要额外创建一个 Standard 类型的文件备份策略,并设置一个 User Backup 类型的 Schedule,用来备份归档日志。这个策略的客户端和 DB2 策略是同一台机器。

4. 异机恢复实操:从 No.Restrictions 到 rollforward

4.1 放开异机恢复限制

NBU 默认不允许异机恢复,必须在 Master Server 上创建一个空文件来放开限制。

# 在 Master Server 上以 root 身份执行 touch /usr/openv/netbackup/db/altnames/No.Restrictions # 验证文件存在且为空 ls -l /usr/openv/netbackup/db/altnames/No.Restrictions

这个文件的名字就是字面意思:不限制。如果只想允许特定客户端做异机恢复,可以创建Allow.Restrictions文件并在里面写允许的客户端名,但生产环境做恢复演练时,我一般直接用No.Restrictions,省事。

4.2 目标端环境准备

目标端要装 NBU 客户端,并且能连上 Master Server。DB2 实例要提前创建好,实例名可以和源端不同,但数据库名要一致(或者用to参数指定新路径)。

# 目标端验证 NBU 客户端连通性 /usr/openv/netbackup/bin/bpps -x # 确认 nbdb2 库文件存在 ls -l /usr/openv/netbackup/bin/nbdb2.so64 # 确认 db2.conf 已配置 CLIENT_NAME cat /usr/openv/netbackup/ext/db_ext/db2/db2.conf

目标端的db2.conf里,POLICY和SCHEDULE要指向源端备份时用的策略和调度,CLIENT_NAME填源端主机名。如果目标端和源端共用同一个 NBU Master,这些信息直接照抄源端配置再加CLIENT_NAME就行。

4.3 OFFLINE 备份的异机恢复

OFFLINE 备份的恢复相对简单,因为不需要 rollforward。恢复命令里加without rolling forward参数。

su - db2inst1 # 恢复到最新备份,数据库不存在时用 to 参数指定新路径 db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.so64 without rolling forward without prompting # 如果目标端没有同名数据库,需要指定 to 参数 db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.so64 to /db_dir without rolling forward without prompting

load后面跟的是 NBU 的 DB2 库文件路径,without rolling forward告诉 DB2 恢复完就结束,不做日志前滚。without prompting避免交互式确认,适合脚本化执行。

如果要恢复到某个特定备份版本,先用bplist列出可用映像。

# 列出源端主机的 DB2 备份映像,-t 18 是 DB2 备份的类型号 bplist -C gdccas670 -t 18 -R / # 输出会列出类似这样的路径: # /DB2/BI/node0000/20050226120711/BI.0.dwccbxm.node0000.642.20050226120711.4 # 其中 20050226120711 就是备份时间点

拿到时间点之后,在 restore 命令里加taken at参数。

db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.so64 taken at 20050226120711 without rolling forward without prompting

4.4 ONLINE 备份的异机恢复

ONLINE 备份的恢复必须做 rollforward,因为备份期间有活动日志。恢复分两步:先 restore,再 rollforward。

su - db2inst1 # 第一步:恢复数据库 db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.so64 # 如果数据库不存在,加 to 参数 db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.so64 to /db_dir # 第二步:前滚到日志末尾 db2 rollforward db bi to end of logs and complete

恢复到指定时间点的场景:

# 恢复到 2005-02-26 12:07:11 这个时间点 db2 restore db bi load /usr/openv/netbackup/bin/nbdb2.so64 taken at 20050226120711 # 前滚到指定时间 db2 rollforward db bi to 2005-02-26-12:07:11 using local time and complete

using local time这个选项在有些 DB2 版本里没有。如果没有这个选项,而操作系统时间又和标准时间有偏差,rollforward 的时间要手动减去偏差值。我遇到过因为时区问题导致 rollforward 报“SQL1271W 数据库已恢复但未前滚到日志末尾”的情况,后来在命令里把时间往前调了 8 小时才过。

注意:rollforward 需要归档日志。如果归档日志在 NBU 上,DB2 会自动通过db2uext2从 NBU 拉取。前提是db2.conf里归档日志那段配置正确,CLIENT_NAME指向源端。

5. 避坑与排查:异机恢复最常见的五个翻车点

5.1 报错 “no backup image found”

现象:db2 restore执行后立刻报找不到备份映像,bplist也列不出东西。

原因:db2.conf里没写CLIENT_NAME,或者写错了。NBU 默认在本地客户端的映像目录里找,异机恢复时源端映像不在本地。

解决:在db2.conf的OBJECTTYPE DATABASE和OBJECTTYPE ARCHIVE两段里都加上CLIENT_NAME <源端主机名>,然后重新执行 restore。

5.2 报错 “user exit program not found”

现象:DB2 归档日志时失败,db2diag.log里报db2uext2找不到或权限错误。

原因:db2_config没有正确执行,或者db2uext2的 setuid 位丢了。

解决:重新运行/usr/openv/netbackup/bin/db2_config,然后检查ls -l $INSTHOME/sqllib/adm/db2uext2,确保权限是-r-sr-xr-x。如果 setuid 丢了,chmod u+s补上。

5.3 rollforward 卡住不动

现象:db2 rollforward db bi to end of logs and complete执行后长时间无响应,或者报“SQL1271W”。

原因:归档日志没有从 NBU 拉取成功,或者日志链断了。常见原因是db2.conf里归档日志段的POLICY或SCHEDULE写错,NBU 找不到对应的日志备份。

解决:先用bplist -C <源端> -t 18 -R /确认日志备份存在,然后检查db2.conf归档段的POLICY和SCHEDULE是否和 NBU 上一致。如果日志链确实断了,只能恢复到最后一个完整日志点。

5.4 恢复后数据库处于“备份暂挂”状态

现象:restore 和 rollforward 都成功了,但db2 connect to bi报“数据库处于备份暂挂状态”。

原因:恢复过程中 DB2 检测到需要做一次全备份来重置日志链。

解决:做一次全备份即可解除。

db2 backup database bi to /tmp

5.5 目标端和源端 DB2 版本不一致

现象:restore 报“SQL2542N 数据库版本不兼容”或类似错误。

原因:目标端 DB2 版本低于源端,或者修复级别不同。

解决:目标端 DB2 版本必须大于等于源端。如果源端是 DB2 9.7 FP5,目标端至少要是 9.7 FP5。跨大版本恢复(比如从 9.7 恢复到 10.5)需要先做数据库升级,不能直接 restore。

6. 装完怎么验证:一次完整的异机恢复演练清单

配置做完之后,怎么确认这套环境真的能扛住异机恢复?我的习惯是走一遍完整的演练,从备份到恢复到验证,每一步都留下记录。

先确认源端备份正常。在源端执行一次全备份,然后检查 NBU 上有没有生成映像。

# 源端手动触发备份 /usr/openv/netbackup/bin/db2_backup # 在 Master Server 上确认映像存在 bplist -C <源端主机名> -t 18 -R /

然后模拟异机恢复。找一台和目标端环境一致的机器,按第 4 章的步骤走一遍 restore 和 rollforward。恢复完成后,连上数据库做数据校验。

# 连接数据库 db2 connect to bi # 检查表空间状态 db2 list tablespaces show detail # 检查关键表的数据量 db2 "select count(*) from <关键表名>" # 检查数据库配置参数是否和源端一致 db2 get db cfg for bi | grep -i -E "userexit|logretain|trackmod"

最后一步是验证归档日志恢复。在源端做一次归档日志切换,然后在目标端确认能通过 NBU 拉取到日志。

# 源端切换归档日志 db2 archive log for database bi # 目标端确认日志可拉取 bplist -C <源端主机名> -t 18 -R / | grep -i archive

这套演练我一般每季度做一次,每次都会发现一些小问题——可能是db2.conf被误改,可能是 NBU 策略的保留周期到了导致旧映像被删,也可能是目标端 DB2 打了补丁之后nbdb2.so64版本不匹配。这些问题在真正需要恢复之前发现,比出事之后再查要轻松得多。

从那以后我每次配完 DB2 异机恢复,都会强制走一遍bplist确认映像可见、db2 restore确认能拉取、rollforward确认日志链完整,三步都过了才算配完。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 16:35:56

python爬虫要用到的库总结

前言 很多人一上手就问「爬虫要装哪几个库」&#xff0c;然后照着某篇清单把 requests、BeautifulSoup、lxml、Scrapy、selenium 全装上&#xff0c;结果一个也没用明白。库不是越多越好&#xff0c;关键是搞清楚每一类库解决的是哪一步的问题&#xff1a;有的负责发请求&#…

作者头像 李华
网站建设 2026/10/17 16:34:41

C++实现鼠标静止:Windows全局钩子原理与恶搞程序开发

1. 从“鼠标静止”这个小把戏说起&#xff1a;它到底能做什么第一次看到“鼠标静止”这个标题&#xff0c;很多人脑子里冒出来的画面大概是&#xff1a;运行一个程序&#xff0c;然后鼠标就卡住不动了&#xff0c;旁边的人一脸懵。这个效果确实存在&#xff0c;而且实现起来并不…

作者头像 李华
网站建设 2026/10/17 16:34:21

LLM推理流水线动态换挡:在碎片化GPU集群中突破性能瓶颈

今天想聊一个我们折腾了很久的问题&#xff1a;GPU集群里的卡型号杂七杂八&#xff0c;既有后补的高算力大显存新卡&#xff0c;也有早年买的小显存旧卡&#xff0c;混在一起跑LLM推理流水线时&#xff0c;静态切分总是让整条链路卡在最弱的那一段上。后来我们做了个叫FlexPipe…

作者头像 李华
网站建设 2026/10/17 16:33:20

遥感绝对辐射定标与GDAL实现:DN值转反射率的完整解析与实践

简介&#xff1a;面向遥感数据处理初学者与Python/GDAL使用者&#xff0c;资源内容围绕绝对辐射定标完整流程展开&#xff1a;从读取影像元数据、加载JSON定标参数&#xff0c;到逐波段计算辐射校正值并写出新图像&#xff0c;代码结构清晰&#xff0c;配有可直接参考的Python脚…

作者头像 李华
网站建设 2026/10/17 16:33:11

KMP跨平台实战:鸿蒙版Bilibili信息流工程落地与避坑

简介&#xff1a;一份聚焦于Kotlin Multiplatform&#xff08;KMP&#xff09;在鸿蒙应用跨平台开发实践的PDF技术文档&#xff0c;面向已熟悉Kotlin并希望向鸿蒙扩展的开发者&#xff0c;用于解决Android、iOS与鸿蒙三端共享业务逻辑、降低重复开发成本的问题。文档为单个PDF文…

作者头像 李华
网站建设 2026/10/17 16:31:01

Kali 2024.2 中 curl 8.7.1 的协议安全升级与实战适配

1. 项目概述&#xff1a;为什么一个 curl 命令值得单独写一篇“最新 Kali”专题&#xff1f;在某高校网络安全实验室的日常教学中&#xff0c;我带过三届学生做渗透测试基础实训。每次讲到信息收集环节&#xff0c;总有人举手问&#xff1a;“老师&#xff0c;curl 和 wget 到底…

作者头像 李华