简介:资源包内含一份docx格式技术文档,大小约1.83MB,围绕TSM 6.3 Linux、Mhvtl、Oracle与DB2的备份恢复测试展开。内容面向系统运维、备份管理员及数据库DBA,适合在企业级备份恢复方案验证或项目实施前参考。文档以CentOS 6.5为实验平台,第一部分介绍Mhvtl虚拟带库软件,包括在Linux下编译安装、配置以及带库可用性测试;第二部分讲解TSM主服务器安装配置,包括存储设备定义、卷配置、备份策略创建并执行备份。第三部分是基于TSM的Oracle备份,从客户端环境准备、NUB客户端安装到服务器端配置,再到手工发起备份。第四部分为Oracle异机恢复,涉及环境准备、修改TSM授权文件,并通过RMAN和TSM命令依次恢复Spfile、控制文件、数据文件、归档日志,最后打开数据库。整份文档操作步骤完整,命令具体,可帮助读者搭建一套可运行的TSM加Mhvtl备份恢复测试环境,掌握虚拟带库与TSM配合完成数据库备份恢复的关键方法。目前已有241人学习,适合需要落地同类备份方案的工程师。
1. 这套备份恢复测试在解决什么问题
把标题拆开看,这是一个典型的“没有物理磁带库,也要把备份链路完整落地”的测试场景。TSM 6.3 是服务端,Mhvtl 是跑在 Linux 上的虚拟磁带库,Oracle 和 DB2 是真正要被保护的数据库。对绝大多数备份运维人员来说,手头不一定有带库真机,但项目验收、方案交付又必须证明备份能写进去、能读出来、数据库能恢复。这套组合解决的问题就是:用一台普通 Linux 服务器模拟真实带库行为,让 TSM 6.3 认认真真走完从服务端、存储池、策略,到 Oracle RMAN/DB2 备份调度和恢复演练的完整闭环,而且结果可以拿给项目方看。适合谁?正在做备份方案选型测试、需要输出测试报告、或者想搞懂 TSM 与数据库备份机制的人。
2. 用 Mhvtl 在 Linux 上搭一套虚拟磁带库:最小可跑环境
2.1 为什么数据库备份测试要用虚拟磁带库而不是直接写磁盘路径
很多刚接触 TSM 的人会问:反正都是存文件,为什么不能让 TSM 直接把备份写到普通目录?原因在于 TSM 6.3 的备份域模型里,“磁带库”是一个带设备语义的对象。数据库客户端通过 SBT(System Backup to Tape)接口和带库驱动打交道,驱动会向 TSM 请求挂载一卷磁带、定位到特定位置,如果底层没有真正的磁带设备语义,RMAN 和 DB2 的备份通道根本拉不起来。Mhvtl 做的就是把这层语义模拟出来:它把文件按卷组织,通过 SCSI 命令仿真让上层以为自己在操作一台 LTO 带库。备份数据最终落在 Linux 文件系统里,但协议栈上的体验与真实带库一致。
我一般会在 CentOS 或 Ubuntu 服务器上装 Mhvtl,原因很简单:它不需要额外硬件,普通 KVM 虚机也能跑,而且支持多驱动器、多槽位,足够模拟出测试所需的带库拓扑。更重要的一点,Mhvtl 能让你反复做恢复测试而不心疼磁带。真实带库的驱动器寿命是有限资源,虚拟环境下随便折腾,出问题随时清掉重来,这本身就是测试环境最大的价值。
2.2 安装 Mhvtl 并验证设备是否被系统识别
以常见发行版为例,安装 Mhvtl 需要先确认系统里有 sg3_utils 和 lsscsi,这两个工具负责底层 SCSI 设备的管理与查看。编译安装完成后,配置集中在 /etc/mhvtl/device.conf,它描述了一台虚拟带库里有几个驱动器、多大容量、什么类型。下面是一个最小配置:
# /etc/mhvtl/device.conf # VTL: 虚拟带库标识 VTL 1 # 第一个驱动器,模拟 LTO-5,容量单位是 MB DRIVE 1 LTO5 400000 # 槽位定义,给 TSM 提供可用的空带 SLOT 1 40配置的含义:VTL 1 表示创建一台虚拟带库;DRIVE 1 LTO5 400000 表示第一个驱动器的类型是 LTO-5、容量按 400 GB 模拟;SLOT 1 40 表示 40 个槽位。改完配置后重启 mhvtl 服务,再用 lsscsi 确认系统是否识别出新的磁带设备:
systemctl restart mhvtl lsscsi -g | grep -E "tape|mediumx"如果看到类似 /dev/sgX 和 /dev/stX 的设备节点输出,说明 Mhvtl 已经把虚拟带库暴露给了操作系统。注意:我强调在配置 TSM 之前必须先确认设备节点,因为 Mhvtl 在重启后设备号可能变化,这块如果不做前置检查,后面 TSM 定义路径时很容易踩坑。
2.3 给虚拟带库装磁带并确认机械臂可用
带库只有驱动器还不够,TSM 做备份调度时需要一个“机械臂”来抓取磁带放入驱动器,这个动作在 Mhvtl 里由虚拟的 medium changer 承担。启动服务后可以用 mtx 工具测试机械臂动作是否正常:
mtx -f /dev/sg5 status mtx -f /dev/sg5 load 1 1 mtx -f /dev/sg5 unload 1 1先看 status 是否列出了 40 个槽位和驱动器;然后执行 load 1 1,意思是把 1 号槽位的磁带装载进 1 号驱动器;再 unload。能成功执行这两步,说明机械臂通路正常。这一步很容易被跳过,但它是 TSM 定义路径之前必须确认的底层能力,如果这里失败,后面 TSM 里的 checkout/checkin 全都会报设备忙或未就绪。我遇到过一上来就配 TSM、结果所有命令都卡在挂载阶段的情况,回头排查才发现是 Mhvtl 的 changer 设备没加载对。
3. TSM 6.3 服务端初始化:从设备定义到策略绑定
3.1 初始化 TSM 实例与管理员账号
Mhvtl 环境就绪后,开始安装 TSM 6.3 服务端。安装完成后第一步是初始化实例,用 dsmserv 命令创建数据库和日志卷。TSM 服务端的元数据本身存放在 TSM 的数据库里,这个数据库也需要分配存储空间。常见做法是单独给 TSM 数据库卷一个目录,避免和备份数据混在一起:
mkdir -p /tsmdata/db /tsmdata/log dsmserv format -data /tsmdata/db/tsmdb.vol -log /tsmdata/log/tsmlog.vol dsmservformat 命令创建了 TSM 数据库卷和日志卷,dsmserv 启动服务端进程。首次启动后,需要用 dsmadmc 进入管理命令行,创建管理员 ID 并设置密码:
dsmadmc -seid=admin -password=admin grant authority admin sysadmin这里 -seid 和 -password 的默认值在安装文档里都有,生产环境务必改成强密码。grant authority 把系统管理员权限授予该用户。TSM 6.3 的管理逻辑是:管理员登录后,所有后续操作都在 dsmadmc 命令行里完成。我一般把这一步称为“服务端的户口本”,后面的设备、存储池、策略全部登记在这个实例下。
3.2 定义磁带库、路径与驱动器
TSM 服务端不会自动发现 Mhvtl 的设备,必须手动定义。注意设备号要以上一步 lsscsi 查到的为准,Mhvtl 重启后这个号会变,这也是整个测试流程里最容易翻车的环节。下面是一组完整的定义命令:
# 定义磁带库,类型为 SCSI define library MHVTL_LIB librarytype=SCSI # 定义服务端到库控制器的路径 define path TSM_SERVER MHVTL_LIB srct=server destt=library device=/dev/sg5 online # 定义驱动器 define drive MHVTL_LIB DRIVE01 # 定义路径的驱动器部分 define path TSM_SERVER DRIVE01 srct=server destt=drive library=MHVTL_LIB device=/dev/sg6 onlinedefine library 的 librarytype=SCSI 表示这是一台通过 SCSI 控制的带库,对应 Mhvtl 暴露的 medium changer 设备。define path 是告诉 TSM 服务端通过哪个设备节点访问库控制器和驱动器。DRIVE01 是驱动器在 TSM 侧的逻辑名,可以和 Mhvtl 的驱动器编号不对应,但路径必须指对。最后可以用 q path 和 q drive 查看定义是否生效:
q path q drive运行后如果状态显示 ONLINE,说明服务端已经能访问虚拟带库的机械臂和驱动器。这里有个细节:TSM 服务端主机名 TSM_SERVER 要和你当前服务器的主机名一致,很多人在这里顺手写错,结果路径定义总是报错。
3.3 定义设备类、存储池与策略域
设备类决定备份卷的写入格式,存储池是 TSM 管理物理卷的容器,策略域决定备份保留多久。三者缺一不可,顺序通常是先设备类再存储池最后策略。用下面一组命令完成:
# 定义设备类,指向库并指定格式 define devclass MHVTL_CLS devtype=LTO library=MHVTL_LIB # 定义存储池,绑定设备类 define stgpool VTLPOOL MHVTL_CLS maxscratch=50 # 定义策略域与管理类 define domain BACKUP_DOM define mgmtclass BACKUP_DOM STANDARD_MC # 绑定管理类到存储池 define copygroup BACKUP_DOM STANDARD_MC STANDARDdevclass 里的 devtype=LTO 要和 Mhvtl 模拟的 LTO-5 匹配,TSM 6.3 支持直接识别 LTO 类型。VTLPOOL 创建时 maxscratch=50 意思是允许存储池动态创建最多 50 卷临时磁带,这个参数太小时备份会在高峰期因为无可用卷而失败。管理类 BACKUP_DOM 下的 copygroup 里,需要定义备份数据的保留策略:
# 在 copygroup 里定义数据保留版本与时间 update copygroup BACKUP_DOM STANDARD_MC STANDARD verexists=7 verdeleted=2 retextra=1verexists=7 表示每个文件保留 7 个版本,verdeleted=2 表示文件被删除后再保留 2 个版本,retextra=1 表示归档类数据额外保留 1 份。这个参数组合是我做测试常用的保守值:既能让恢复测试有足够版本可选,又不会让虚拟磁带库被历史版本塞满。
3.4 注册数据库节点并测试一次手工备份
TSM 的服务端配置最终要落到“谁来备份”的问题上。Oracle 和 DB2 在 TSM 里都以节点的身份出现,节点名需要和数据库客户端配置完全一致。注册两个节点的命令如下:
register node ORACLE_NODE orapass register node DB2_NODE db2pass密码是客户端连接时用的,测试环境可以简单些,生产环境必须用加密传输和复杂密码。节点注册后就可以通过 TSM 的命令行发起一次手工备份验证,最直观的方式是备份 TSM 自身的数据库:
backup db q processbackup db 会把 TSM 元数据写入 VTLPOOL,q process 可以观察当前有没有活动进程。我建议第一次跑到这里就停下来,先确认 TSM 自身能备份成功,再继续配置数据库客户端。这样排查问题时就能划定边界:TSM 链路有问题还是数据库客户端配置有问题。
4. Oracle 与 DB2 备份恢复测试:两套通道,同一套验证逻辑
4.1 Oracle 侧安装 TSM 客户端并配置 tdpo.opt
Oracle 备份走的是 SBT 接口,TSM 6.3 时代对应的组件是 TDP for Oracle。安装完成后,配置集中在 dsm.sys 和 tdpo.opt 两个文件。dsm.sys 描述服务端连接信息,tdpo.opt 描述备份节点的可选参数。下面是一个典型的配置:
# /opt/tivoli/tsm/client/oracle/bin/tdpo.opt TDPO_NODE ORACLE_NODE TDPO_PSWDPATH /opt/tivoli/tsm/client/oracle/bin TDPO_MGMTCLASS STANDARD_MC TDPO_DATAFORMAT 2TDPO_NODE 必须和 TSM 服务端注册的节点名一致,TDPO_PSWDPATH 指定保存密码文件的位置,TDPO_MGMTCLASS 指定备份写入哪个管理类。TDPO_DATAFORMAT 2 使用 TSM 的专有格式,恢复时只能通过 TSM 读取。设置好之后,用 dsmc 命令测试连通性:
dsmc -seid=ORACLE_NODE -password=orapass q nodename能查询到节点信息说明客户端与服务端的握手成功。这一步不通,后面 RMAN 里 100% 报 SBT 通道初始化失败。
4.2 用 RMAN 发起 Oracle 备份与恢复验证
连通性确认后,RMAN 侧只需要分配一个 SBT 通道。备份脚本如下:
rman target / run { allocate channel ch1 type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin/tdpo.opt)'; backup database plus archivelog; release channel ch1; }allocate channel 里的 sbt_tape 是固定写法,关键在于 ENV 参数必须指向 tdpo.opt 的绝对路径。RMAN 启动时会把控制文件里记录的备份信息与 TSM 的卷对应起来。备份完成后,用 list backup 查看备份集,然后做一次恢复验证:
rman target / run { allocate channel ch1 type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin/tdpo.opt)'; restore database; recover database; }restore 是从 TSM 卷上把数据文件读回来,recover 是应用归档日志把数据库推进到一致状态。很多团队只做备份不做恢复,这是自欺欺人。在测试环境里,我强烈建议每次备份后立刻做一次 restore 到不同目录的演练,因为“备份成功”和“能恢复”之间隔着一整条链路。
4.3 DB2 侧配置 TSM 参数并执行备份
DB2 走的是 TSM 的 API 客户端,不依赖 RMAN,配置直接在 DB2 实例参数里完成。需要设置三个参数:TSM_MGMTCLASS、TSM_NODE、TSM_OWNER。下面以 SAMPLE 库为例:
db2 update db cfg for SAMPLE using TSM_MGMTCLASS STANDARD_MC TSM_NODE DB2_NODE TSM_OWNER db2inst1TSM_OWNER 填写运行 DB2 实例的操作系统用户名,TSM 会以这个用户的身份去访问密码文件。配置完成后,发起一次备份:
db2 backup db SAMPLE use TSM db2 list history backup all for SAMPLEbackup 命令会调用 TSM 的 API 把数据库写入虚拟磁带库,list history 能看到备份映像的时间戳。DB2 的备份映像在 TSM 里是以“节点+时间戳”为标识的,后续恢复必须精确指定。
4.4 DB2 恢复验证的两种方式
DB2 恢复有两种典型场景:恢复到一个全新数据库,或恢复到原库并前滚到指定时间点。全库恢复的命令如下:
db2 restore db SAMPLE from TSM taken at 2025-01-10-12.00.00taken at 后面的时间戳来自 list history 的输出,写错一个字符就会报映像不存在。如果还有归档日志要前滚,追加 rollforward 命令:
db2 rollforward db SAMPLE to end of logs恢复测试里最常见的失败是时间戳写错、或者原库仍有连接会话导致文件被占用。习惯上我会先把应用连接断开,再执行 restore。
5. 避坑:Mhvtl、TSM 与数据库客户端之间的典型故障
5.1 现象:TSM 定义路径时提示设备不可用
Mhvtl 重启后,/dev/sg5、/dev/sg6 这类设备号经常前后对调,TSM 里定义好的路径就会指向错误的设备。
原因:Linux 对 SCSI 设备的命名取决于内核枚举顺序,Mhvtl 服务启动时机变化会改变枚举结果。
解决:不要用固定设备号,先执行 lsscsi -g 查看当前实际设备,再重新 define path。更彻底的办法是给 Mhvtl 设备写 udev 规则,根据序列号生成固定软链接,让 TSM 始终引用同一个路径。
5.2 现象:Oracle 的 RMAN 通道一直处于等待状态
分配 SBT 通道后,RMAN 长时间停在 Waiting for tape mount,没有任何报错。
原因:TSM 服务端没有可用空卷,存储池 maxscratch 设置过小,或虚拟带库里没有足够空带。
解决:用 q stgpool VTLPOOL 查看 available scratch volume 数量;如果为 0,在 TSM 里执行 checkout 把带库里的空带移入存储池,或者直接更新 maxscratch 到更大值。我习惯把 maxscratch 设到 50,Mhvtl 里预留 10 卷空带专门给测试用。
5.3 现象:DB2 备份报 TSM 密码文件认证失败
db2 backup 时提示 TSM password file 无法读取。
原因:TSM_OWNER 指定的用户和实际执行命令的操作系统用户不一致,密码文件存在了别的用户目录下。
解决:先确认执行 db2 backup 的 Linux 用户,再在 TSM 客户端执行 dsmc 生成密码文件时用同一用户。常见做法是直接切换到 db2inst1 用户登录,再执行 dsmc 初始化密码文件。
5.4 现象:恢复测试把备份卷删没了
restore 时提示备份映像的卷已被回收,TDPO 返回卷不可用。
原因:TSM 存储池启用了自动回收(reclamation),测试环境的保留期设置太短,备份数据还没过期就被回收掉了。
解决:在测试阶段把 copygroup 的 verexists 调大,并把存储池的 reclamation threshold 调高,比如设到 90,意思是卷使用率达到 90% 才触发回收。生产环境按业务要求设置,测试环境以“能反复恢复”为第一目标。
5.5 现象:Mhvtl 主机重启后 TSM 服务端连不上虚拟带库
原因:Mhvtl 服务没有设置开机自启,或者 TSM 服务端先于 Mhvtl 启动,导致驱动器和库路径全部掉线。
解决:把 mhvtl 加入 systemctl enable,在 TSM 服务启动前确认 lsscsi 输出正常。稳妥的做法是加一个监控脚本,检测到 Mhvtl 设备不存在时不自启 TSM,避免服务端在 10 分钟超时上反复重试带来的日志刷屏。
6. 把恢复测试做成日常习惯:一个可以反复执行的验证脚本
测试环境的价值在于可重复。我把整套验证固化成一个脚本,每次改完配置先跑一遍,确认链路完好再交给项目方。脚本主要检查四件事:Mhvtl 设备是否在线、TSM 存储池状态、Oracle 和 DB2 各自的备份映像时间、以及最近一次的恢复是否成功。骨架如下:
#!/bin/bash set -e # 1. 检查 Mhvtl 设备 lsscsi -g | grep -E "tape|mediumx" # 2. 检查 TSM 存储池和驱动器 dsmadmc -seid=admin -password=admin "q stgpool VTLPOOL" | grep AVAILABLE dsmadmc -seid=admin -password=admin "q drive" | grep ONLINE # 3. 检查数据库侧最近的备份映像 rman target / catalog /dev/null <<EOF list backup of database completed after 'sysdate-1'; EOF # 4. 打印 DB2 历史备份 db2 list history backup all for SAMPLE | grep "2025-"脚本里没有实际的恢复动作,它只是把“万事俱备”的状态用命令确认一遍。真正恢复验证我要求每周至少手动做一次,Oracle 恢复到一个中间目录、DB2 恢复到独立实例,而不是在原库上覆盖。这能保证一旦生产环境出问题,团队对恢复流程有肌肉记忆。
另一个实用技巧是给 TSM 启用心跳监控。在 dsmadmc 里定义 schedule,让系统每 30 分钟对 VTLPOOL 做一次一致性检查,发现卷损坏立刻告警。虚拟带库的卷本质是文件,磁盘损坏比物理磁带更难发现,定时检查比事后补救值钱得多。
我对这套环境的最终态度是:备份测试不是“跑通一次备份”就结束,而是让恢复成为习惯。没有恢复验证的备份测试文档,充其量是一份记录,不是一套可交付的能力。在这套 Mhvtl + TSM + Oracle + DB2 的框架里,把恢复演练次数做到和备份次数一样频繁,才是真正把环境用到位了。希望这些步骤和教训能帮到你。
本文还有配套的精品资源,点击获取