简介:资源面向企业级备份运维与数据库管理员,围绕 TSM 6.3 在 Linux 平台结合 Mhvtl 虚拟带库完成 Oracle、DB2 备份与异机恢复的测试实践,属于中高级实操型文档,可解决虚拟带库搭建、TSM 服务端配置、RMAN 备份以及灾难恢复演练中的环境准备和流程对照问题。压缩包内只有 1 个 docx 文件,约 1.83MB,按 Mhvtl 安装配置、TSM 安装配置、Oracle 备份、Oracle 异机恢复四部分编排,带有目录和分步说明。目前已有 243 人学习。文档内容包括 CentOS 6.5 环境准备、MHVTL 编译安装与带库可用性测试、基于 tgt 的 iSCSI 映射、TSM 存储设备与卷配置、备份策略以及本地磁盘备份、NUB 客户端配置,也包括通过 Rman 和 TSM 命令恢复 Spfile、control file、数据文件和归档日志;读者可据此搭建测试环境、梳理配置顺序和恢复步骤。
1. 演练环境从哪来:没有第二套带库硬件也能把恢复跑通
备份窗口跑完、作业状态一片绿色,不等于灾难那天真能把库拉起来。很多团队做过备份,却从没做过一次完整的异机恢复演练:缺第二套磁带库硬件,也没人愿意在生产阵列上反复折腾。这套 TSM 6.3 + Mhvtl 虚拟带库 + Oracle + DB2 的备份恢复方案,解决的就是演练环境从哪来的问题——在一台 Linux 虚拟机上把 Mhvtl 跑起来,通过 iSCSI 把机械手和驱动器映射给备份主服务器,TSM 6.3 把 Oracle 11g 和 DB2 9.7 的数据真正写到“磁带”上,最后换一台机器把库拉起来。它适合做数据保护方向课程设计、毕业设计的学生,也适合刚接手备份系统、需要交一份可复现演练报告的工程师。
2. 环境怎么排:四台虚拟机的角色、地址与 iSCSI 链路
2.1 角色拆分与地址规划
这套方案最容易在一开始就被忽略的不是软件装不上,而是角色划分。虚拟带库和 TSM 服务器如果装在同一台机器上,iSCSI 这一层就被跳过了,等真正接入硬件带库时,设备路径和权限的坑还是得重新踩一遍。所以我一般坚持把带库独立成一台机器,让 TSM 服务器以 iSCSI 客户端身份去连,链路完整,后面换真带库时只要改设备名。
四台机器的边界是这样切的:
| 主机名 | IP 地址 | 操作系统 | 承担角色 |
|---|---|---|---|
| tsm | 192.168.81.7 | CentOS 6.6 | TSM Server 6.3.5 主服务器 |
| mhvtl | 192.168.81.6 | CentOS 6.6 | Mhvtl 虚拟带库 + iSCSI target |
| oracle | 192.168.81.11 | Linux 5.7 | Oracle 11g + NUB 客户端 |
| db2 | 192.168.81.12 | Linux 5.7 | DB2 9.7 + TSM API 客户端 |
准备阶段还有两件小事必须做完:关掉防火墙与 SELinux,并把本地 yum 源配好。虚拟带库那台机器要装 scsi-target-utils,TSM 服务器要装 iscsi-initiator-utils,两边的内核头文件都要齐,否则编译 Mhvtl 内核模块时会直接报错退出。
# 挂载光盘做本地源,演练环境通常没有外网 mount /dev/cdrom /mnt mkdir -p /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak cat > /etc/yum.repos.d/CentOS-Media.repo <<'EOF' [c6-media] name=CentOS-$releasever - Media baseurl=file:///mnt gpgcheck=0 enabled=1 EOF # 关防火墙与 SELinux,演练环境里这是省事的做法 service iptables stop chkconfig iptables off sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/configbaseurl=file:///mnt指向挂载点,gpgcheck=0关掉校验是因为本地盘没有导入 GPG key;chkconfig iptables off保证重启后规则不再回来,少了这一步,第二天重启发现 iSCSI 连不上,排查方向会跑偏到存储侧。
2.2 Mhvtl 编译安装与磁带容量设定
Mhvtl 是一个基于 Linux 的开源虚拟磁带库,能模拟 IBM、HP 的 LTO1~LTO5,以及 STK、索尼的多种带库与驱动器型号,最常被拿来冒充 L180 / L700 这类中大型带库。它被 TSM、NetBackup、Backup Exec、Oracle 等产品当作真实带库识别,对演练来说这一点比功能多更重要——上层软件不需要任何特殊适配。
安装前先把依赖补齐,再建一个专用的vtl用户。Mhvtl 的配置文件在/etc/mhvtl,虚拟磁带的数据文件默认落在/opt/mhvtl,这两个目录的属主必须是同一个低权限账号,否则服务起得来但写不进数据。
# 依赖包:mtx 用于操作机械手,sg3_utils 提供 SCSI 直通 yum install -y lsscsi mt-st mtx zlib-devel sg3_utils kernel-devel kernel-headers gcc useradd vtl mkdir -p /opt/mhvtl /etc/mhvtl chown -Rf vtl:vtl /opt/mhvtl /etc/mhvtl 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 onmake install装的是内核模块,所以kernel-devel的版本必须和当前运行内核一致,版本对不上时模块编译能过、加载会失败。首次启动会提示找不到library_contents.10和library_contents.30并自动生成默认配置,这属于正常现象,说明两个带库实例(L700 与 L80)都初始化了。
磁带默认容量只有 500MB,做 Oracle 全备一盘根本不够,此时必须改:
vi /etc/mhvtl/mhvtl.conf MHVTL_CONFIG_PATH=/etc/mhvtl CAPACITY=2046 # 单位 MB,即每盘 LTO 磁带模拟 2GB VERBOSE=1 VTL_DEBUG=0改完重启 mhvtl 生效。VERBOSE=1会输出每次介质操作,调试阶段很好用,压测时建议调回 0。容量不能随手写个 200000,虚拟磁带是按需分配的实际文件,/opt/mhvtl所在分区有多大,决定了你能骗上层软件多久。
2.3 带库自检:先看设备,再动机械手
服务起来之后第一件事是确认设备节点,而不是急着去装 TSM。lsscsi -g会同时列出块设备和对应的 SCSI 通用设备,机械手的通用设备通常是/dev/sg10、/dev/sg11,驱动器则映射成/dev/st0~/dev/st7。
lsscsi -g # [3:0:0:0] mediumx STK L700 0105 /dev/sch0 /dev/sg10 <- 机械手 1 # [3:0:1:0] tape IBM ULT3580-TD5 0105 /dev/st0 /dev/sg2 <- LTO5 驱动器 # [3:0:3:0] tape IBM ULT3580-TD4 0105 /dev/st2 /dev/sg4 <- LTO4 驱动器 # [3:0:8:0] mediumx STK L80 0105 /dev/sch1 /dev/sg11 <- 机械手 2这里有个高频误判:新手看到mediumx就以为是驱动器,拿/dev/sg10去跑 tar 会直接失败。判断标准看设备类型,mediumx是机械手(changer),tape才是读写介质的驱动器。
机械手状态用 mtx 看,槽位、磁带标签、驱动器占用一目了然:
mtx -f /dev/sg10 status # Data Transfer Element 0:Empty # Storage Element 1:Full :VolumeTag=E01001L4 # Storage Element 22:Full :VolumeTag=CLN101L4 # 把 1 号槽位的磁带装进 0 号驱动器 mtx -f /dev/sg10 load 1 0 # 用 tar 做一次最原始的读写验证 tar -cvf /dev/st0 /boot tar -tvf /dev/st0load 1 0的两个参数分别是槽位号和驱动器号,顺序写反会报 “Invalid element address”。tar 写通、再读出来能列出文件,说明内核模块、播放器、介质三层都通了,这时才值得往下配 TSM。我见过有人跳过这一步直接进 TSM,结果 define path 全部成功、备份一发起就卡在 mounting tape,回头查了两天才发现是磁带根本没装进驱动器。
2.4 用 tgt 把带库映射给 TSM 服务器
虚拟带库单独一台机器,TSM 服务器要通过 iSCSI 才能看到这些设备。做法是在 target 端把机械手和四台驱动器分别挂成不同 LUN:LUN0 给机械手,LUN1~LUN4 给驱动器。上层 TSM 拿到的设备名会变,但设备类型不变,这也是为什么前面必须先用 lsscsi 记录清楚原始设备。
yum install -y scsi-target-utils cat >> /etc/tgt/targets.conf <<'EOF' <target iqn.2024-01.lab.vtl:l700> backing-store /dev/sg10 # LUN0:机械手 backing-store /dev/st0 # LUN1:驱动器 1 backing-store /dev/st1 # LUN2:驱动器 2 backing-store /dev/st2 # LUN3:驱动器 3 backing-store /dev/st3 # LUN4:驱动器 4 initiator-address 192.168.81.7 # 只允许备份服务器接入 </target> EOF service tgtd start chkconfig tgtd on tgtadm --mode target --op showinitiator-address这一行在演练环境里容易被省略,但它决定了带库会不会被其他机器误连。演练网段里往往还有别的测试虚机,一旦有第二台机器登录同一个 target,同一盘磁带被两个 initiator 争用,表现是随机出现的 SCSI 保留冲突,日志里只会给一句 “device busy”,非常难查。
TSM 服务器一侧做登录,重新扫描后应该能看到多出来的mediumx与tape设备:
yum install -y iscsi-initiator-utils iscsiadm -m discovery -t st -p 192.168.81.6 iscsiadm -m node -T iqn.2024-01.lab.vtl:l700 -l lsscsi -g | grep -E 'mediumx|tape'登录成功后记录新的/dev/sgX与/dev/stX,它们才是 TSM 的define path要用的设备名。设备号在重启后可能变化,稳定的做法是用/dev/disk/by-path/下的持久链接,这一点在排障一章还会再提。
3. TSM 6.3 服务端配置:从识别设备到能跑策略
3.1 管理界面与服务器基础参数
TSM 6.3 在 Linux 上的管理入口是dsmadmc,第一次进去先确认服务器实例已经初始化、数据库和恢复日志目录有足够空间。演练环境里数据库用默认的小容量配置就够,但要显式激活策略集,否则后面定义的备份策略不会生效——这是新手最常漏的一步。
# 以管理员身份进入命令行管理界面 dsmadmc -id=admin -pa=admin # 查看服务器基本信息与活动策略集 query status query actlogquery status能看到服务器名称、版本、可用日志空间,日志空间不足时备份会在提交阶段失败而不是开始阶段,排查起来很有迷惑性。query actlog是后面所有排障的第一现场,任何设备、卷、会话问题都会在这里留下时间戳记录。
3.2 定义 library、drive、path:让 TSM 看见带库
TSM 认设备分三步:先定义库,再定义驱动器,最后给每个设备定义一条路径。顺序错了会报 “library not defined”,路径里的设备名写错则会在第一次挂载时才暴露。
/* 1. 定义 SCSI 类型的带库,库名 vtllib */ DEFINE LIBRARY VTLlib LIBTYPE=SCSI /* 2. 给库定义路径,DEVICE 指向机械手的通用设备 */ DEFINE PATH TSM_SERVER VTLlib SRCTYPE=SERVER DESTTYPE=LIBRARY - DEVICE=/dev/sg10 ONLINE=YES /* 3. 定义四台驱动器,ELEMENT 用自动探测,避免手工算地址 */ DEFINE DRIVE VTLlib DRIVE01 ELEMENT=AUTODETECT DEFINE DRIVE VTLlib DRIVE02 ELEMENT=AUTODETECT DEFINE DRIVE VTLlib DRIVE03 ELEMENT=AUTODETECT DEFINE DRIVE VTLlib DRIVE04 ELEMENT=AUTODETECT /* 4. 每个驱动器一条路径,DEVICE 指向对应的磁带设备 */ DEFINE PATH TSM_SERVER DRIVE01 SRCTYPE=SERVER DESTTYPE=DRIVE - LIBRARY=VTLlib DEVICE=/dev/st0 ONLINE=YES DEFINE PATH TSM_SERVER DRIVE02 SRCTYPE=SERVER DESTTYPE=DRIVE - LIBRARY=VTLlib DEVICE=/dev/st1 ONLINE=YESELEMENT=AUTODETECT让 TSM 自己去问机械手要地址,比手工填 256、257 稳。真正的验证命令是AUDIT LIBRARY,它会让机械手做一次全槽位扫描,能通就说明路径、驱动器和介质三者是一致的。
AUDIT LIBRARY VTLlib CHECKLABEL=BARCODE QUERY LIBRARY QUERY DRIVE QUERY PATHQUERY PATH的ONLINE一列必须全部为 YES,出现 NO 或空值,基本都是设备名写错或者权限不对——TSM 服务账号要对/dev/sg*、/dev/st*有读写权限,否则路径会定义成功但驱动器一直离线。
3.3 设备类、存储池与卷的标签入库
设备类决定“写磁带的格式”,存储池决定“数据往哪儿放”。虚拟带库模拟的是 LTO,设备类就按 LTO 建,格式选 DRIVE 表示由驱动器自己管块大小。
/* 设备类:LTO 类型,格式 DRIVE,绑定到 vtllib */ DEFINE DEVCLASS VTL_LTO4 DEVTYPE=LTO FORMAT=DRIVE LIBRARY=VTLlib /* 磁带存储池,最大 20 盘临时卷 */ DEFINE STGPOOL TAPEPOOL VTL_LTO4 MAXSCRATCH=20 /* 本地磁盘存储池,用于先把备份落到磁盘再迁移 */ DEFINE DEVCLASS DISKCLASS DEVTYPE=FILE MAXCAPACITY=10240 - DIRECTORY=/tsm/disk DEFINE STGPOOL DISKPOOL DISKCLASS MAXSCRATCH=10卷必须先贴标签再入库,否则 TSM 会把它当外来卷拒绝写入。LABEL LIBVOLUME一次搞定标签和入库,CHECKIN=SCRATCH表示贴完标签直接进临时卷池,后续备份可以直接取用。
/* 扫描带库中的条码,打标签并作为临时卷入库 */ LABEL LIBVOLUME VTLlib SEARCH=YES LABELSOURCE=BARCODE - CHECKIN=SCRATCH OVERWRITE=YES /* 查看临时卷数量,少于备份所需数量就先补卷 */ QUERY LIBVOLUME QUERY STGPOOL TAPEPOOLMAXSCRATCH=20是临时卷的上限,不是带库槽位上限。演练时 2GB 一盘的容量下,一个 Oracle 全备加归档可能吃掉四五盘,20 盘够用;但如果没有先LABEL LIBVOLUME就直接跑备份,作业会停在 “ANR1000I Waiting for mount”,日志里看不出缺卷,只看到在等。
3.4 策略域、管理类与调度:备份策略怎么落地
策略域是 TSM 的核心配置概念:域管一组客户端,域里挂策略集,策略集里挂管理类,管理类里定义副本组。四个层级一层不能少,激活策略集之后客户端才真正拥有备份策略。
/* 建域,默认目标存储池指向磁带池,指定默认管理类 */ DEFINE DOMAIN STD STGPOOL=TAPEPOOL DEFINE POLICYSET STD STANDARD DEFINE MGMTCLASS STD STANDARD ASSIGN DEFMGMTCLASS STD STANDARD STANDARD /* 副本组:备份到 TAPEPOOL,保留 2 个版本,删除后留 30 天 */ DEFINE COPYGROUP STD STANDARD STANDARD TYPE=BACKUP - DESTINATION=TAPEPOOL FREQUENCY=1 VEREXISTS=2 - VERDELETED=1 RETEXTRA=30 RETONLY=60 /* 激活策略集,不激活等于没配 */ ACTIVATE POLICYSET STD STANDARDFREQUENCY=1表示一天只保留一次有效备份,重复执行会被跳过,这在手工反复测试时容易让人误以为备份失败。VEREXISTS=2是保留两个版本,演练时想多留几份做对比就调到 3~4。激活之后用QUERY POLICYSET确认状态为 ACTIVE,这一步不做,客户端注册进来会拿到空策略。
调度部分建议先用管理员手工BACKUP NODE触发,把链路跑通再挂DEFINE SCHEDULE。演练报告里我更看重“能复现的手工步骤”,自动调度反而是最容易在答辩时被追问“你怎么证明它每天真的跑了”的地方。
3.5 客户端节点注册与本地磁盘备份
每台要被备份的机器在 TSM 里都是一个节点,节点名决定了它能看到哪些备份,异机恢复时这个名称尤其关键。
/* 注册 Oracle 与 DB2 两个客户端节点 */ REGISTER NODE ORACLE oracle_pwd DOMAIN=STD REGISTER NODE DB2NODE db2_pwd DOMAIN=STD /* 手工触发一次文件系统备份,验证链路 */ BACKUP NODE ORACLE /* 把磁盘池里的数据再迁移到磁带池 */ BACKUP STGPOOL TAPEPOOL DISKPOOL本地磁盘池的作用是让备份先落到高速介质,再由 TSM 在空闲时迁到磁带。演练里这个结构能省不少等待时间,也让“备份到本地磁盘”和“备份到带库”两条路径都能被验证到。BACKUP STGPOOL的目标池写前面、源池写后面,参数顺序反了会报语法错误,这个顺序第一次写基本都会翻车一次。
4. Oracle 11g 与 DB2 9.7:备份到带库与异机恢复的完整链路
4.1 NUB 客户端安装与配置三件套
Oracle 要通过 TSM 备份,装的是数据保护客户端(NUB/TDPO),它把 RMAN 的 SBT 接口翻译成 TSM 的 API 调用。装完之后配置有三个文件必须一一对应:dsm.opt指定节点,tdpo.opt指定 TDPO 的路径和日志,dsm.sys指定服务器地址。
# 客户端配置目录,以 64 位为例 cd /opt/tivoli/tsm/client/oracle/bin64 # dsm.opt:本节点名称必须和服务器上 REGISTER NODE 一致 cat dsm.opt # SErvername tsm_server # COMMMethod TCPip # TCPPort 1500 # TCPServeraddress 192.168.81.7 # NODENAME ORACLE # tdpo.opt:TDPO 自身的路径与日志 cat tdpo.opt # DSMI_ORC_CONFIG /opt/tivoli/tsm/client/oracle/bin64/dsm.opt # DSMI_LOG /opt/tivoli/tsm/client/oracle/bin64 # TDPO_NODE ORACLE # TDPO_PSWDPATH /opt/tivoli/tsm/client/oracle/bin64 # TDPO_OPTFILE /opt/tivoli/tsm/client/oracle/bin64/tdpo.optNODENAME和TDPO_NODE必须保持同一个值,这是异机恢复能不能拿到备份的唯一依据。密码用tdpoconf password交互生成,会在TDPO_PSWDPATH下写一个混淆文件,把这个文件拷到恢复机上比在新机器上重新注册节点靠谱得多。
4.2 RMAN 通过 SBT 接口备份到 TSM
RMAN 脚本本身不复杂,关键是 channel 类型和parms里指定的配置文件路径。归档日志备份后加delete input能在演练环境里省空间,但要确认归档已经被 TSM 接管之后再删。
rman target / run { allocate channel c1 type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; allocate channel c2 type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)'; sql 'alter system archive log current'; backup database plus archivelog delete input; backup current controlfile; release channel c1; release channel c2; }两个 channel 对应两台驱动器,写并行度不要超过实际驱动器数量,否则 TSM 会让多余的 channel 排队等挂载,备份时间反而更长。备份完成后在服务器侧用QUERY CONTENT确认数据真的落到了卷上:
QUERY CONTENT TAPEPOOL SELECT * FROM BACKUPS WHERE NODE_NAME='ORACLE'QUERY CONTENT只看得到卷级占用,SELECT查的是 TSM 数据库里的备份对象记录,两者数量对得上才算备份成功。只看 RMAN 输出里的 “Finished backup” 是不够的,那个提示只说明 RMAN 侧结束,不代表数据已经提交到磁带。
4.3 Oracle 异机恢复:从 spfile 到 open resetlogs
异机恢复的机器上先装同版本 Oracle 软件、建好目录结构,再把 TDPO 客户端装好,用原节点的密码文件登录。恢复顺序不能乱:参数文件、控制文件、数据文件、归档,最后才开库。
-- 1. 进入 nomount,从 TSM 上恢复参数文件 startup nomount; set dbid=1234567890; restore spfile from autobackup; -- 2. 用参数文件启动后恢复控制文件 startup nomount; restore controlfile from autobackup; alter database mount; -- 3. 恢复数据文件与归档,再执行恢复 restore database; recover database; -- 4. 打开数据库,必须带 resetlogs alter database open resetlogs;set dbid是异机恢复最容易被跳过的一步,不设置 DBID,RMAN 会去当前控制文件里找备份记录,找不到就报 “no backup found”,而备份其实安静地躺在 TSM 里。控制文件恢复之后再mount,恢复数据文件时 RMAN 才能知道该从哪个备份片取数据。
还有一处必须提前准备:恢复机上没有原机的归档日志,recover database会要求应用归档。要么在备份时就把归档一起备进去,要么在恢复机上手工从 TSM 取回归档片注册。演练时我习惯在备份脚本里把plus archivelog和current controlfile都带上,就是为了这一步不临时抓瞎。
4.4 DB2 9.7 的 TSM 备份与恢复
DB2 走的是另一条路径:不用 TDPO,而是通过VENDORPATH指向 TSM API 客户端库,由 DB2 自己调用。配置好之后备份命令非常短,但环境变量少一个就失败。
# 指向 TSM API 客户端库目录 db2 update dbm cfg using VENDORPATH /opt/tivoli/tsm/client/api/bin64 # 让 DB2 识别 TSM 为备份介质 db2 backup db sample use tsm # 查看 TSM 上该库的备份镜像 db2adutl query full # 恢复:指定时间戳,覆盖现有库 db2 restore db sample from tsm taken at 20240115103000 replace existingVENDORPATH指向的目录里必须有libApiTSM64.so,缺库时db2 backup会报 “SQL2036N”,提示信息只说介质无效,不会告诉你是路径问题。db2adutl query是最直接的验证手段,能列出对象说明 TSM 那条链路是通的;恢复时taken at的时间戳要精确到秒,写错或省略会报找不到可用镜像。
演练里我把 DB2 恢复分成两步做:先恢复到新库名验证备份可用,再用replace existing覆盖演练库,这样即使第一遍失败,原库还在,不至于从头再来。
4.5 备份有效性验证:从查询到真正 restore
“备份成功”和“备份可恢复”是两个不同的结论,验收时必须分别取证。查询类命令只能证明元数据在,只有真正跑一次 restore 才能证明数据完整。我的做法是每完成一个对象的备份,立刻做一次最小化恢复验证,把结果记录到验收表里。
# Oracle 侧:列出 TSM 上的备份片 tdpoconf showenvironment rman target / <<'EOF' list backup summary; EOF # DB2 侧:抽查最早的镜像是否还能读 db2adutl query full db sampletdpoconf showenvironment会打印当前生效的节点名、服务器地址和配置文件路径,三条信息任意一条不对,后面的备份都会写到别的地方去。这命令看起来平淡,但它是排查“备份到底写到哪个节点”最快的方式。
5. 排障清单:五类最容易翻车的坑
5.1 设备号漂移,TSM 找不到路径
现象:重启后dsmadmc里QUERY PATH显示驱动器 OFFLINE,AUDIT LIBRARY报设备打开失败,但设备明明存在。
原因:Linux 下/dev/sg*和/dev/st*是按扫描顺序分配的,插拔设备或调整虚机磁盘顺序后编号会变,原来路径里的设备名就指向了别的设备或者不存在。
解决:改用持久化设备名,把define path里的/dev/st0换成/dev/disk/by-path/下的稳定链接,或者用 udev 规则把带库设备绑成固定名字。已经配错的路径先DELETE PATH再按新设备名重建,然后重新AUDIT LIBRARY。
5.2 卷没标签或没入库,备份直接挂起
现象:备份作业一直停在 “ANR1000I Waiting for mount”,QUERY SESSION里会话状态不动,也没有报错。
原因:临时卷池里没有可用卷。带库槽位里有磁带,但这些磁带没有经过LABEL LIBVOLUME,TSM 不认为它们归自己管,宁可等也不去动。
解决:先QUERY LIBVOLUME看临时卷数量,不够就执行LABEL LIBVOLUME ... CHECKIN=SCRATCH补卷。已经贴过标签但状态是 PRIVATE 的卷,可以UPDATE LIBVOLUME改状态,不必整盘重贴。
5.3 节点名不一致,异机恢复拿不到备份
现象:恢复机上restore database报找不到备份,但备份服务器上QUERY CONTENT明明有数据。
原因:TDPO 侧TDPO_NODE和dsm.opt里的NODENAME与备份时用的节点名不同,或者复制过去的密码文件路径不在TDPO_PSWDPATH下。TSM 按节点隔离数据,节点名差一个字符都看不到对方的备份。
解决:tdpoconf showenvironment核对三处节点名,把备份机的密码文件拷到恢复机的TDPO_PSWDPATH,再试一次。确实需要换节点名时,在服务器上用GRANT PROXYNODE建立代理关系,不要图省事直接改客户端配置。
5.4 磁带容量与卷数估算错误,备份中途空间不足
现象:Oracle 全备跑到一半失败,RMAN 报介质错误,TSM 日志里出现卷写满后无法继续挂载。
原因:mhvtl.conf里的CAPACITY默认 500MB,很多人装完没改;或者池子里 scratch 卷数量按“够用一天”估的,大库一跑就穿。
解决:安装阶段就把CAPACITY提到 2046 或更大,并按“全备大小 ÷ 单盘容量 × 1.5”预留卷数。已经写满的卷不要强行续写,补新卷让 TSM 自动切换,同时检查MAXSCRATCH是否卡住了上限。
5.5 恢复顺序错,漏了归档开不了库
现象:数据文件恢复完成,recover database报缺少归档,或者open resetlogs提示需要更多恢复。
原因:备份时只备了数据文件没备归档,或者异机恢复时把归档漏了,导致 RMAN 无法把数据文件推进到一致点。
解决:备份脚本里固定包含plus archivelog,恢复时先restore archivelog all再recover database。已经缺归档的情况只能用recover database until cancel做不完整恢复,把损失明确写进演练报告,而不是假装恢复成功。
6. 验收与答辩:用一份可复现的恢复记录证明方案真的能用
这套方案最后要交的不是一份安装笔记,而是一份“证据链”。答辩或评审时最常被问的三个问题是:你怎么证明备份真写到了带上、你怎么证明恢复出来的库是完整的、换个人能不能照着做一遍。把这三个问题回答清楚,比堆十页配置截图有用。
我通常按下面的表逐项取证,每一项都要留下命令和输出片段,不能只写“已完成”:
| 验收项 | 验证命令 | 通过标准 |
|---|---|---|
| 虚拟带库可用 | mtx -f /dev/sg10 status | 槽位与驱动器状态正常,标签可读 |
| iSCSI 链路 | lsscsi -g | 客户端能看到 mediumx 与 tape |
| TSM 设备就绪 | QUERY PATH/AUDIT LIBRARY | 全部 ONLINE,审计无错误 |
| 卷管理 | QUERY LIBVOLUME | 临时卷数量满足本次备份 |
| Oracle 备份 | QUERY CONTENT+ RMAN 输出 | 备份片数量与大小匹配 |
| Oracle 异机恢复 | restore+open resetlogs | 库可读,关键表行数可查 |
| DB2 备份恢复 | db2adutl query+db2 restore | 恢复到指定时间点成功 |
| 可复现性 | 换账号重跑一遍脚本 | 步骤无隐含前提,结果一致 |
取证顺序有个小技巧:先做 DB2 再做 Oracle。DB2 的备份和恢复命令短、反馈直接,用它先把 TSM 客户端到带库的整条链跑顺,再去碰 Oracle 的 SBT 接口和 DBID,能省掉一半的排查时间。反过来先做 Oracle,一旦失败,你分不清是 TDPO 配置问题还是带库问题。
恢复完成后的完整性验证不能只看“数据库打开了”。Oracle 侧至少查一次关键业务表的行数和一张大表的COUNT(*),DB2 侧跑一次RUNSTATS加一条业务查询,把结果和备份前的基线对比,写进报告。这一步是答辩时唯一能证明“数据没丢”的东西,光有open resetlogs的成功提示,评委会继续追问。
还有一点值得提前准备:把整套操作整理成可执行脚本,而不是靠记忆点鼠标。重建环境时从yum依赖到define path一条条跑,跑不通的地方就是文档里漏写的前提条件。我一般会在演练最后故意清空一台虚机,用脚本重装一遍,能在一个下午内复现出来的方案,才算真能交付。
从那以后我每次做备份演练,都强制要求自己先写恢复步骤再写备份步骤——如果恢复路径规划不清楚,备份做得多漂亮都是自我安慰。希望这套结构能帮到你,把手上那份备份恢复方案真正落到可验收的程度。
本文还有配套的精品资源,点击获取