
简介面向企业级备份与容灾建设场景这份原创测试文档围绕 TSM6.3、Mhvtl、Oracle 与 DB2 组合提供了从虚拟带库搭建到数据库恢复的完整实操路径。资源包仅含 1 个 docx 文档约 1.83MB但目录结构非常完整开头先简述主流备份软件应用场景与核心拓扑随后分四大部分第一部分讲解 Mhvtl 开源虚拟带库在 CentOS 6.5 下的安装前准备、编译安装、可用性测试以及基于 tgt 的 iSCSI 服务器端安装、带库映射与客户端配置第二部分覆盖 TSM 主服务器安装、存储设备与卷配置、备份策略及本地磁盘备份第三部分介绍基于 TSM 的 Oracle 备份包括客户端环境准备、NUB 客户端安装、服务器端联动配置和手工发起备份第四部分演示 Oracle 异机恢复从环境准备、备份情况检查、异机恢复授权文件修改到通过 RMAN 与 TSM 命令创建目录、恢复 Spfile/控制文件/数据文件/归档日志、Mount 数据库并最终打开数据库。整体实践性强尤其适合备份运维、灾备演练与系统集成技术人员作为实验部署和故障排查手册。已有 241 人学习下载。1. 虚拟带库TSM备份环境先从一套 Mhvtl 虚拟带库说起备份测试环境里最缺的往往不是脚本而是一台能随便折腾的虚拟带库。真 LTO 带库价格高还要配 HBA 卡和光纤交换机测试环境想都不敢想。Mhvtl 用软件把机械手、磁带驱动器和槽位完整模拟出来备份软件感知不到底层只是文件。这套测试环境选了 TSM 6.3.5 Mhvtl在 CentOS 6.6 上从带库搭建、iSCSI 映射、TSM 存储配置一路走到 Oracle 11g 的 Rman 备份和异机恢复DB2 9.7 也做了对照。装不好会怎样机械手认不出、Rman 通道起不来、恢复顺序一错就翻车。这篇把完整安装过程整理出来适合搭备份验证环境、刚接触 TSM 的运维和 DBA 照着走一遍。2. Mhvtl 虚拟带库安装CentOS 6.6 上编译出一台 STK L700先交代部署拓扑Mhvtl 虚拟带库机器是 192.168.81.6TSM 备份服务器是 192.168.81.7两台机器通过 iSCSI 把带库共享过去。CentOS 6.6 自带的内核是 2.6.32 系列Mhvtl 1.5 的兼容性没问题下面按依赖、编译、验证、映射、避坑五个小节推进。2.1 安装前准备依赖包和 vtl 用户缺一不可Mhvtl 编译和运行依赖一批 SCSI 工具链原文里列得很清楚我整理成一条命令yum install -y lsscsi mt-st mtx zlib-devel sg3_utils zlib \ kernel-devel kernel-headers gcc useradd vtl passwd vtl mkdir -p /opt/mhvtl /etc/mhvtl chown -Rf vtl:vtl /opt/mhvtl chown -Rf vtl:vtl /etc/mhvtllsscsi 用来查看系统里的 SCSI 设备Mhvtl 装完能不能用第一眼就靠它mt-st 是磁带机操作命令mtx 是控制机械手换带的命令sg3_utils 提供对/dev/sg*通用 SCSI 设备的访问能力内核模块编译依赖 kernel-devel 和 kernel-headersgcc 不用多说。其中 kernel-devel 的版本必须和当前内核严格一致装之前先uname -r记下内核版本再用rpm -q kernel-devel对比版本对不上 make 时大概率报 Kernel configuration is invalid。创建 vtl 用户是让 Mhvtl 的 vtllibrary、vtltape 进程以这个身份运行。/opt/mhvtl是虚拟带库的存储路径所有磁带上的数据最终都变成这个目录下的文件/etc/mhvtl是配置路径。chown 要加-f避免目录不存在时报错同时确认 vtl 对这两个目录有写权限很多启动失败最后查出来就是权限没到位。2.2 编译安装 Mhvtl内核模块和用户态程序分开装Mhvtl 的安装分两部分mhvtl-utils 的 rpm 提供用户态程序源码包里编译的是内核模块。原文的顺序是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先装 rpm 再编内核模块。进入源码目录后只需要编译 kernel 子目录make install会把 mhvtl.ko 放到内核模块目录同时安装 vtllibrary、vtltape 等用户态程序并注册成服务。首次service mhvtl start时日志里通常会看到Could not locate library config file: /etc/mhvtl/library_contents.10 Creating a default one这不是报错是第一次启动自动生成了默认带库配置。library_contents.10对应一台 STK L700 带库library_contents.30对应一台 STK L80 带库TSM 这类备份软件认的就是这两个逻辑带库。看到vtllibrary process PID is ...才算启动成功。chkconfig 是为了开机自启重启机器后不手动拉服务是经常发生的低级事故。2.3 验证带库可用性lsscsi 和 mtx 双重确认启动后第一件事是确认内核模块把设备暴露给了系统lsscsi -g正常情况下能看到类似下面的关键行[3:0:0:0] mediumx STK L700 /dev/sch0 /dev/sg10 [3:0:1:0] tape IBM ULT3580-TD5 /dev/st0 /dev/sg2 [3:0:8:0] mediumx STK L80 /dev/sch1 /dev/sg11mediumx 类型就是机械手/dev/sg10是 STK L700 的机械手臂tape 类型是磁带驱动器/dev/st0是第一个驱动器。后面 iSCSI 映射和 TSM 配置认的都是这几个节点记错一个后面全乱。接着用 mtx 检查带库槽位和驱动器状态mtx -f /dev/sg10 status mtx -f /dev/sg10 load 1 0第一条命令列出 43 个槽位和 4 个驱动器的状态槽位 1 到 20 放的是 L4 磁带槽位 22 是清洗带槽位 30 到 39 是 L5 磁带。第二条命令把 1 号槽位的磁带放进 0 号驱动器再执行一次 status 就能看到 Data Transfer Element 0 从 Empty 变成 Full。最后用 tar 做一次真实读写tar -cvf /dev/st0 /boot tar -tvf /dev/st0第一条把 /boot 目录写入磁带设备第二条列出磁带内容。能读到文件列表说明虚拟带库的写读链路通了这步不验证后面接 TSM 出了乱子都不知道是该查带库还是查备份软件。想调整磁带容量改/etc/mhvtl/mhvtl.conf里的CAPACITY2046单位是 MB默认 500M 对 Oracle 备份来说太小改完重启 mhvtl 服务生效。2.4 用 tgt 把带库映射给备份服务器Mhvtl 机器和 TSM 机器是分开的Mhvtl 的/dev/sg10、/dev/st0不会自己出现在备份服务器上。原文方案是 tgt 做 iSCSI target把带库以磁带类型共享出去。服务端常见做法yum install -y scsi-target-utils service tgtd start chkconfig tgtd on tgtadm --lld iscsi --op new --mode target --tid 1 \ --targetname iqn.2024.vtl:tsm tgtadm --lld iscsi --op new --mode logicalunit --tid 1 \ --lun 1 --bstype tape --device /dev/sg10 tgtadm --lld iscsi --op new --mode logicalunit --tid 1 \ --lun 2 --bstype tape --device /dev/st0 tgtadm --lld iscsi --op bind --mode target --tid 1 \ --initiator-address 192.168.81.7scsi-target-utils 提供 tgtd 和 tgtadm。targetname 全局唯一建议按iqn.年月.标识:用途命名后面 initiator 挂不上排查时一眼能认出来。--bstype tape是让 tgt 把 LUN 按磁带类型导出这个参数漏了客户端挂出来的设备类型是 disk备份软件根本不认。TSM 那台机器上装 iscsi-initiator-utils用 iscsiadm 发现并登录yum install -y iscsi-initiator-utils iscsiadm --mode discovery --type sendtargets --portal 192.168.81.6 iscsiadm --mode node --targetname iqn.2024.vtl:tsm \ --portal 192.168.81.6 --login登录后 lsscsi -g 会多出 mediumx 和 tape 设备路径可能是/dev/sg2、/dev/st0这种TSM 配置时以备份服务器自己看到的路径为准别照抄 Mhvtl 机器上的设备名。2.5 避坑Mhvtl 安装和启动的典型故障现象一改完/etc/mhvtl/mhvtl.conf的 CAPACITY重启服务后磁带容量没变。原因容量参数只影响新建的磁带文件已在槽位里的虚拟磁带还按旧容量生成。解决删掉/opt/mhvtl下对应卷的目录让系统重新分配或把存量磁带用 mtx 重新 load 一遍走格式化流程。现象二编译内核模块报 Kernel configuration is invalid。原因kernel-devel 版本和uname -r当前内核版本不一致多半是 yum 更新了 kernel 但没同步装 kernel-devel。解决rpm -q kernel-devel对比版本装同版本后重新 make make install。现象三service mhvtl start 后 lsscsi 看不到 mediumx 设备但进程活着。原因内核模块没加载成功或 SCSI 扫描没触发。解决modprobe mhvtl手动加载再重启机器触发总线扫描还不行就翻/var/log/messages看模块加载的错误行。现象四mtx -f /dev/sg10 status报 Cant open SCSI device。原因sg3_utils 没装或/dev/sg10权限不对。解决确认 sg3_utils 已安装chmod 660 /dev/sg*或把运行用户加入 disk 组仍不行就核对library_contents.10里的设备名和 lsscsi 输出是否一致。3. TSM 6.3 安装与存储配置把虚拟带库变成备份池这章把 TSM 6.3.5 在备份服务器上的安装和存储配置走通。核心是把上一章通过 iSCSI 映射过来的带库注册成 TSM 的 library再定义驱动器、卷、存储池和备份策略。TSM 的配置层级比普通备份软件多顺序错了后面命令会连环报错。3.1 TSM 6.3.5 安装与实例初始化TSM 6.3.5 服务器端安装包是 rpm 格式按顺序安装 server 相关 rpm默认落在/opt/tivoli/tsm/server。安装完成后需要用 dsmserv 初始化实例/opt/tivoli/tsm/server/bin/dsmserv -i实例初始化过程会要求设置管理员 ID 和密码同时生成 dsmserv.opt 配置文件。这一步的产物直接决定后面 dsmadmc 管理命令能不能连上管理员账号和实例名建议立刻记到测试文档里。初始化完成后用dsmserv -service把实例注册为系统服务避免每次重启手动拉起。初始化完成后用 dsmadmc 登录管理界面dsmadmc -idadmin -passwordyourpassword登录后所有后续配置都在这个管理命令行里完成。注意 TSM 管理命令大小写不敏感但设备名、节点名、策略名这些标识符一旦定义就固定后面引用时必须保持一致。3.2 配置存储设备机械手和驱动器的注册顺序在 TSM 服务器上通过 iSCSI 映射过来的 Mhvtl 机械手设备是/dev/sg2以实际 lsscsi 输出为准配置顺序必须是先 library 再 drivedefine library VTLIB libtypeSCSI device/dev/sg2 define drive VTLIB DRV1 device/dev/st0 define drive VTLIB DRV2 device/dev/st1libtypeSCSI告诉 TSM 这是一个 SCSI 机械手设备device 参数填的是机械手节点。注意这里填/dev/sg*不是/dev/sch*TSM 通过 SCSI 通用接口控制机械手。驱动器的 device 填磁带机节点一个 STK L700 虚拟带库模拟 4 个驱动器先定义两个够用多路备份流并发时再补。定义完检查状态q library q drive q pathq drive 输出的状态里能看到每个驱动器的在线情况显示 OFFLINE 基本就是设备路径填错或 iSCSI 登录没成功回到系统里用 lsscsi 重新确认路径再用update drive改正。3.3 配置卷和存储池让备份数据落到带库磁带机械手和驱动器注册完TSM 还不知道把数据写到哪。需要定义设备类、存储池并把带库槽位里的磁带登记为卷define devclass VTLIB_TAPE devtypeLTO formatDRIVE define stgpool VTLIB_POOL VTLIB_TAPE maxscratch40 label libvolume VTLIB checkinscratchdefine devclass定义设备类devtypeLTO表示磁带设备类型TSM 按此处理磁带容量和驱动特性formatDRIVE是让 TSM 使用驱动器自身格式不要强制指定 LTO 版本Mhvtl 模拟的驱动器混着 LTO4 和 LTO5指定死了反而麻烦。define stgpool定义存储池 VTLIB_POOLmaxscratch 限制最多多少盘 scratch 磁带参与存储池。label libvolume checkinscratch把带库里未标记的磁带全部登记为 scratch 卷Mhvtl 槽位预置的 E01001L4、F01030L5 这些卷就是通过这条命令被 TSM 认走的。登记完用q libvolume查看每盘磁带的卷序列号TSM 的回收、扩展、移动备份都靠卷序列号定位磁带。3.4 配置备份策略和管理类数据往哪个存储池走备份策略的层级是策略域policy domain包含策略集policyset策略集里定义管理类mgmtclass管理类里定义备份 copygroup。Oracle 备份的完整配置define domain ORADB define policyset ORADB STANDARD define mgmtclass ORADB STANDARD MC_ORACLE define copygroup ORADB STANDARD MC_ORACLE STANDARD \ typebackup destVTLIB_POOL activate policyset ORADB STANDARDcopygroup 的 dest 参数决定备份数据进入 VTLIB_POOL这条关联是整个策略配置的枢纽。activate policyset是最后一步不激活新策略不生效这是新手最容易漏的配完备份跑起来数据还是进旧存储池。本地磁盘备份是另一条路文件系统小备份走本地磁盘、Oracle 大备份走带库是这套环境里常用的分工define devclass DISK_FILE devtypefile define stgpool FILE_POOL DISK_FILE directory/tsm/filepool maxscratch100devtypefile定义文件设备类directory 指定备份文件落地目录测试文件系统备份就靠它。两条路径配好后TSM 的存储体系才算完整。4. 基于 TSM 的 Oracle 备份把 Rman 通道和带库打通Oracle 备份客户端是 192.168.81.11Linux 5.7 Oracle 11g。原文里这一节标题写的是 NUB 客户端实际就是 TSM 的备份归档客户端配合 TDPOTivoli Data Protection for Oracle让 Rman 直接走 TSM 通道写带库。4.1 客户端环境准备与 TSM 备份客户端安装客户端安装 TSM 的两个 rpmrpm -ivh TIVsm-API-6.3.5-0.x86_64.rpm rpm -ivh TIVsm-BA-6.3.5-0.x86_64.rpmAPI 包提供应用接口库BA 包提供 dsmc 命令行工具和备份归档客户端两者是 Rman 调用 TSM 写带库的基础。安装完成后/opt/tivoli/tsm/client/ba/bin下会有 dsmc 和样例配置文件。客户端环境还要确认 Oracle 环境变量我一般在.bash_profile里显式写死 ORACLE_HOME 和 ORACLE_SID避免 rman 脚本或 cron 任务里环境丢失的玄学问题export ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1 export ORACLE_SIDorcl export PATH$ORACLE_HOME/bin:$PATH4.2 客户端配置与服务端授权NODENAME 大小写敏感客户端核心配置在 dsm.sysSERVERNAME TSMSERVER COMMMethod TCPip TCPPort 1500 NODENAME oracle11g PASSWORDACCESS GENERATENODENAME 是节点名由服务端注册时指定大小写敏感前后台不一致直接报权限错误PASSWORDACCESS GENERATE 让客户端把密码加密存到本地避免每次备份交互输入。dsm.opt 里通过 SERVERNAME 选择默认服务器单服务器环境保持默认即可。服务端注册节点并授权register node oracle11g backup123 update node oracle11g maxnummp8register node 是必须的密码要记住后面异机恢复还要用。update maxnummp 限制该节点并发备份流数测试环境 8 足够。注册完在客户端执行dsmc q node能返回节点信息说明通信已通。接下来配置 TDPO 的选项文件 tdpo.optDSMI_DIR/opt/tivoli/tsm/client/ba/bin DSMI_LOG/opt/tivoli/tsm/client/oracle/bin TDPO_NODEoracle11g TDPO_PSWDPATH/opt/tivoli/tsm/client/oracle/binTDPO_NODE 必须和 dsm.sys 的 NODENAME 一致TDPO_PSWDPATH 指向存放加密密码的目录权限建议 chmod 700这个目录泄漏等于备份密码泄漏。DSMI_DIR 指向 BA 客户端的 bin 目录Rman 的 sbt 通道加载 libtdpo.so 依赖这个路径写错的表现通常是 Rman 报找不到介质管理库。4.3 手工发起备份Rman 调用 TSM 通道的完整命令序列配置完成后第一次备份建议手工发起便于观察每步输出rman target / RMAN allocate channel c1 type sbt_tape parms ENV(TDPO_OPTFILE/opt/tivoli/tsm/client/oracle/bin/tdpo.opt); RMAN backup database plus archivelog delete input; RMAN release channel c1;sbt_tape通道告诉 Rman 把备份写到磁带上实际驱动层由 TDPO 接管parms 里的 ENV 指定 tdpo.opt 路径每次 allocate 都要带。backup database plus archivelog delete input把数据文件和归档日志一起备份delete input 表示备份成功后删除本地归档是控制归档目录不爆盘的关键。备份过程中在 TSM 服务端执行q process和q node oracle11g能看到当前会话、数据量和最后备份时间。DB2 9.7 的备份走的是同一套带库在 db2 客户端安装 TSM 备份模块后节点名换成 db2 自己的节点备份命令输出到 TSM 通道。TSM 按节点隔离数据不会和 Oracle 备份混在一起。4.4 避坑Rman 走 TSM 通道的常见报错现象一Rman 报 ORA-27206附带 TSM 返回字节错误或介质管理库加载失败。原因tdpo.opt 路径写错或 DSMI_DIR 指向目录里没有 libtdpo.so。解决确认 tdpo.opt 文件存在ldd 检查依赖库完整重点看 libdsi 和 libtdpo 是否被正确找到。现象二备份报 ANS2017 访问拒绝。原因dsm.sys 的 NODENAME 与 TSM 服务端注册的节点名不一致或密码没同步。解决核对节点名大小写服务端reset node重置密码客户端删除本地密码文件后重新dsmc q node生成。现象三备份过程中频繁出现磁带写满等待换带。原因Mhvtl 默认磁带容量只有 500M备份集稍大就写满。解决在 Mhvtl 机器上改/etc/mhvtl/mhvtl.conf的 CAPACITY改为 2046 后删旧磁带重启服务TSM 端重新 label。现象四Rman 分配通道报 RMAN-03009: failure of allocate command。原因TDPO 客户端无权限访问存储池或 copygroup 的 dest 指向不存在的存储池。解决TSM 管理端q auth检查节点授权确认 VTLIB_POOL 状态为 ON。5. 基于 TSM 的 Oracle 异机恢复备份换台机器照样跑异机恢复是备份环境真正价值的验证原库没了拿备份到另一台机器重建。TSM 的备份集都躺在带库里目标机能连上 TSM理论上可以恢复到任意有备份的时间点。以下恢复目标机是 192.168.81.12装 Oracle 11g 同版本。5.1 异机恢复准备确认备份和调整授权目标机装好 Oracle 和 TSM 客户端、TDPO 后先确认原节点的备份状态q node oracle11g q content stgpool VTLIB_POOLq content 列出存储池里的备份集重点确认有 Oracle 数据文件备份和归档日志备份缺归档的话恢复只能到备份点不能做不完全恢复。确认无误后调整授权原文的做法是让目标机沿用原节点身份TSM 管理端执行reset node oracle11greset node 重置节点密码然后目标机 dsm.sys 里 NODENAME 保持 oracle11g密码和新的一致。这样 Rman 恢复时查询到的是该节点名下的全部备份不需要额外的卷授权。恢复前还要创建必要的目录结构mkdir -p $ORACLE_BASE/oradata/orcl mkdir -p $ORACLE_BASE/flash_recovery_area mkdir -p $ORACLE_HOME/dbs chown -R oracle:oinstall $ORACLE_BASE目录不建全restore 数据文件时 Rman 会报目录不存在或权限不足。路径要和备份时原库的目录结构对应不一致就用set newname做路径映射。原文 5.2 里创建异机恢复必要目录指的就是这一步很多人跳过它直接 restore结果在最后一步打开数据库时翻车。5.2 恢复顺序先 Spfile 再控制文件这一步是整篇测试里翻车率最高的环节。Rman 恢复顺序必须是spfile、控制文件、数据文件、归档日志。顺序反了会出各种奇怪问题比如先 restore controlfile在 nomount 状态下控制文件无法覆盖直接报文件已存在或无法创建。RMAN startup nomount; RMAN restore spfile from auto; RMAN restore controlfile from auto; RMAN alter database mount;startup nomount 启动实例但不加载控制文件为恢复控制文件留出空间。restore spfile from auto让 Rman 自动从最近的备份集恢复 spfile 到$ORACLE_HOME/dbs恢复后实例参数直接从备份参数文件读取。restore controlfile 成功后才能alter database mountmount 让 Rman 读取控制文件里的数据文件记录后续 restore database 才有依据。注意目标机如果之前已经跑过数据库$ORACLE_HOME/dbs下可能有残留的 spfile 或控制文件restore 会报文件已存在。解决先把残留文件改名备份再执行 restore压根不存在的空库反而最省事。5.3 恢复数据文件和归档日志restore 与 recover 的分工mount 后执行RMAN restore database; RMAN restore archivelog all; RMAN recover database;restore database 根据控制文件记录把数据文件逐个从 TSM 备份集恢复到目标机数据目录这一步耗时取决于 iSCSI 链路吞吐和备份集大小。restore archivelog all 把归档日志全部恢复必须在 recover 之前完成因为 recover 要从归档里取增量数据做介质恢复。如果原环境备份时用了plus archivelog归档备份通常和数据文件备份在同一个带库卷组里恢复速度较快。recover 阶段 Rman 会自动应用归档日志和当前联机日志输出media recovery complete才算走完介质恢复。如果中间报缺日志去 TSM 端用q content看归档备份是否完整缺了就只能接受恢复到上一个完整备份点。5.4 打开数据库并确认状态resetlogs 之后才算成功RMAN alter database open resetlogs;resetlogs 是恢复后打开数据库的必经步骤日志序列号从备份点重新开始不执行这一步数据库永远停在 recover 状态。打开后做基础验证RMAN select count(*) from dba_data_files; RMAN select status from v$instance;dba_data_files 数量与原库一致实例状态显示 OPEN异机恢复链路就算完全打通。DB2 9.7 的异机恢复思路相同命令换成db2 restore databaseTSM 作为备份目标照旧区别只在 DB2 侧的前置目录和实例配置。6. 装完怎么验证一个脚本跑完备份—恢复闭环备份环境搭完最容易犯的错误是装完就完事从来不回头验证。备份系统不验证等于白装等真出事才发现磁带没写进去比没装更耽误事。我后来养成的习惯是每搭好一套 TSM Mhvtl都在测试机上跑一遍完整闭环。验证分三层。第一层看 TSM 视角备份卷在不在带库里q volume VTLIB_POOL正常会看到多卷磁带处于 Filling 或 Full 状态。第二层看 Rman 视角RMAN list backup of database; RMAN list backup of archivelog all;能列出 backup piece 和完整归档时间段说明备份确定落到了带库。第三层是破坏性验证把原实例关闭模拟库丢失再按第 5 章的流程在另一台机器上恢复到打开。这个动作很多人不敢做但虚拟带库环境下成本极低删掉重来不过几分钟。我常用一个脚本把备份和状态确认串起来#!/bin/bash rman target / EOF allocate channel c1 type sbt_tape parms ENV(TDPO_OPTFILE/opt/tivoli/tsm/client/oracle/bin/tdpo.opt); backup database plus archivelog delete input; release channel c1; exit; EOF dsmc q archive | tail -20rman 块负责备份dsmc q archive 负责确认最近备份集是否上传成功。dsmc 输出为空或报错整个脚本立即算失败不用等恢复阶段才发现问题。从那以后我每次搭完备份环境都强制把这个闭环脚本在测试机上完整跑一遍看到open resetlogs成功才敢交付给后续使用的人希望帮到你。本文还有配套的精品资源点击获取