☰
Mhvtl虚拟带库+TSM 6.3实战:Oracle/DB2异机恢复全链路闭环
2026/11/4 10:50:47 网站建设 项目流程

简介:本资源是一份面向企业级数据备份与灾备工程师、DBA及Linux系统管理员的实战测试文档,聚焦TSM 6.3在Linux(CentOS 6.5)环境下联合Mhvtl虚拟带库实现Oracle与DB2数据库的全流程备份与异机恢复验证。文档结构清晰、步骤翔实,覆盖Mhvtl编译安装与iSCSI带库映射、TSM主服务器部署与存储策略配置、NUB客户端集成、Oracle RMAN+TSM协同备份,以及含SPFILE/Control File/数据文件/归档日志的完整异机恢复操作链。资源为1个1.83MB的Word文档(.docx),内容含4大模块共53页,含版本记录、目录索引、命令截图占位说明及典型拓扑图,便于按需查阅与环境复现。目前已有244人学习下载,适合需落地TSM灾备方案、理解虚拟带库与企业数据库深度集成的技术人员系统掌握关键配置逻辑与排错要点。

1. TSM6.3 + Mhvtl 虚拟带库实战:Oracle/DB2 异机恢复不是玄学,是可复现的 SCSI 设备链路闭环

你有没有遇到过这种场景:生产环境 Oracle 突然宕机,RMAN 备份在磁带上,但物理带库远在异地机房,调拨要 48 小时;或者 DB2 数据库误删表,想用 TSM 恢复,却卡在“找不到驱动器”——ANR8973E Unable to open device /dev/st0报错刷屏。这不是配置没写对,而是底层 SCSI 设备链路根本没跑通。这篇文档讲的不是“TSM 怎么点按钮”,而是把Mhvtl 虚拟带库 → iSCSI 映射 → TSM 设备定义 → Oracle RMAN 接口 → 异机恢复验证这条全链路,拆成可逐行执行、每步可验证、每个报错有解法的硬核操作。它基于真实测试环境(CentOS 6.6 + TSM 6.3.5 + Mhvtl 1.5),覆盖 Oracle 11g 和 DB2 9.7 双数据库,重点解决三个致命问题:虚拟带库设备识别不稳定、TSM 存储池挂载后卷状态为OFFLINE、异机恢复时 RMAN 找不到备份集。如果你正被“备份能做、恢复失败”折磨,或刚接手一套老 TSM 环境不知从哪下手,这篇就是为你写的血泪经验笔记。


2. Mhvtl 虚拟带库:从 SCSI 设备注册到机械手状态可控的完整闭环

Mhvtl 不是简单装个 RPM 就完事的“黑匣子”。它的本质是 Linux 内核模块(mhvtl.ko)+ 用户态守护进程(vtllibrary)组合,通过/dev/sgX暴露 SCSI 接口,让上层备份软件(如 TSM)像操作物理带库一样读写。关键在于:设备必须被内核正确识别、SCSI 地址不能漂移、机械手与磁带驱动器的拓扑关系必须静态固化。否则 TSM 启动时会反复报ANR8974E Device is not ready,后续所有操作都是空中楼阁。

2.1 安装前必须锁死的 5 个系统依赖与权限基线

Mhvtl 编译依赖特定内核头文件和 SCSI 工具链,CentOS 6.6 默认源不包含全部。跳过这步直接make,90% 概率编译失败或运行时崩溃。

# 1. 启用本地 yum 源(避免网络依赖) mount /dev/cdrom /mnt cat > /etc/yum.repos.d/CentOS-Media.repo << 'EOF' [c6-media] name=CentOS-$releasever - Media baseurl=file:///mnt gpgcheck=0 enabled=1 EOF # 2. 安装核心依赖(缺一不可) yum install -y lsscsi mt-st mtx zlib-devel sg3_utils kernel-devel-$(uname -r) kernel-headers-$(uname -r) gcc make # 3. 创建专用用户与路径(权限错误是常见翻车点) useradd -m -d /home/vtl vtl echo "vtl:vtlpass" | chpasswd mkdir -p /opt/mhvtl /etc/mhvtl /var/log/mhvtl chown -R vtl:vtl /opt/mhvtl /etc/mhvtl /var/log/mhvtl chmod 755 /opt/mhvtl /etc/mhvtl

参数说明:kernel-devel-$(uname -r)必须与当前运行内核版本严格一致(uname -r输出2.6.32-431.el6.x86_64,则必须装对应版本的kernel-devel),否则make install会报Module compilation failed;/etc/mhvtl是配置中心,/opt/mhvtl是磁带镜像存储根目录,权限必须为vtl:vtl,TSM 服务以root运行但会切换用户访问设备,权限错则st0设备无法打开。

2.2 编译安装:绕过 RPM 包陷阱,直击内核模块加载本质

文档中提到的rpm -ivh mhvtl-utils-1.5-2.x86_64.rpm是误导性操作。该 RPM 仅提供命令行工具(mtx,mt),不包含核心内核模块mhvtl.ko。真正起作用的是 GitHub 源码编译的模块。必须手动编译,否则service mhvtl start启动后lsscsi看不到任何mediumx或tape设备。

# 1. 下载并解压源码(使用文档指定的 commit,避免新版兼容问题) cd /tmp wget https://github.com/markh794/mhvtl/archive/d9f6115.zip unzip d9f6115.zip cd mhvtl-d9f6115/kernel # 2. 编译内核模块(关键:指定 KDIR 指向当前内核头文件) make KDIR=/lib/modules/$(uname -r)/build sudo make install # 3. 加载模块并启动服务 sudo modprobe mhvtl sudo service mhvtl start sudo chkconfig mhvtl on

逻辑说明:make KDIR=...是核心,它告诉编译器去哪找linux/module.h等头文件;modprobe mhvtl手动加载模块,比service mhvtl start更早暴露内核级错误(如FATAL: Module mhvtl not found表示模块未编译成功);service mhvtl start实际启动的是vtllibrary进程,它依赖内核模块已加载。

2.3 设备拓扑固化:用 udev 规则锁定/dev/sgX设备名不漂移

lsscsi -g输出中/dev/sg10、/dev/sg11的编号在重启后可能变成/dev/sg12、/dev/sg13,导致 TSM 配置全废。必须用 udev 规则将 SCSI 设备按厂商型号绑定固定名称。

# 1. 获取设备唯一标识(以 sg10 机械手为例) sudo sg_inq /dev/sg10 | grep -E "(vendor|product|revision)" # 输出示例:vendor_id: STK, product_id: L700, revision: 0105 # 2. 创建 udev 规则文件 cat > /etc/udev/rules.d/99-mhvtl.rules << 'EOF' # 绑定 L700 机械手到 /dev/sg_l700 SUBSYSTEM=="scsi_generic", ATTRS{vendor}=="STK", ATTRS{model}=="L700", SYMLINK+="sg_l700" # 绑定 ULT3580-TD5 磁带机到 /dev/sg_td5_0 SUBSYSTEM=="scsi_generic", ATTRS{vendor}=="IBM", ATTRS{model}=="ULT3580-TD5", ATTRS{scsi_level}=="6", PROGRAM="/bin/sh -c 'echo %p | sed 's/.*\\///''", SYMLINK+="sg_td5_%c" # 绑定 L80 机械手到 /dev/sg_l80 SUBSYSTEM=="scsi_generic", ATTRS{vendor}=="STK", ATTRS{model}=="L80", SYMLINK+="sg_l80" EOF # 3. 重载 udev 规则并触发 sudo udevadm control --reload-rules sudo udevadm trigger --subsystem-match=scsi_generic sudo udevadm settle # 4. 验证符号链接(重启后仍有效) ls -l /dev/sg_l* # 应输出:/dev/sg_l700 -> /dev/sg10, /dev/sg_l80 -> /dev/sg11, /dev/sg_td5_0 -> /dev/sg2

参数说明:ATTRS{scsi_level}=="6"过滤掉 SCSI-2 设备,确保只匹配 LTO-5 级别驱动器;PROGRAM语句提取 SCSI 地址中的数字部分,实现sg_td5_0,sg_td5_1等自动编号;SYMLINK+=创建软链接而非重命名,避免破坏原有/dev/sgX兼容性。

2.4 机械手与磁带状态验证:用mtx和mt命令确认物理层就绪

TSM 启动前,必须人工验证机械手能否取放磁带、驱动器能否读写。这是区分“设备存在”和“设备可用”的分水岭。

# 1. 查看 L700 机械手(/dev/sg_l700)槽位状态 sudo mtx -f /dev/sg_l700 status | head -20 # 关键看:Storage Element X:Full :VolumeTag=E01001L4(有磁带)、Data Transfer Element 0:Empty(驱动器空闲) # 2. 将第 1 槽磁带装入第 0 号驱动器 sudo mtx -f /dev/sg_l700 load 1 0 # 3. 验证驱动器是否识别到磁带(/dev/st0 对应第一个 TD5 驱动器) sudo mt -f /dev/st0 status # 正常输出:SCSI 2 drive ... Mode Data Compaction: Disabled ... File number=0, block number=0, partition=0 # 4. 用 tar 写入测试数据(模拟备份流) sudo tar -cf /dev/st0 /boot/grub/grub.conf /etc/fstab # 成功无报错即表示 SCSI 写通路正常 # 5. 读取验证(模拟恢复流) sudo tar -tf /dev/st0 | head -5 # 应列出 grub.conf, fstab 等文件名,证明读通路正常

逻辑说明:mtx load 1 0是关键动作,它触发机械手物理移动,若失败(如mtx: Request Sense: Invalid field in parameter list)说明library_contents.10配置错误;mt status输出中File number=0表示磁带处于初始位置,block number=0表示可写;tar -cf成功代表 SCSI WRITE BUFFER 命令被正确处理,这是 TSM 后续调用dsmserv format的基础。

3. TSM 6.3.5 服务端配置:从 ANR8973E 报错到存储池 ONLINE 的硬核排障

TSM 服务端(dsmserv)启动失败或设备状态异常,90% 源于两个层面:内核设备权限未开放(/dev/st0权限不足)、TSM 设备驱动未加载(ANR8973E)。这不是配置语法问题,而是 Linux 系统级资源管控与 TSM 运行时环境的深度耦合。

3.1 启动前必须完成的 3 项系统级授权

TSM 以root用户运行,但其子进程(如dsmserv)会降权为tibrv用户(默认),而tibrv对/dev/st0无读写权限。必须显式授权。

# 1. 创建 tsm 组并添加 tibrv 用户(TSM 安装后自动创建 tibrv 用户) groupadd tsm usermod -a -G tsm tibrv # 2. 修改 SCSI 设备权限(永久生效) cat > /etc/udev/rules.d/98-tsm-scsi.rules << 'EOF' # 允许 tsm 组访问所有 sg 和 st 设备 KERNEL=="sg[0-9]*", GROUP="tsm", MODE="0660" KERNEL=="st[0-9]*", GROUP="tsm", MODE="0660" KERNEL=="sch[0-9]*", GROUP="tsm", MODE="0660" EOF sudo udevadm control --reload-rules sudo udevadm trigger --subsystem-match=scsi # 3. 验证权限(重启后仍有效) ls -l /dev/sg_l700 /dev/st0 /dev/sch0 # 应输出:crw-rw---- 1 root tsm ... /dev/sg_l700, crw-rw---- 1 root tsm ... /dev/st0

参数说明:MODE="0660"赋予组读写权限(rw-),GROUP="tsm"将设备归属到tsm组;KERNEL=="sch[0-9]*"匹配机械手设备(sch0,sch1),TSM 需要它控制机械臂;此规则比chmod 666 /dev/st0更安全,避免全局开放设备。

3.2 TSM 设备定义:用DEFINE DEVCLASS绕过 ANR8974E 的 SCSI 超时陷阱

TSM 默认 SCSI 超时为 30 秒,而 Mhvtl 虚拟带库在首次加载磁带时可能耗时 45 秒以上,导致DEFINE DEVCLASS失败并报ANR8974E Device is not ready。必须显式延长超时并指定 SCSI 地址。

# 1. 进入 TSM 管理界面(需先启动 dsmserv) su - tibrv -c "/opt/tivoli/tsm/server/bin/dsmserv" # 2. 在 TSM 交互式命令行中执行(注意:必须在 dsmserv 进程内) # 定义 L700 机械手设备类(关键:timeout=120) DEFINE DEVCLASS L700_ML TYPE=SCSI DEVTYPE=L700 LIBRARYNAME=L700_LIB TIMEOUT=120 # 定义 ULT3580-TD5 驱动器设备类(关键:scsi_id 指向 udev 符号链接) DEFINE DEVCLASS TD5_DRV TYPE=SCSI DEVTYPE=ULT3580-TD5 LIBRARYNAME=L700_LIB \ SCSI_ID="/dev/sg_td5_0" TIMEOUT=120 # 3. 定义存储库(Library)并关联设备类 DEFINE LIBRARY L700_LIB TYPE=SCSI DEVCLASS=L700_ML # 4. 定义驱动器并绑定到库(关键:drive_name 必须与 SCSI ID 一致) DEFINE DRIVE L700_DRV LIBRARY=L700_LIB DEVCLASS=TD5_DRV \ DRIVE_NAME="/dev/sg_td5_0" ONLINE=YES # 5. 格式化磁带(使用 udev 符号链接,非 /dev/st0) FORMAT DRIVE="/dev/sg_td5_0" VOLUME_NAME=E01001L4

逻辑说明:TIMEOUT=120将超时从默认 30 秒提升至 120 秒,解决 Mhvtl 初始化延迟;SCSI_ID="/dev/sg_td5_0"强制 TSM 使用 udev 创建的稳定路径,避免重启后/dev/st0指向错误设备;FORMAT命令必须指定VOLUME_NAME(如E01001L4),该名称需与mtx status中显示的VolumeTag一致,否则 TSM 无法关联磁带。

3.3 存储池与卷管理:用UPDATE STGPOOL解决卷状态 OFFLINE 的顽疾

即使设备定义成功,新创建的存储池(STGPOOL)中卷(VOLUME)状态常为OFFLINE,导致备份任务失败。根本原因是 TSM 未将卷注册到其内部数据库。

# 1. 创建存储池(关联到 L700_LIB 库) DEFINE STGPOOL TAPE_POOL DEVCLASS=TD5_DRV POOLTYPE=PRIMARY MAXSCRATCH=100 # 2. 将磁带卷注册到存储池(关键:volname 必须与 mtx 中 VolumeTag 完全一致) REGISTER VOLUME E01001L4 STGPOOL=TAPE_POOL # 3. 强制更新存储池状态(解决 OFFLINE 问题) UPDATE STGPOOL TAPE_POOL NEXTSTGPOOL=TAPE_POOL RECLAIMTHRESH=100 # 4. 验证卷状态(应在 1 分钟内变为 ONLINE) QUERY VOLUME E01001L4 # 正常输出:Volume Name: E01001L4, Status: ONLINE, Storage Pool: TAPE_POOL

参数说明:REGISTER VOLUME是强制注册命令,E01001L4必须与mtx status输出的VolumeTag字符串完全相同(大小写敏感);UPDATE STGPOOL ... RECLAIMTHRESH=100设置回收阈值为 100%,强制 TSM 立即扫描所有卷并更新状态;若QUERY VOLUME仍为OFFLINE,执行AUDIT LIBRARY L700_LIB FIX=YES修复库元数据。

3.4 文件系统备份策略:用DEFINE SCHED实现自动化与手动触发双模式

备份策略不是配完就完,必须验证调度器(SCHEDULER)能否真正触发备份任务,并捕获日志定位失败点。

# 1. 定义客户端节点(备份客户端主机名 oracle1) DEFINE NODE ORACLE1 PASSWORD=oracle1pass DOMAIN=STD # 2. 定义备份策略域(Policy Domain) DEFINE POLICYDOMAIN ORACLE_POLICY # 3. 定义管理类(Management Class)并关联存储池 DEFINE MGMTCLASS ORACLE_POLICY STANDARD ORACLE_MC STGPOOL=TAPE_POOL # 4. 定义调度(每日凌晨 2 点执行) DEFINE SCHED ORACLE_SCHED ACTION=INCREMENTAL STARTTIME=02:00:00 \ PERIOD=24 HOURS DURATION=4 HOURS NODE=ORACLE1 # 5. 手动触发一次备份(验证通路) su - tibrv -c "dsmc inc -subdir=yes -filespaces=/boot" # 6. 查看备份日志(关键排查点) tail -50 /var/log/tsm/dsmsched.log # 正常应含:Scheduled event 'ORACLE_SCHED' completed successfully

逻辑说明:dsmc inc是客户端命令,必须在oracle1主机上执行(非 TSM 服务端);-subdir=yes递归备份子目录;-filespaces=/boot指定备份路径;日志中若出现ANS1094E No files backed up,检查/opt/tivoli/tsm/client/ba/bin/dsm.sys中TCPSERVERADDRESS是否指向tsm61(TSM 服务端 IP);若出现ANS1512E Session rejected: server access denied,检查DEFINE NODE密码是否与客户端dsm.opt中PASSWORDACCESS GENERATE生成的密码一致。

4. 常见问题排查:5 条血泪经验总结的 Mhvtl+TSM 翻车现场实录

部署 Mhvtl + TSM 最痛苦的不是不会配,而是报错信息模糊、现象相似、原因各异。以下是我在某高校灾备实验室实测中踩过的 5 个典型坑,每一条都附带可复现的现象、精准定位方法和一招解决的命令。

4.1 现象:lsscsi -g能看到/dev/sg10,但mtx -f /dev/sg10 status报mtx: Request Sense: Invalid field in parameter list

  • 原因:/etc/mhvtl/library_contents.10配置文件中NUM_DRIVES或NUM_SLOTS数值与实际编译的 Mhvtl 内核模块不匹配。Mhvtl 源码默认NUM_DRIVES=4,但若library_contents.10写NUM_DRIVES=8,机械手协议解析就会越界。
  • 解决:
    # 1. 停止 mhvtl 服务 sudo service mhvtl stop # 2. 编辑配置文件,确保 NUM_DRIVES=4, NUM_SLOTS=43(与 L700 规格一致) sudo vi /etc/mhvtl/library_contents.10 # 3. 重启服务并验证 sudo service mhvtl start sudo mtx -f /dev/sg_l700 status

4.2 现象:TSM 启动后QUERY DRIVE显示ONLINE=YES,但QUERY VOLUME中所有卷状态为OFFLINE

  • 原因:TSM 服务启动时,Mhvtl 的vtllibrary进程尚未完全初始化 SCSI 设备,TSM 扫描到的是“空设备”,后续REGISTER VOLUME无效。
  • 解决:
    # 1. 重启 TSM 服务(强制重新扫描) sudo su - tibrv -c "pkill dsmserv; sleep 5; /opt/tivoli/tsm/server/bin/dsmserv &" # 2. 等待 2 分钟,再执行注册和更新 sudo su - tibrv -c "dsmserv" # 在 TSM 命令行中: REGISTER VOLUME E01001L4 STGPOOL=TAPE_POOL UPDATE STGPOOL TAPE_POOL RECLAIMTHRESH=100

4.3 现象:dsmc inc手动备份时报ANS1512E Session rejected: server access denied,但ping tsm61网络通畅

  • 原因:TSM 服务端dsmserv启动时未加载tcpip协议栈,或防火墙虽关闭但iptables规则残留(service iptables stop不等于规则清空)。
  • 解决:
    # 1. 检查 TSM 是否监听 1500 端口 sudo netstat -tuln | grep :1500 # 若无输出,编辑 /opt/tivoli/tsm/server/bin/dsmserv.opt,确保含: # TCPSERVERADDRESS 0.0.0.0 # TCPENABLED YES # 2. 彻底清空 iptables 规则 sudo iptables -F sudo iptables -X sudo iptables -t nat -F sudo service iptables save

4.4 现象:Oracle 备份时 RMAN 报RMAN-03009: failure of backup command on T1 channel at ... ORA-19506: failed to create sequential file,TSM 日志无错误

  • 原因:RMAN 通道(channel)配置中PARMS='BLKSIZE=1048576'的块大小与 TSM 设备类(DEVCLASS)中BLKSIZE参数不一致。Mhvtl 默认块大小为 65536,若 RMAN 强制设为 1048576,TSM 会拒绝写入。
  • 解决:
    -- 在 RMAN 中重新配置通道,块大小必须与 TSM DEVCLASS 一致 RUN { ALLOCATE CHANNEL t1 TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=/opt/tivoli/tsm/client/oracle/bin/libobk.so64, ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; SEND 'NSR_ENV=(NSR_SERVER=tsm61, NSR_CLIENT=oracle1, NSR_DATA_VOLUME=E01001L4)'; BACKUP DATABASE PLUS ARCHIVELOG; } -- 关键:删除 PARMS 中的 BLKSIZE,让 TSM 自动协商

4.5 现象:异机恢复时RESTORE CONTROLFILE FROM 'E01001L4'成功,但RECOVER DATABASE报RMAN-06025: no backup of log thread 1 seq 123 with scn 456789 found to restore

  • 原因:TSM 存储池中归档日志(archivelog)备份未启用RECLAIM=YES,导致旧日志被自动清理,恢复时找不到所需 SCN 的日志。
  • 解决:
    # 1. 修改存储池,禁止自动回收归档日志 su - tibrv -c "dsmserv" # 在 TSM 命令行中: UPDATE STGPOOL TAPE_POOL RECLAIM=NO # 2. 重新备份归档日志(确保最新) sqlplus / as sysdba << 'EOF' ALTER SYSTEM ARCHIVE LOG CURRENT; EXIT; EOF rman target / << 'EOF' RUN { ALLOCATE CHANNEL c1 TYPE 'SBT_TAPE'; BACKUP ARCHIVELOG ALL DELETE INPUT; } EOF

5. Oracle/DB2 异机恢复:从 RMAN RESTORE 到数据库 OPEN RESETLOGS 的全链路验证

异机恢复不是“把备份拷过去就能用”,而是TSM 设备映射 → RMAN 通道识别 → 控制文件恢复 → 数据文件还原 → 归档日志应用 → 数据库一致性校验的强顺序流程。任何一环断开,ALTER DATABASE OPEN RESETLOGS就会报ORA-01113: file 1 needs media recovery。本节聚焦最易出错的 RMAN 与 TSM 交互环节,给出可落地的验证步骤。

5.1 异机环境准备:三步构建与原环境 1:1 的 TSM 客户端沙箱

恢复目标机(db21)必须与备份源机(oracle1)拥有完全一致的 TSM 客户端配置,否则 RMAN 无法找到备份集。

# 1. 在 db21 上安装 TSM 客户端(与 oracle1 版本严格一致) # 下载 tsm-client-6.3.5.0-0.i386.rpm,执行: sudo rpm -ivh tsm-client-6.3.5.0-0.i386.rpm # 2. 复制 oracle1 的 tdpo.opt 配置(关键:NSR_SERVER 必须指向 tsm61) sudo cp /opt/tivoli/tsm/client/oracle/bin64/tdpo.opt /opt/tivoli/tsm/client/oracle/bin64/tdpo.opt.db2 sudo sed -i 's/NSR_CLIENT=oracle1/NSR_CLIENT=db21/g' /opt/tivoli/tsm/client/oracle/bin64/tdpo.opt.db2 # 3. 创建 Oracle 恢复专用目录结构(与原库路径一致) sudo mkdir -p /u01/app/oracle/fast_recovery_area/ORCL/archivelog sudo mkdir -p /u01/app/oracle/oradata/ORCL sudo chown -R oracle:oinstall /u01/app/oracle

参数说明:tdpo.opt.db2是独立配置文件,避免与oracle1的配置冲突;NSR_CLIENT=db21必须与 TSM 服务端DEFINE NODE中的节点名一致,否则 TSM 认为“非法客户端”;目录结构必须与原库DB_CREATE_FILE_DEST和DB_RECOVERY_FILE_DEST完全相同,否则 RMAN 还原时会报ORA-19570: file 1 is not in the database.

5.2 RMAN 恢复控制文件:用RESTORE CONTROLFILE FROM绕过 TSM 卷名解析陷阱

RMAN 默认从AUTOBACKUP恢复控制文件,但 TSM 的AUTOBACKUP名称是动态生成的(如c-1234567890-20231001-00),异机环境下 TSM 无法解析该名称。必须显式指定卷名(VOLUME_NAME)。

-- 1. 启动数据库到 NOMOUNT 状态 sqlplus / as sysdba << 'EOF' STARTUP NOMOUNT; EXIT; EOF -- 2. 在 RMAN 中连接 TSM 并恢复控制文件(关键:FROM 'E01001L4' 指定卷名) rman target / << 'EOF' SET DBID 1234567890; -- 必须设置原库 DBID,否则无法识别备份集 RUN { ALLOCATE CHANNEL c1 TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=/opt/tivoli/tsm/client/oracle/bin/libobk.so64, ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt.db2)'; RESTORE CONTROLFILE FROM 'E01001L4'; -- 直接指定卷名,不依赖 AUTOBACKUP } EXIT; EOF -- 3. 挂载数据库 sqlplus / as sysdba << 'EOF' ALTER DATABASE MOUNT; EXIT; EOF

逻辑说明:SET DBID是强制指令,DBID值从原库SELECT DBID FROM V$DATABASE;获取;RESTORE CONTROLFILE FROM 'E01001L4'中的'E01001L4'必须与QUERY VOLUME中的卷名完全一致;若报RMAN-06023: no backup of control file found to restore,执行LIST BACKUP OF CONTROLFILE确认备份集是否存在,不存在则需先在原库执行BACKUP CURRENT CONTROLFILE。

5.3 数据文件还原与归档日志应用:用SET UNTIL SCN精确控制恢复点

RECOVER DATABASE默认恢复到最新归档,但若归档不全,会卡在waiting for archive log。必须用SET UNTIL SCN指定一个已知的、有完整归档链的 SCN。

-- 1. 查询原库备份时的 SCN(在 oracle1 上执行) sqlplus / as sysdba << 'EOF' SELECT CURRENT_SCN FROM V$DATABASE; -- 假设输出:123456789 EXIT; EOF -- 2. 在 db21 上执行精确恢复(关键:UNTIL SCN 123456789) rman target / << 'EOF' RUN { ALLOCATE CHANNEL c1 TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=/opt/tivoli/tsm/client/oracle/bin/libobk.so64, ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt.db2)'; SET UNTIL SCN 123456789; -- 恢复到该 SCN,确保所有归档可用 RESTORE DATABASE; RECOVER DATABASE; } EXIT; EOF

参数说明:SET UNTIL SCN比SET UNTIL TIME更可靠,避免时区和 NLS 问题;RESTORE DATABASE会从 TSM 中下载所有数据文件到/u01/app/oracle/oradata/ORCL/;RECOVER DATABASE会自动应用归档日志,若报RMAN-06054: media recovery requesting unknown archived log,说明该 SCN 的归档缺失,需回退到更早的 SCN(如123456000)重试。

5.4 数据库 OPEN RESETLOGS:用VALIDATE DATABASE预检一致性,避免后悔药

ALTER DATABASE OPEN RESETLOGS是最后一步,但若数据文件或归档有损坏,执行后数据库将处于不可用状态。必须在 OPEN 前用VALIDATE DATABASE做最终校验。

-- 1. 执行预检(耗时较长,但值得) rman target / << 'EOF' VALIDATE DATABASE; EXIT; EOF # 正常输出:List of failures ... Failure count: 0 -- 2. 打开数据库(关键:RESETLOGS 会重置日志序列) sqlplus / as sysdba << 'EOF' ALTER DATABASE OPEN RESETLOGS; -- 验证数据 SELECT COUNT(*) FROM scott.emp; -- 应返回原库记录数(如 14) EXIT; EOF

逻辑说明:VALIDATE DATABASE会读取每个数据块的校验和并与备份时的校验和比对,若输出Failure count: 0,说明所有块完整;ALTER DATABASE OPEN RESETLOGS会创建新的在线日志文件,序列号从 1 开始,这是异机恢复的标准流程;SELECT COUNT(*) FROM scott.emp是最简验证,证明数据字典和用户数据均可用。

6. DB2 异机恢复进阶技巧:用db2adutl替代RESTORE DB绕过 TSM 设备类限制

DB2 的 TSM

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询