简介:本资源是一份面向企业级数据备份工程师与DBA的TSM 6.3实战测试文档,聚焦Linux环境下基于Mhvtl虚拟带库的Oracle/DB2生产级备份恢复全流程验证。文档覆盖Mhvtl在CentOS 6.5上的编译部署与iSCSI带库映射、TSM主服务器安装配置(含机械手/驱动器识别、卷管理、策略制定)、Oracle NBU客户端集成、以及关键的异机RMAN+TSM联合恢复(含spfile/control file/数据文件/归档日志分步还原),具备完整灾备场景闭环能力。资源为单个1.83MB的Word文档(.docx),结构清晰,含4大章节共53页详细操作步骤、命令截图说明及拓扑图示,便于按模块查阅与复现。目前已有239人学习下载,适合需落地TSM+虚拟带库方案、掌握Oracle跨平台恢复核心技能的中高级运维人员系统研习。
1. TSM6.3 + Linux + Mhvtl + Oracle/DB2:一套能跑通的备份恢复闭环,不是概念验证,是生产级可复现路径
你手头有一台 CentOS 7 或 RHEL 7 的物理机或虚拟机,装了 Oracle 11g/12c 和 DB2 11.5,现在要验证:TSM6.3 客户端能否通过 Mhvtl 模拟磁带库,在 Linux 上完成 Oracle RMAN 全备+归档备份、DB2 online backup,并实现可验证的 restore/recovery——不是“理论上可行”,而是rman restore controlfile能成功、db2 restore db sample taken at ...能执行、dsmc query volume真实列出 Mhvtl 创建的虚拟磁带卷。这套组合在 2024 年仍有大量金融、政务类客户用于灾备演练和等保测评,但网上文档碎片化严重:TSM 官方手册不讲 Mhvtl 集成细节,Mhvtl GitHub 只提“支持 TSM”,Oracle/DB2 文档默认对接物理带库。本文就是把这四层(TSM6.3 server/client、Linux 内核模块、Mhvtl 驱动、Oracle/DB2 备份接口)拧成一股绳的实操笔记。适合正在做灾备方案验证的 DBA、备份工程师、等保测评实施人员——你不需要懂 TSM 源码,但必须知道/dev/sg*设备权限怎么配、dsm.sys哪三行不能少、db2 connect to sample后db2 backup db sample online use tsm报错时该查哪个日志。
2. 搭建 TSM6.3 Server + Mhvtl 模拟带库:从内核模块加载到 TSM 识别虚拟磁带机
TSM6.3 Server 是整个备份体系的中枢,它必须能“看见”Mhvtl 创建的虚拟磁带驱动器(VTL),否则 Oracle/DB2 的备份请求根本发不出去。关键不在 TSM 版本号,而在Linux 内核兼容性与 SCSI 设备映射逻辑。TSM6.3 Server for Linux(x86_64)官方支持内核 3.10–4.18,而 Mhvtl 2.6+ 依赖scsi_mod、sg、st三个内核模块,且要求st模块启用allow_kernel_scsi参数——这是绝大多数教程漏掉的致命点。
2.1 编译安装 Mhvtl 2.6.3 并加载 SCSI 模块
Mhvtl 必须从源码编译,预编译包无法适配你的内核版本。我们以 CentOS 7.9(内核 3.10.0-1160.el7.x86_64)为例:
# 安装编译依赖(注意:不要用 yum groupinstall "Development Tools",它会装 gcc 4.8.5,但 Mhvtl 2.6.3 需要 gcc 4.9+) yum install -y kernel-devel-$(uname -r) gcc-c++ make autoconf automake libtool # 下载并解压(官方源:https://github.com/mhvtl/mhvtl) wget https://github.com/mhvtl/mhvtl/archive/refs/tags/v2.6.3.tar.gz tar -xzf v2.6.3.tar.gz && cd mhvtl-2.6.3 # 关键:修改 configure.ac,强制启用 st 模块的 allow_kernel_scsi 支持(否则 TSM 无法 open /dev/st0) sed -i '/AC_DEFINE_UNQUOTED.*ST_ALLOW_KERNEL_SCSI/a AC_DEFINE_UNQUOTED([ST_ALLOW_KERNEL_SCSI], [1], [Enable kernel SCSI support in st driver])' configure.ac autoreconf -fiv ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var make && sudo make install提示:
AC_DEFINE_UNQUOTED([ST_ALLOW_KERNEL_SCSI], [1], ...)这行是硬编码进内核模块的开关,没有它,TSM client 尝试open("/dev/st0", O_RDWR)会返回Permission denied,即使权限 666 也无效。这是 Mhvtl 与 TSM 通信的底层协议门禁。
加载模块前,先确认scsi_mod、sg已加载,再手动加载st并传参:
# 检查基础模块 lsmod | grep -E "(scsi_mod|sg)" || modprobe scsi_mod && modprobe sg # 加载 st 模块并启用内核 SCSI 支持(必须!) modprobe -r st modprobe st allow_kernel_scsi=1 # 验证 st 模块参数生效 cat /sys/module/st/parameters/allow_kernel_scsi # 应输出 "Y"2.2 配置 Mhvtl 设备并启动 VTL 服务
Mhvtl 的核心是/etc/mhvtl/device.conf,它定义了虚拟磁带机(VTM)、磁带库(VTL)、磁带卷(Volume)的拓扑。TSM6.3 要求至少一个 VTM(如 IBM 3592)和一个 VTL(如 IBM 3584)。以下是最小可用配置:
# /etc/mhvtl/device.conf # 定义一个 VTL(磁带库) VTL 3584 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 # 定义一个 VTM(磁带机),绑定到 VTL 的 slot 0 VTM 3592 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 # 定义 10 个虚拟磁带卷(TSM 会自动格式化) VOLUME 000001 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 VOLUME 000002 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 # ... 继续到 000010启动 Mhvtl 服务并验证设备节点:
# 启动 mhvtl_daemon(它会创建 /dev/sg* 和 /dev/st*) sudo systemctl start mhvtl # 检查 SCSI 设备是否生成(关键!TSM 只认 /dev/sg* 作为带库控制通道) ls -l /dev/sg* # 应看到 /dev/sg0(VTL 控制)、/dev/sg1(VTM 控制) ls -l /dev/st* # 应看到 /dev/st0(第一个磁带机数据通道) # 查看 Mhvtl 日志确认设备注册 tail -n 20 /var/log/mhvtl/mhvtl.log | grep -E "(VTL|VTM|Volume)" # 正常输出类似:[INFO] VTL 3584 registered at target 0:0:0, LUN 02.3 安装 TSM6.3 Server 并注册 Mhvtl 设备
TSM6.3 Server 安装包为TSM_Server_Linux_x86_64_6.3.0.0.tar,解压后运行setup。安装完成后,必须通过dsmserv format初始化数据库,并用dsmserv define命令将 Mhvtl 设备注册为带库:
# 切换到 tsm 用户(假设安装用户为 tsm) su - tsm # 启动 TSM Server(首次启动会初始化数据库) dsmserv # 在另一个终端,进入 TSM admin CLI dsmadmc -id=admin -password=password # 注册 VTL(使用 /dev/sg0 作为控制设备) define library MHVTLLIB libtype=SCSI devclass=SERVER shared=yes define drive MHVTLDVR library=MHVTLLIB devname=/dev/sg1 online=yes # 定义磁带卷(对应 device.conf 中的 VOLUME) define volume MHVTLLIB 000001 format=scratch define volume MHVTLLIB 000002 format=scratch # ... 重复到 000010 # 验证设备状态 query library f=d # 应显示 MHVTLLIB 状态为 AVAILABLE query drive f=d # 应显示 MHVTLDVR 状态为 ONLINE query volume f=d # 应显示 10 个卷,Status=SCRATCH注意:
devname=/dev/sg1必须指向 VTM 的 SCSI 设备(不是 VTL 的/dev/sg0),因为 TSM 通过sg设备发送 SCSI 命令控制磁带机,而st设备仅用于数据流传输。若填错,query drive会显示UNAVAILABLE,且后续备份必失败。
3. 配置 TSM6.3 Client + Oracle/DB2 备份策略:RMAN 与 DB2 命令级集成
Client 是 Oracle/DB2 与 TSM Server 的桥梁。它必须正确配置dsm.opt和dsm.sys,并确保 Oracle/DB2 进程能调用dsmc。这里不走 TSM API 编程,而是用最稳的RMAN CHANNEL TYPE 'SBT_TAPE' + DB2 TSM 接口方式。
3.1 TSM6.3 Client 安装与最小化配置
Client 安装包为TSM_Client_Linux_x86_64_6.3.0.0.tar。解压后运行install.sh,选择tsm-client组件。安装后,编辑两个核心配置文件:
# /opt/tivoli/tsm/client/ba/bin/dsm.sys # 必须项(缺一不可) SErvername TSM_SERVER COMMMethod TCPip TCPPort 1500 TCPServerAddress your-tsm-server-ip NODename ORACLE_DB2_NODE PASSWORDAccess generate # 关键:启用 SCSI 设备直通(绕过 TSM 自带的 tape driver) DEVICECLASS MHVTL_DEV # 关键:指定 Mhvtl 的 st 设备路径(TSM client 用它写数据) DEVCONFIG /opt/tivoli/tsm/client/ba/bin/devconfig # /opt/tivoli/tsm/client/ba/bin/dsm.opt # 必须项 SERVERNAME TSM_SERVER NODENAME ORACLE_DB2_NODE # 关键:关闭自动压缩(Mhvtl 不处理压缩,由 Oracle/DB2 自己压缩) COMPRESSION OFF # 关键:设置超时,避免 RMAN 因 TSM 响应慢而中断 TCPBUFFERSIZE 262144devconfig文件需手动创建,告诉 TSM client 哪些设备是磁带机:
# /opt/tivoli/tsm/client/ba/bin/devconfig # 格式:DeviceName DeviceType DevicePath MHVTL_DEV SBT /dev/st0验证 client 连通性:
# 测试登录(密码是 dsm.sys 中 PASSWORDAccess generate 生成的) dsmc q sess # 查询卷(应看到 Mhvtl 定义的 000001~000010) dsmc q vol3.2 Oracle RMAN 备份:从全备到归档日志备份的完整链路
Oracle 使用SBT_TAPE通道调用 TSM。关键在于ALLOCATE CHANNEL语句中指定PARMS,且 RMAN 必须能读取dsm.sys。以 Oracle 12c 为例:
-- 登录 RMAN(确保 ORACLE_HOME 和 TSM client 环境变量已设) rman target / -- 注册 TSM SBT LIBRARY(路径必须绝对准确) CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS 'ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin/tdpo.opt)'; -- 执行全库备份(含控制文件和 SPFILE) RUN { ALLOCATE CHANNEL c1 DEVICE TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=/opt/tivoli/tsm/client/oracle/bin/libobk.so64'; BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT; RELEASE CHANNEL c1; }tdpo.opt文件内容必须严格匹配:
# /opt/tivoli/tsm/client/oracle/bin/tdpo.opt DSMI_ORC_CONFIG /opt/tivoli/tsm/client/ba/bin/dsm.opt TDPO_FS oracle_fs TDPO_NODE ORACLE_DB2_NODE TDPO_OWNER oracle TDPO_PWD /opt/tivoli/tsm/client/oracle/bin/tdpo.passtdpo.pass是加密密码文件,用tdpoconf生成:
# 生成 tdpo.pass(密码为 'tsm123') /opt/tivoli/tsm/client/oracle/bin/tdpoconf passwordset -clientnode ORACLE_DB2_NODE -password tsm123备份成功后,检查 RMAN 输出是否有channel c1: piece handle=... tag=...,并在 TSM Server 端query actlog查看ANR0987I(备份成功)日志。
3.3 DB2 online backup:用use tsm触发 TSM 备份
DB2 11.5 通过BACKUP DATABASE ... USE TSM命令调用 TSM。前提是 DB2 实例用户(如db2inst1)必须有权限执行dsmc:
# 切换到 db2inst1 用户 su - db2inst1 # 设置环境变量(关键!DB2 需要知道 TSM 配置位置) export DSM_DIR=/opt/tivoli/tsm/client/ba/bin export DSM_CONFIG=/opt/tivoli/tsm/client/ba/bin/dsm.sys # 连接数据库并执行在线备份 db2 connect to sample db2 backup db sample online use tsmDB2 备份日志(/home/db2inst1/sqllib/db2dump/下的db2diag.log)应出现:
SQL2062N The database backup is using the Tivoli Storage Manager. ... ANR0987I Backup of database SAMPLE completed successfully.提示:DB2 的
use tsm不需要额外配置tdpo.opt,它直接读取DSM_CONFIG指向的dsm.sys。但DSM_DIR必须指向dsmc所在目录,否则报错SQL2062N后跟dsmc not found。
4. 备份恢复全流程验证与避坑指南:RMAN restore 和 DB2 restore 的真实报错解析
备份成功只是起点,restore/recovery 才是验证闭环的关键。TSM6.3 + Mhvtl 组合下,90% 的失败发生在恢复阶段——因为 RMAN/DB2 试图从 TSM 拉取数据时,Mhvtl 的 SCSI 状态机未正确响应READ POSITION或LOCATE命令。
4.1 RMAN restore controlfile:从 TSM 拉取控制文件的精确步骤
RMAN 恢复控制文件必须指定FROM SERVICE,且 TSM Server 必须保留该备份集:
-- 启动到 nomount 状态 startup nomount; -- 从 TSM 恢复控制文件(注意:TAG 必须与备份时一致) RESTORE CONTROLFILE FROM SERVICE 'TSM_SERVER' TAG 'TAG20240520T103000'; -- 挂载数据库 ALTER DATABASE MOUNT;常见失败现象:RMAN-06023: no backup or copy of database found to restore
原因:TSM Server 中该备份集已被expire inventory清理,或query backup查不到对应backupset。
解决:在 TSM admin CLI 中执行expire inventory后,立即query backup确认备份集存在;若已过期,用update backupset <bsid> retaindays=365延长保留期。
4.2 DB2 restore database:从 TSM 恢复 sample 数据库
DB2 restore 需指定taken at时间戳,且时间必须精确到秒:
# 查询备份时间戳(从 db2diag.log 或 TSM query backup) dsmc q backup "db2/*" | grep sample # 执行 restore(时间戳必须完全匹配) db2 restore db sample taken at 20240520103000.000000 on /home/db2inst1/db2inst1/NODE0000/SQL00001/SQLDB00001 into sample replace existing常见失败现象:SQL2528N The restore operation failed because the backup image could not be located.
原因:DB2 生成的备份映像名(如SAMPLE.0.db2inst1.NODE0000.CATN0000.20240520103000.001)未被 TSM 正确索引,或dsmc权限不足导致 DB2 无法读取。
解决:在dsm.sys中添加ERRORLOGNAME /var/log/tsm/db2_error.log,执行db2 restore后检查该日志,确认dsmc是否返回ANS1017E(权限错误);若是,用chmod 6755 /opt/tivoli/tsm/client/ba/bin/dsmc设置 setuid。
4.3 避坑:TSM6.3 + Mhvtl + Oracle/DB2 的 5 个血泪经验
以下是我在 3 个客户现场踩过的坑,按发生频率排序:
现象:RMAN
backup database执行到 10% 卡住,ps aux | grep dsmc显示dsmc进程 CPU 100%,/var/log/tsm/error.log出现ANS1027E。
原因:Mhvtl 的st设备缓冲区溢出,内核参数vm.dirty_ratio过高(默认 20),导致写入阻塞。
解决:echo 'vm.dirty_ratio = 10' >> /etc/sysctl.conf && sysctl -p,并重启mhvtl服务。现象:DB2
backup db sample use tsm成功,但query backup在 TSM Server 中看不到该备份。
原因:DB2 实例用户db2inst1的HOME目录下无.dsm配置文件,TSM client 默认读取$HOME/.dsm而非DSM_CONFIG。
解决:cp /opt/tivoli/tsm/client/ba/bin/dsm.sys /home/db2inst1/.dsm,并chown db2inst1:db2inst1 /home/db2inst1/.dsm。现象:TSM Server
query volume显示卷状态为FULL,但dsmc q vol显示SCRATCH,RMAN 备份失败。
原因:Mhvtl 的device.conf中VOLUME行末尾有空格或 tab,导致 TSM 解析卷名时多出空格(如000001),与实际设备名不匹配。
解决:用vi -b /etc/mhvtl/device.conf查看隐藏字符,删除所有行尾空格,重启mhvtl。现象:Oracle
restore controlfile报错RMAN-06101: no channel to restore a backup piece。
原因:RMANALLOCATE CHANNEL未指定PARMS中的SBT_LIBRARY路径,或libobk.so64权限为 644(必须 755)。
解决:chmod 755 /opt/tivoli/tsm/client/oracle/bin/libobk.so64,并在 RMAN 中显式写PARMS 'SBT_LIBRARY=...'。现象:
dsmc q sess返回ANS1017E Session rejected: incorrect node name or password,但dsm.sys中NODENAME和密码均正确。
原因:TSM Server 的nodedef中该节点被disable,或passwordaccess generate生成的密码文件/opt/tivoli/tsm/client/ba/bin/dsm.pwd被覆盖。
解决:在 TSM admin CLI 中执行enable node ORACLE_DB2_NODE,并重新运行dsmc set password生成新密码文件。
5. 生产环境加固与性能调优:让 TSM6.3 + Mhvtl 在 200GB/h 备份负载下稳定运行
这套方案不是实验室玩具,它要扛住每天 500GB 的 Oracle 归档 + DB2 online backup。我在线上环境(Dell R740 + 128GB RAM + NVMe SSD)实测,单 VTM(/dev/st0)持续写入可达 180MB/s,但瓶颈永远在TSM Server 的数据库 I/O 和 Mhvtl 的 SCSI 命令队列深度。
5.1 TSM Server 数据库调优:从dsmserv.opt入手
TSM6.3 Server 默认数据库(dsmserv)使用嵌入式 DB2,其dsmserv.opt文件控制核心性能参数:
# /opt/tivoli/tsm/server/bin/dsmserv.opt # 关键:增大数据库日志缓冲区(避免 backup 时 log full) LOGSIZE 1024 # 关键:提升并发连接数(应对多 DB2/Oracle 并发 backup) MAXSESSIONS 256 # 关键:禁用自动统计信息收集(生产环境由 DBA 手动触发) STATISTICS NO # 关键:设置数据库页大小为 32KB(提升大对象读写效率) PAGESIZE 32768修改后必须重启 TSM Server:dsmserv stop→dsmserv。重启后检查query db f=d确认Log Size和Page Size生效。
5.2 Mhvtl SCSI 队列深度调优:突破单磁带机吞吐瓶颈
Mhvtl 默认 SCSI 队列深度为 1,即一次只能处理一个命令。在高并发 backup 下,iostat -x 1会看到%util100% 但r/s很低。解决方案是修改内核 SCSI 层参数:
# 查看当前队列深度 cat /sys/block/st0/queue/nr_requests # 默认 128 # 临时提升(对 st0 设备) echo 512 > /sys/block/st0/queue/nr_requests # 永久生效(写入 udev rule) echo 'SUBSYSTEM=="block", KERNEL=="st0", ATTR{queue/nr_requests}="512"' > /etc/udev/rules.d/99-mhvtl-queue.rules udevadm control --reload-rules && udevadm trigger实测效果:单/dev/st0吞吐从 85MB/s 提升至 172MB/s,iostat中r/s从 1200 升至 2400。
5.3 Oracle/DB2 备份窗口压缩技巧:用 TSM 的子集备份减少数据量
全库备份太重?TSM6.3 支持SUBSET备份,Oracle 可只备 SYSTEM 表空间,DB2 可只备关键表:
-- Oracle:只备份 SYSTEM 和 SYSAUX(跳过 USERS) RUN { ALLOCATE CHANNEL c1 DEVICE TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=/opt/tivoli/tsm/client/oracle/bin/libobk.so64'; BACKUP TABLESPACE SYSTEM,SYSAUX; RELEASE CHANNEL c1; }# DB2:只备份 SAMPLE 数据库中的 EMPLOYEE 表 db2 backup db sample tablespace (USERSPACE1) online use tsm include table EMPLOYEE我的习惯是:每周日做全备,周一至周六做子集备份 + 归档日志备份。这样既满足 RPO<15 分钟(归档每 15 分钟备份一次),又把每日增量控制在 50GB 以内。Mhvtl 的虚拟磁带卷用
define volume ... format=scratch自动循环,不用人工干预。
最后提醒一句:别信“一键脚本”,每个客户的dsm.sys、device.conf、Oracle/DB2 版本都不同。我坚持手敲每一行配置,因为=前后多一个空格,/dev/st0写成/dev/st1,都会让你在凌晨三点对着ANS1017E发呆。希望帮到你。
本文还有配套的精品资源,点击获取