ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

无物理带库也能练TSM备份恢复:Mhvtl虚拟带库实战Oracle与DB2

无物理带库也能练TSM备份恢复:Mhvtl虚拟带库实战Oracle与DB2

简介:这份文档面向企业级备份运维人员与存储工程师,聚焦 TSM 6.3 在 Linux 环境下结合 Mhvtl 虚拟带库完成 Oracle、DB2 备份与恢复的完整测试流程,适合需要搭建实验环境或验证灾备方案的中高级技术人员参考。资源包共 1 个 docx 文件,约 1.83MB,内容按四大模块组织:Mhvtl 虚拟带库的编译安装与带库可用性测试、基于 tgt 的 iSCSI 映射配置、TSM 主服务器安装与存储设备、卷及备份策略配置,以及基于 TSM 的 Oracle 备份和异机恢复实操,涵盖 NUB 客户端配置、Rman 与 TSM 命令恢复 Spfile、控制文件、数据文件及归档日志等关键环节。文档目录层级清晰,步骤与命令记录较完整,可作为虚拟带库与 TSM 联调的对照手册,也便于读者理解异机恢复的授权文件调整与恢复顺序。目前已有 242 人学习下载,适合用作备份恢复实验与排错思路的参考材料。

1. 没有真带库怎么练 TSM 备份恢复:一套能跑通 Oracle 与 DB2 的虚拟带库实验环境

手上没有物理磁带库,却要验证 TSM 的备份恢复链路,这是很多做数据保护的工程师绕不开的坎。这份文档给了一条务实路径:用 Mhvtl 在 Linux 上模拟出 STK L700 机械手和 IBM LTO 驱动器,再通过 iSCSI 把带库映射给 TSM 服务器,最后在 Oracle 11g 和 DB2 9.7 两个客户端上完成备份与异机恢复。整套环境跑在 CentOS 6.6 虚拟机上,四台机器分工明确——TSM 主服务器、Mhvtl 虚拟带库、Oracle 客户端、DB2 客户端。它适合需要动手验证 TSM 策略、又不想申请硬件资源的从业者,也适合准备备份恢复演练但缺少实验环境的人。下面按搭建顺序拆开讲,重点放在参数怎么设、命令为什么这么写、哪一步最容易翻车。

2. Mhvtl 虚拟带库搭建:从编译安装到 iSCSI 映射的完整链路

Mhvtl 的价值在于它把磁带库的 SCSI 行为在 Linux 内核层模拟出来,上层备份软件看到的就是一台标准带库,不需要改任何备份逻辑。文档里选的是 STK L700 机械手加 IBM ULT3580-TD5/TD4 驱动器组合,这个组合在 TSM 兼容性列表里比较稳。整个搭建分三段:本机编译安装并验证带库可用、配置 iSCSI 目标端把带库暴露出去、备份服务器作为发起端挂载。

2.1 安装前准备与依赖包选择

Mhvtl 编译依赖内核头文件和 SCSI 工具链,缺一个都会在 make 阶段报错。文档里用 yum 一次性装齐,注意kernel-devel和kernel-headers版本必须和当前运行内核一致,否则编译出的内核模块加载不上。

# 安装编译与 SCSI 操作依赖 yum install lsscsi mt-st mtx zlib-devel sg3_utils zlib \ kernel-devel kernel-headers gcc # 创建专用运行用户,避免用 root 跑带库进程 useradd vtl passwd vtl # 两个关键目录:配置路径与虚拟磁带数据存储路径 mkdir /opt/mhvtl mkdir /etc/mhvtl chown -Rf vtl:vtl /opt/mhvtl chown -Rf vtl:vtl /etc/mhvtl

这里kernel-devel的版本匹配是第一个容易忽略的点。uname -r看到的版本如果和 yum 装上的kernel-devel差一个小版本,make能过但insmod会报invalid module format。我一般会先uname -r确认,再用yum install kernel-devel-$(uname -r)精确指定。目录权限也必须给 vtl 用户,后面服务以该用户启动,写不了/etc/mhvtl就会在启动时反复重建默认配置文件。

2.2 编译安装与服务启动

文档用的是源码包加工具 rpm 的组合:先装mhvtl-utils提供mtx、lsscsi等管理工具,再解压源码编译内核模块。

# 先装管理工具包 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

首次启动时服务会提示找不到library_contents.10和library_contents.30,自动生成默认配置。这是正常现象,说明机械手和驱动器定义已经落盘。启动后用lsscsi -g确认设备节点,输出里应该能看到mediumx STK L700对应/dev/sch0和/dev/sg10,以及多个tape IBM ULT3580-TD5对应/dev/st0到/dev/st3。-g参数的作用是同时显示通用 SCSI 节点,机械手操作走/dev/sg*,数据读写走/dev/st*,两者不能混。

磁带默认容量只有 500MB,做 Oracle 全备肯定不够。改/etc/mhvtl/mhvtl.conf里的CAPACITY参数,文档改成 2046,即每盘约 2GB。这个值按实验数据量估算,太小会导致备份中途换带频繁,太大则单盘写入时间长、测试周期拉长。改完必须重启 mhvtl 服务才生效。

2.3 用 mtx 验证机械手与磁带读写

带库能不能用,两步验证:机械手能不能把带子装进驱动器,驱动器能不能读写。先看机械手状态:

# 查看 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

status输出里Storage Element是槽位,Data Transfer Element是驱动器,Full :VolumeTag=E01001L4表示该槽有带且带标为 E01001L4。load 1 0的两个参数分别是源槽位和目标驱动器编号,装带成功后驱动器条目会变成Full (Storage Element 1 Loaded)。如果load报Drive not ready,多半是 mhvtl 服务没起或内核模块没加载,先lsmod | grep mhvtl确认。

装带后用 tar 做一次裸写读测试,绕开备份软件直接验证驱动器:

# 向驱动器写入 /boot 目录内容 tar -cvf /dev/st0 /boot # 回读校验 tar -tvf /dev/st0

能列出文件列表就说明虚拟磁带读写通路正常。这一步别省,我见过机械手状态正常但驱动器写不进去的情况,原因是mhvtl.conf里驱动器类型和library_contents定义不一致,提前用 tar 测能把这个坑挡在 TSM 配置之前。

2.4 iSCSI 目标端配置与客户端挂载

带库在本机可用之后,要通过 iSCSI 暴露给 TSM 服务器。文档用 tgt 做目标端,把机械手和驱动器分别映射成 LUN。

# 安装 iSCSI 目标端软件 yum install scsi-target-utils # 编辑 /etc/tgt/targets.conf,加入带库映射 # <target iqn.2024-01.local.mhvtl:l700> # backing-store /dev/sg10 # backing-store /dev/st0 # backing-store /dev/st1 # backing-store /dev/st2 # backing-store /dev/st3 # </target> service tgtd start chkconfig tgtd on tgtadm --mode target --op show

backing-store直接指向 SCSI 通用节点和磁带节点,tgt 会把它们透传给发起端。tgtadm --op show能看到 target 下挂载的 LUN 列表,机械手和四个驱动器各占一个 LUN。备份服务器端装iscsi-initiator-utils,用iscsiadm发现并登录:

# 发现目标端 iscsiadm -m discovery -t sendtargets -p 192.168.81.6 # 登录 iscsiadm -m node -T iqn.2024-01.local.mhvtl:l700 -l # 确认新设备 lsscsi -g

登录成功后备份服务器上会多出对应的/dev/sg*和/dev/st*,TSM 配置存储设备时就用这些节点。这里有个边界:iSCSI 映射的带库在 TSM 里识别为远程设备,mtx操作要在备份服务器本地执行,不能回到带库机器上操作,否则两边状态不同步。

3. TSM 6.3 服务端配置:存储设备、卷与策略的落地顺序

TSM 服务端配置有一条隐含顺序:先定义设备类,再定义机械手和驱动器路径,然后定义卷并检入,最后才写策略域和副本组。顺序错了会在checkin或label阶段报设备不可用。文档里主服务器是 CentOS 6.6 加 TSM 6.3.5,管理界面用dsmadmc。

3.1 设备类与机械手、驱动器定义

设备类决定磁带格式和容量估算,必须和 Mhvtl 模拟的驱动器类型对上。文档用 LTO5 驱动器,设备类就选LTO5。

/* 定义 LTO5 设备类,格式为 256 字节块 */ DEFINE DEVCLASS VTL_LTO5 DEVTYPE=LTO FORMAT=DRIVE \ ESTCAPACITY=1.5G MOUNTLIMIT=4 MOUNTWAIT=60 MOUNTRETENTION=1 /* 定义机械手,设备类型为 SCSI 库 */ DEFINE LIBRARY VTL_LIB LIBTYPE=SCSI /* 定义机械手路径,指向 iSCSI 映射过来的 sg 节点 */ DEFINE PATH TSM_SERVER VTL_LIB SRCTYPE=SERVER \ DESTTYPE=LIBRARY DEVICE=/dev/sg10 ONLINE=YES /* 定义四个驱动器 */ DEFINE DRIVE VTL_LIB DRV0 DEVICE=/dev/st0 ONLINE=YES DEFINE DRIVE VTL_LIB DRV1 DEVICE=/dev/st1 ONLINE=YES DEFINE DRIVE VTL_LIB DRV2 DEVICE=/dev/st2 ONLINE=YES DEFINE DRIVE VTL_LIB DRV3 DEVICE=/dev/st3 ONLINE=YES /* 为每个驱动器定义路径 */ DEFINE PATH TSM_SERVER DRV0 SRCTYPE=SERVER DESTTYPE=DRIVE \ LIBRARY=VTL_LIB DEVICE=/dev/st0 ONLINE=YES

ESTCAPACITY是估算容量,设成 1.5G 是为了让 TSM 按实际 2G 磁带的可用空间规划,留一点余量避免写满换带。MOUNTLIMIT=4对应四个驱动器,超过这个数的并发挂载会排队。DEFINE PATH里SRCTYPE=SERVER表示路径由服务器自身发起,DEVICE必须和lsscsi -g看到的节点一致。四个驱动器路径都要单独定义,漏一个该驱动器就不会被 TSM 调度。

3.2 卷定义与检入

卷是磁带的逻辑标识,Mhvtl 里每盘带已有 VolumeTag,TSM 侧要定义同名卷并检入。

/* 定义卷,名称与 Mhvtl 带标一致 */ DEFINE VOLUME E01001L4 ACCESS=READWRITE DEFINE VOLUME E01002L4 ACCESS=READWRITE /* 检入机械手,指定卷所在槽位 */ CHECKIN LIBVOLUME VTL_LIB SEARCH=BULK STATUS=SCRATCH CHECKLABEL=YES

CHECKIN的SEARCH=BULK表示扫描整个带库,STATUS=SCRATCH把空带标记为可写临时卷,CHECKLABEL=YES会读取带标并和已定义卷匹配。如果带标和DEFINE VOLUME名称对不上,检入会失败并提示volume not defined。我一般先DEFINE VOLUME再检入,顺序反过来也能用CHECKLABEL=BARCODE自动建卷,但名称规则不好控。

3.3 策略域、副本组与文件系统备份

策略域决定备份保留版本和存放位置。文档配了本地磁盘和带库两个副本组,先落盘再迁带,这是常见做法,避免小文件直接写带导致换带频繁。

/* 定义策略域,默认管理类 */ DEFINE DOMAIN FS_DOMAIN DEFINE POLICYSET FS_DOMAIN STANDARD DEFINE MGMTCLASS FS_DOMAIN STANDARD STANDARD /* 定义副本组:磁盘池与带库池 */ DEFINE COPYGROUP FS_DOMAIN STANDARD STANDARD STANDARD \ TYPE=BACKUP DESTINATION=DISKPOOL VERE=3 VERD=2 RETEXTRA=30 /* 注册客户端节点 */ REGISTER NODE ORACLE_CLI oracle_pass DOMAIN=FS_DOMAIN

VERE=3保留三个版本,VERD=2保留两个删除版本,RETEXTRA=30是额外保留天数。这些参数按实验周期调,做恢复测试时版本数太少会找不到历史备份。注册节点时密码要记牢,客户端dsm.opt里要用同一个。

4. Oracle 与 DB2 客户端接入:NUB 配置与手工备份发起

客户端侧的核心是 TSM API 和数据库备份工具的对接。Oracle 走 RMAN 加libobk.so,DB2 走db2 backup加 TSM 的libtsmdb2.so。文档里 Oracle 是 11g、DB2 是 9.7,两个客户端都是 Linux 5.7。

4.1 Oracle 客户端 NUB 安装与 dsm.opt 配置

NUB 是 TSM 的备份客户端包,Oracle 侧需要其中的 API 库和dsmc命令。

# 安装 API 客户端 rpm -ivh TIVsm-API64.x86_64.rpm rpm -ivh TIVsm-BA.x86_64.rpm # 配置 dsm.opt,指向 TSM 服务器 cat > /opt/tivoli/tsm/client/ba/bin/dsm.opt <<'EOF' SERVERNAME TSM_SERVER COMMMETHOD TCPIP TCPPORT 1500 NODENAME ORACLE_CLI PASSWORDACCESS GENERATE EOF

PASSWORDACCESS GENERATE让客户端首次连接时生成加密密码存本地,后续免交互。NODENAME必须和服务端REGISTER NODE的名字一致,否则报node not registered。配完先跑dsmc query session验证连通,能列出会话再往下做。

4.2 RMAN 与 TSM 的对接配置

Oracle 侧要让 RMAN 调用 TSM 的介质管理库,通过SBT_LIBRARY指定。

# 设置环境变量 export TSM_DIR=/opt/tivoli/tsm/client/api/bin64 export LD_LIBRARY_PATH=$TSM_DIR:$LD_LIBRARY_PATH # RMAN 配置通道,指向 TSM rman target /
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS 'ENV=(DSMI_LOG=/home/oracle/tsm_log,DSMI_CONFIG=/opt/tivoli/tsm/client/ba/bin/dsm.opt,DSMI_DIR=/opt/tivoli/tsm/client/api/bin64)'; CONFIGURE CONTROLFILE AUTOBACKUP ON;

DSMI_DIR指向 API 库目录,DSMI_CONFIG指向dsm.opt,DSMI_LOG是 TSM API 日志路径,排错时先看这里。三个路径错一个,RMAN 分配通道时就会报SBT_LIBRARY not found或session not established。

4.3 手工发起 Oracle 全备与 DB2 备份

Oracle 全备用 RMAN 一条命令,DB2 用db2 backup指定 TSM 为介质。

/* Oracle 全备,含归档日志 */ BACKUP DATABASE PLUS ARCHIVELOG;
# DB2 备份到 TSM db2 backup db SAMPLE use tsm # 查看 TSM 侧会话与卷使用 dsmadmc -id=admin -pa=admin_pass "query session" dsmadmc -id=admin -pa=admin_pass "query volume"

query session能看到客户端会话状态和传输字节,query volume确认卷被占用。DB2 侧要确保db2set DB2_TSM_CONFIG指向正确的dsm.opt,否则use tsm会报介质库加载失败。备份完成后别急着做恢复,先在 TSM 里query backup确认对象已入库。

5. 异机恢复与排错:Oracle 控制文件、DB2 重定向与五个高频坑

恢复才是这套环境真正的验收环节。Oracle 异机恢复的关键是拿到备份时的控制文件和 spfile,DB2 则是重定向恢复加日志前滚。文档里 Oracle 恢复走了恢复 spfile、恢复控制文件、mount、恢复数据文件、open 五步,DB2 走重定向到新实例。

5.1 Oracle 异机恢复的五个步骤

异机恢复前先在新机器上装好同版本 Oracle 和 NUB 客户端,dsm.opt里NODENAME改成原节点名,服务端要授权该节点访问原备份。

/* 启动到 nomount,从备份恢复 spfile */ STARTUP NOMOUNT; RESTORE SPFILE FROM AUTOBACKUP; /* 用恢复的 spfile 重启到 nomount,恢复控制文件 */ STARTUP FORCE NOMOUNT; RESTORE CONTROLFILE FROM AUTOBACKUP; ALTER DATABASE MOUNT; /* 恢复数据文件和归档日志 */ RESTORE DATABASE; RECOVER DATABASE; /* 打开数据库 */ ALTER DATABASE OPEN RESETLOGS;

RESTORE SPFILE FROM AUTOBACKUP依赖控制文件自动备份已开启,且DBID能对上。如果报no backup found,用SET DBID=<原库DBID>显式指定。OPEN RESETLOGS是异机恢复必须的,因为恢复后的 incarnations 和原库不同。恢复过程中 TSM 侧用query session看数据流是否在走,卡住多半是卷没检入或驱动器路径离线。

5.2 DB2 重定向恢复要点

DB2 异机恢复用redirect加restore ... into改路径,再rollforward到日志末尾。

# 重定向恢复,生成重定向脚本 db2 restore db SAMPLE from tsm taken at 20240115120000 \ into NEWSAMPLE redirect generate script redirect.sql # 执行重定向脚本后前滚 db2 rollforward db NEWSAMPLE to end of logs and complete

taken at的时间戳必须和db2 list history backup里的一致,差一秒都找不到备份映像。generate script会输出一份带SET TABLESPACE CONTAINERS的脚本,改好表空间路径再执行,直接restore into不改路径会因容器不存在失败。

5.3 五个高频坑:现象、原因与解决

坑一:Mhvtl 服务启动后lsscsi -g看不到机械手。现象是只有tape没有mediumx。原因是内核模块没加载或library_contents定义被改坏。解决:lsmod | grep mhvtl确认模块,删掉/etc/mhvtl/library_contents.*让服务重建默认配置再启动。

坑二:TSMCHECKIN报volume not defined。现象是检入中断。原因是 Mhvtl 带标和DEFINE VOLUME名称大小写或前缀不一致。解决:mtx -f /dev/sg10 status抄下VolumeTag原样定义,或用CHECKLABEL=BARCODE让 TSM 自动建卷。

坑三:RMAN 分配通道报SBT_LIBRARY找不到。现象是ORA-27211。原因是DSMI_DIR指向了 32 位库目录或路径拼写错。解决:确认libobk.so在api/bin64下,LD_LIBRARY_PATH包含该目录,PARMS里三个DSMI_*路径逐个核对。

坑四:Oracle 异机恢复RESTORE SPFILE报无备份。现象是RMAN-06026。原因是新库DBID和备份库不同,自动备份按DBID找。解决:SET DBID=<原库DBID>后再恢复,DBID从原库v$database或备份日志里取。

坑五:DB2use tsm报介质库加载失败。现象是SQL2071N。原因是db2set DB2_TSM_CONFIG没指向dsm.opt或该文件权限不对。解决:db2set DB2_TSM_CONFIG=/opt/tivoli/tsm/client/ba/bin/dsm.opt,确保 db2 实例用户可读,重启实例生效。

6. 把实验环境变成可复用验证模板:参数固化与恢复演练的固定动作

这套环境跑通一次不算完,真正省时间的是把它固化成可重复的验证模板。我后来的做法是:Mhvtl 的library_contents和mhvtl.conf单独备份一份,TSM 侧把DEFINE DEVCLASS、DEFINE LIBRARY、DEFINE PATH、DEFINE DRIVE写成宏脚本,每次重建环境直接dsmadmc -in macro.txt跑一遍,避免手敲漏驱动器。卷定义也做成循环,按带标前缀批量生成。

恢复演练要固定动作顺序,我一般按下面这张表走,每步都有明确的通过标准:

步骤操作通过标准
1dsmc query session客户端会话建立
2q backup查对象备份对象存在且大小合理
3q volume查卷卷状态为Filling或Full
4异机恢复 spfile/控制文件RMAN 无报错
5RECOVER DATABASE归档日志应用完整
6OPEN RESETLOGS数据库可读写

参数固化上,ESTCAPACITY和CAPACITY要联动改:Mhvtl 侧改大容量,TSM 设备类ESTCAPACITY也要跟着调,否则 TSM 按旧容量规划会在磁带没写满时就换带,白白浪费槽位。这个联动关系文档里没明说,是我踩过一次“备份提前换带”之后才记住的。

还有一个习惯:每次改完dsm.opt或 TSM 设备定义,先跑一次小数据量备份加恢复,确认链路通再上全量。全量恢复失败重来的时间成本太高,小数据量验证能把配置类问题挡在前面。从那以后我每次搭这类实验环境,都强制先走一遍“小备份—小恢复—查日志”的闭环,再动真实数据。希望帮到你。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进