简介这份文档面向企业级备份运维人员与数据库管理员围绕 TSM 6.3、Mhvtl、Oracle 与 DB2 的备份恢复测试展开适合需要搭建虚拟带库实验环境、验证异机恢复流程的中高级技术人员参考。资源包内仅含 1 个 docx 文件约 1.83MB内容按四大模块组织Mhvtl 虚拟带库在 CentOS 6.5 上的编译安装与可用性测试、基于 tgt 的 iSCSI 映射配置、TSM 主服务器安装与存储设备、卷及备份策略配置以及基于 TSM 的 Oracle 备份与异机恢复全流程涵盖 NUB 客户端安装、Rman 恢复 Spfile、控制文件、数据文件与归档日志等关键环节。文档目录结构清晰步骤与命令记录完整可帮助读者快速复现从带库模拟到数据库恢复的完整链路并理解灾难恢复场景下的授权文件调整与排错思路。目前已有 241 人学习下载适合作为备份恢复方案设计与实验验证的实操参考。1. 从一台没有物理带库的测试机说起TSM6.3 Mhvtl 能跑通什么手里只有几台虚拟机却要验证 TSM 的带库备份链路这事我干过不止一次。真实带库动辄几万块采购周期长还要配光纤交换机测试环境根本等不起。这份文档给出的思路是用 Mhvtl 在 Linux 上模拟一台虚拟带库通过 iSCSI 映射给 TSM 服务器再让 Oracle 和 DB2 客户端把数据备过来最后做异机恢复验证。整条链路涉及 Mhvtl 虚拟带库安装、tgt 的 iSCSI 服务端配置、TSM6.3 主服务器与客户端部署、Oracle 的 NUB 客户端配置、RMAN 与 TSM 命令配合恢复以及 DB2 的异机恢复流程。适合正在做备份方案验证的运维工程师、需要复现 TSM 带库备份场景的 DBA以及想搞明白虚拟带库到底能不能替代物理带库做功能测试的人。文档本身是实操记录不是产品手册里面很多步骤是踩过坑之后才写下来的。2. Mhvtl 虚拟带库搭建从编译安装到 iSCSI 映射Mhvtl 是一个基于 Linux 的开源虚拟磁带库能模拟 IBM 和惠普的 LTO 系列、索尼 AIT、STK T10000 等多种带库型号。它跑在普通 Linux 服务器上对上层备份软件来说看到的就是一台标准的 SCSI 带库设备。常见做法是把它和 iSCSI 目标端配合把虚拟带库映射到网络另一端的备份服务器这样 TSM 就能像访问物理带库一样访问它。2.1 安装前的依赖准备与用户创建Mhvtl 编译需要内核头文件和 SCSI 工具链。我一般先挂载系统光盘配好本地 yum 源然后一次性把依赖包装齐。这一步别偷懒缺一个包后面编译就报错。# 挂载光驱并配置本地 yum 源 mount /dev/cdrom /mnt mkdir -p /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ cat /etc/yum.repos.d/CentOS-Media.repo EOF [c6-media] nameCentOS-$releasever - Media baseurlfile:///mnt gpgcheck0 enabled1 EOF # 安装 Mhvtl 编译和运行所需的依赖包 yum install -y lsscsi mt-st mtx zlib-devel sg3_utils zlib \ kernel-devel kernel-headers gcc # 创建 vtl 用户后续 Mhvtl 服务以该用户运行 useradd vtl mkdir -p /opt/mhvtl /etc/mhvtl chown -Rf vtl:vtl /opt/mhvtl chown -Rf vtl:vtl /etc/mhvtl/opt/mhvtl是虚拟带库的存储路径磁带数据实际写在这里/etc/mhvtl存放配置文件包括带库槽位定义和磁带容量。lsscsi和mtx是后面验证带库状态用的sg3_utils提供 SCSI 通用工具。关闭防火墙和 SELinux 是常规操作避免 iSCSI 和 SCSI 设备识别被拦截。2.2 编译安装与带库设备识别Mhvtl 的安装分两部分先装 utils 包再编译内核模块。源码包解压后进入 kernel 目录执行 make 和 make install然后启动服务。# 安装 mhvtl-utils 包 rpm -ivh mhvtl-utils-1.5-2.x86_64.rpm # 解压源码并编译内核模块 unzip mhvtl-1.5-2.zip cd markh794-mhvtl-d9f6115/kernel make make install # 启动服务并设置开机自启 service mhvtl start chkconfig mhvtl on启动时如果提示Could not locate library config file说明/etc/mhvtl/library_contents.10和.30还没生成Mhvtl 会自动创建默认配置。这时候先停服务按需编辑槽位和磁带标签再重新启动。默认配置会模拟两台带库一台 STK L700 和一台 STK L80分别对应/dev/sg10和/dev/sg11两个机械手设备。用lsscsi -g确认设备识别情况lsscsi -g # 输出中应能看到 mediumx 类型的机械手设备和 tape 类型的驱动器设备 # [3:0:0:0] mediumx STK L700 0105 /dev/sch0 /dev/sg10 # [3:0:1:0] tape IBM ULT3580-TD5 0105 /dev/st0 /dev/sg2 # [3:0:8:0] mediumx STK L80 0105 /dev/sch1 /dev/sg11/dev/sg10和/dev/sg11是机械手/dev/st0到/dev/st7是磁带驱动器。磁带默认容量 500MB在/etc/mhvtl/mhvtl.conf里把CAPACITY改成 2046每盘磁带就是 2GB。改完重启 mhvtl 服务生效。2.3 带库可用性验证与 iSCSI 映射装完先别急着接 TSM用 mtx 和 tar 自己验一遍确认机械手能抓带、驱动器能读写。# 查看 sg10 机械手状态确认槽位和磁带标签 mtx -f /dev/sg10 status # 把 1 号槽位的磁带装入 0 号驱动器 mtx -f /dev/sg10 load 1 0 # 再次查看状态Data Transfer Element 0 应显示 Full mtx -f /dev/sg10 status # 用 tar 写入测试数据 tar -cvf /dev/st0 /boot # 读取验证 tar -tvf /dev/st0mtx -f /dev/sg10 load 1 0的含义是对 sg10 这台机械手把 1 号存储槽位的磁带搬到 0 号驱动器。如果状态里Data Transfer Element 0从 Empty 变成 Full 并显示 VolumeTag说明机械手工作正常。tar 写入成功且能读回说明驱动器链路没问题。iSCSI 映射部分用 tgt 实现。在 Mhvtl 所在机器上安装scsi-target-utils配置/etc/tgt/targets.conf把/dev/sg10、/dev/sg11以及各驱动器设备作为 LUN 映射出去。备份服务器端用iscsiadm发现并登录目标登录成功后本地会出现新的 SCSI 设备再用lsscsi -g确认机械手和驱动器已经可见。这一步的坑在于iSCSI 映射的是 SCSI 通用设备不是块设备配置时要用backing-store /dev/sg10这种写法而不是backing-store /dev/st0。3. TSM6.3 服务端配置存储设备、卷与备份策略TSM 服务端是整个备份体系的核心它管理备份策略、存储池和设备类。在虚拟带库场景下TSM 通过 SCSI 通用设备访问机械手和驱动器所以配置的重点是正确定义library和drive然后把卷检入存储池。3.1 定义带库与驱动器进入 TSM 管理命令行dsmadmc先定义带库设备。假设 iSCSI 映射后备份服务器上看到的机械手是/dev/sg10驱动器是/dev/st0到/dev/st3。/* 定义 SCSI 带库设备名为 /dev/sg10 */ DEFINE LIBRARY VTL_LIB LIBTYPESCSI DEVICE/dev/sg10 /* 定义驱动器关联到带库 */ DEFINE DRIVE VTL_LIB DRIVE0 DEVICE/dev/st0 ELEMENT256 DEFINE DRIVE VTL_LIB DRIVE1 DEVICE/dev/st1 ELEMENT257 DEFINE DRIVE VTL_LIB DRIVE2 DEVICE/dev/st2 ELEMENT258 DEFINE DRIVE VTL_LIB DRIVE3 DEVICE/dev/st3 ELEMENT259 /* 定义设备类指向带库 */ DEFINE DEVCLASS VTL_DEVC DEVTYPESCSI LIBRARYVTL_LIBELEMENT参数是驱动器在带库中的元素编号Mhvtl 默认从 256 开始分配。如果编号不对TSM 执行AUDIT LIBRARY时会报找不到驱动器。定义完用AUDIT LIBRARY VTL_LIB CHECKLABELYES让 TSM 扫描带库识别已有磁带的标签。3.2 定义存储池与卷检入存储池是 TSM 存放备份数据的逻辑容器卷是存储池的物理载体。虚拟带库里的磁带就是卷。/* 定义主存储池关联到设备类 */ DEFINE STGPOOL VTL_POOL VTL_DEVC MAXSCRATCH50 /* 定义拷贝存储池用于数据冗余 */ DEFINE STGPOOL VTL_COPYPOOL VTL_DEVC MAXSCRATCH20 /* 检入卷CHECKIN 会自动扫描带库中的磁带 */ CHECKIN LIBVOL VTL_LIB SEARCHYES STATUSSCRATCH CHECKLABELYESMAXSCRATCH50表示这个存储池最多使用 50 盘空白磁带。CHECKIN的SEARCHYES让 TSM 自动发现带库中所有磁带STATUSSCRATCH把空白磁带标记为可写。如果磁带之前写过数据需要先CHECKOUT再重新CHECKIN为 SCRATCH 状态。3.3 配置备份策略与本地磁盘备份策略域、策略集、管理类这三层结构决定了数据保留多久、备份频率多高。我一般按业务类型分策略域比如 Oracle 一个域、DB2 一个域、文件系统一个域。/* 定义策略域 */ DEFINE DOMAIN ORACLE_DOMAIN DEFINE DOMAIN DB2_DOMAIN DEFINE DOMAIN FS_DOMAIN /* 在 ORACLE_DOMAIN 下定义策略集和管理类 */ DEFINE POLICYSET ORACLE_DOMAIN STANDARD DEFINE MGMTCLASS ORACLE_DOMAIN STANDARD DAILY DEFINE COPYGROUP ORACLE_DOMAIN STANDARD DAILY STANDARD TYPEBACKUP /* 设置保留 30 天目标存储池为 VTL_POOL */ UPDATE COPYGROUP ORACLE_DOMAIN STANDARD DAILY STANDARD DESTINATIONVTL_POOL RETVER30RETVER30表示备份版本保留 30 天超过后自动过期。DESTINATIONVTL_POOL指定数据写入虚拟带库存储池。如果要做本地磁盘备份把DESTINATION改成磁盘存储池即可比如先定义一个DISK类型的设备类指向/backup目录。配置完成后用dsmadmc的BACKUP NODE命令手工触发一次文件系统备份确认数据能正常写入带库。在 TSM 服务器上用QUERY VOLUME查看卷使用情况用QUERY ACTLOG看备份日志。4. Oracle 与 DB2 客户端接入NUB 配置与手工备份TSM 服务端配好之后Oracle 和 DB2 客户端需要安装 NUBTivoli Storage Manager Backup-Archive Client和对应的数据保护模块。Oracle 用TDPODB2 用TDPDB2。客户端通过dsm.opt和dsm.sys连接服务端数据保护模块再通过 API 把数据库备份流交给 TSM。4.1 Oracle 客户端 NUB 安装与配置Oracle 客户端上先装 NUB 客户端再装 TDPO 模块。配置文件分两部分dsm.sys定义服务端连接信息dsm.opt定义客户端行为。# /opt/tivoli/tsm/client/ba/bin/dsm.sys SErvername tsm_server COMMmethod TCPip TCPPort 1500 TCPServeraddress 192.168.81.7 NODename oracle_client PASSWORDACCESS generate# /opt/tivoli/tsm/client/ba/bin/dsm.opt SErvername tsm_serverPASSWORDACCESS generate让客户端自动生成并保存密码避免每次备份手工输密码。NODename必须和 TSM 服务端上REGISTER NODE注册的节点名一致否则连接会被拒绝。TDPO 的配置文件在/opt/tivoli/tsm/client/oracle/bin/tdpo.opt# tdpo.opt DSMI_ORC_CONFIG /opt/tivoli/tsm/client/ba/bin/dsm.opt DSMI_LOG /opt/tivoli/tsm/client/oracle/bin TDPO_NODE oracle_client TDPO_OWNER oracle TDPO_PSWDPATH /opt/tivoli/tsm/client/oracle/binTDPO_OWNER指定 Oracle 操作系统用户TDPO_PSWDPATH是 TDPO 密码文件存放路径。配置完用tdpoconf password生成 TDPO 密码文件再用tdpoconf showenv确认环境变量和连接状态。4.2 RMAN 备份脚本与手工发起Oracle 的 TSM 备份通过 RMAN 调用libtdpo.so库实现。RMAN 脚本里用SBT_TAPE通道PARMS指定 TDPO 库路径。# 设置环境变量 export ORACLE_SIDorcl export TDPO_OPTFILE/opt/tivoli/tsm/client/oracle/bin/tdpo.opt export LD_LIBRARY_PATH$ORACLE_HOME/lib:/opt/tivoli/tsm/client/api/bin64 # RMAN 备份脚本 rman target / EOF RUN { ALLOCATE CHANNEL c1 TYPE SBT_TAPE PARMS ENV(TDPO_OPTFILE/opt/tivoli/tsm/client/oracle/bin/tdpo.opt); ALLOCATE CHANNEL c2 TYPE SBT_TAPE PARMS ENV(TDPO_OPTFILE/opt/tivoli/tsm/client/oracle/bin/tdpo.opt); BACKUP DATABASE PLUS ARCHIVELOG; RELEASE CHANNEL c1; RELEASE CHANNEL c2; } EOFALLOCATE CHANNEL的TYPE SBT_TAPE告诉 RMAN 走 TSM 的磁带通道PARMS里的ENV把 TDPO 配置文件路径传进去。两个通道并行备份能提高吞吐。备份完成后在 TSM 服务端用QUERY BACKUP查看备份对象在 Oracle 端用RMAN LIST BACKUP确认备份集。4.3 DB2 客户端配置与备份DB2 的 TSM 接入类似但配置文件不同。DB2 用dsm.opt和dsm.sys连接 TSM再用db2 backup命令指定 TSM 作为备份目标。# DB2 客户端 dsm.sys 配置 SErvername tsm_server COMMmethod TCPip TCPPort 1500 TCPServeraddress 192.168.81.7 NODename db2_client PASSWORDACCESS generate-- DB2 数据库配置 TSM 参数 UPDATE DB CFG FOR SAMPLE USING TSM_MGMTCLASS DAILY UPDATE DB CFG FOR SAMPLE USING TSM_NODENAME db2_client UPDATE DB CFG FOR SAMPLE USING TSM_OWNER db2inst1 UPDATE DB CFG FOR SAMPLE USING TSM_PASSWORD generate# 执行 DB2 在线备份到 TSM db2 backup db sample online use tsmTSM_MGMTCLASS指定 TSM 管理类决定保留策略。TSM_NODENAME必须和 TSM 服务端注册的节点名一致。db2 backup db sample online use tsm触发在线备份DB2 会把备份流通过 TSM API 写入虚拟带库。备份完成后用db2 list history backup all for sample查看备份历史。5. 异机恢复与避坑记录RMAN 恢复流程和五个翻车点异机恢复是备份验证的最后一环也是最容易翻车的地方。Oracle 异机恢复需要恢复 spfile、control file、数据文件和归档日志然后打开数据库。DB2 异机恢复则通过db2 restore db命令从 TSM 拉取备份集。这一章把恢复流程和踩过的坑一起说清楚。5.1 Oracle 异机恢复的完整步骤异机恢复的前提是目标机器上已经装好同版本 Oracle 软件、NUB 客户端和 TDPO 模块并且 TSM 服务端已经授权该节点访问源节点的备份数据。# 1. 在目标机器上设置环境变量 export ORACLE_SIDorcl export TDPO_OPTFILE/opt/tivoli/tsm/client/oracle/bin/tdpo.opt # 2. 启动 RMAN不连接目标数据库 rman target / nocatalog # 3. 恢复 spfile RUN { ALLOCATE CHANNEL c1 TYPE SBT_TAPE PARMS ENV(TDPO_OPTFILE/opt/tivoli/tsm/client/oracle/bin/tdpo.opt); RESTORE SPFILE TO PFILE /tmp/init_orcl.ora; RELEASE CHANNEL c1; } # 4. 用恢复的 pfile 启动实例到 nomount startup nomount pfile/tmp/init_orcl.ora # 5. 恢复 control file RUN { ALLOCATE CHANNEL c1 TYPE SBT_TAPE PARMS ENV(TDPO_OPTFILE/opt/tivoli/tsm/client/oracle/bin/tdpo.opt); RESTORE CONTROLFILE FROM AUTOBACKUP; RELEASE CHANNEL c1; } # 6. Mount 数据库 alter database mount; # 7. 恢复数据文件和归档日志 RUN { ALLOCATE CHANNEL c1 TYPE SBT_TAPE PARMS ENV(TDPO_OPTFILE/opt/tivoli/tsm/client/oracle/bin/tdpo.opt); RESTORE DATABASE; RECOVER DATABASE; RELEASE CHANNEL c1; } # 8. 打开数据库 alter database open resetlogs;RESTORE SPFILE TO PFILE先把 spfile 恢复到本地文件因为 nomount 状态需要 pfile 启动。RESTORE CONTROLFILE FROM AUTOBACKUP从 TSM 拉取控制文件备份。RECOVER DATABASE应用归档日志做前滚。OPEN RESETLOGS重置日志序列完成恢复。5.2 避坑记录五个真实翻车点现象一TSM 服务端AUDIT LIBRARY报驱动器元素编号错误。原因Mhvtl 默认驱动器元素编号从 256 开始但不同型号带库的编号规则不同手工定义时写错了。 解决先用mtx -f /dev/sg10 status查看Data Transfer Element的编号再按实际编号定义DEFINE DRIVE的ELEMENT参数。现象二Oracle RMAN 备份时报ORA-19554: error allocating device, device type: SBT_TAPE。原因LD_LIBRARY_PATH没包含 TDPO 的库路径或者tdpo.opt文件权限不对。 解决确认LD_LIBRARY_PATH包含/opt/tivoli/tsm/client/api/bin64tdpo.opt文件属主是 Oracle 用户权限 644。现象三异机恢复时RESTORE CONTROLFILE找不到备份。原因TSM 服务端没有把源节点的备份数据授权给目标节点或者目标节点的NODename和注册名不一致。 解决在 TSM 服务端执行GRANT BACKUP或SET ACCESS把源节点备份对象授权给目标节点确认dsm.sys里的NODename和服务端注册名完全一致。现象四DB2 备份到 TSM 时报SQL2062N错误。原因DB2 实例用户没有权限读取 TSM 客户端配置文件或者TSM_PASSWORD没生成。 解决确认dsm.sys和dsm.opt对 DB2 实例用户可读执行db2 update db cfg using TSM_PASSWORD generate重新生成密码。现象五Mhvtl 磁带容量改大后TSM 仍然按 500MB 报空间不足。原因mhvtl.conf修改后没有重启 mhvtl 服务或者 TSM 已经检入的卷还是旧容量。 解决修改CAPACITY后执行service mhvtl restart在 TSM 里把旧卷CHECKOUT再重新CHECKIN让 TSM 重新读取卷容量。5.3 恢复后的验证与进阶技巧恢复完成后Oracle 端用RMAN LIST BACKUP和SELECT * FROM V$DATABASE确认数据库状态DB2 端用db2 list history backup all for sample和db2 connect to sample确认连接正常。进阶用法上我习惯在 TSM 服务端配一个COPYPOOL把主存储池的数据自动复制一份到另一个存储池这样即使一盘磁带损坏也能从拷贝池恢复。配置命令是DEFINE STGPOOL VTL_COPYPOOL VTL_DEVC然后在主存储池上UPDATE STGPOOL VTL_POOL COPYPOOLVTL_COPYPOOL。另外定期跑AUDIT LIBRARY和QUERY VOLUME能提前发现磁带异常别等到恢复的时候才发现卷不可读。从那以后我每次搭完虚拟带库环境都强制走一遍「mtx 抓带 → tar 读写 → TSM 检入 → RMAN 备份 → 异机恢复」的完整链路确认每一环都通再交给业务方。希望帮到你。本文还有配套的精品资源点击获取