前段时间,在进行泰国的某数据库的容灾测试,大致的步骤是先在容灾机器上恢复操作系统,包括TSM的必要文件和TSM自身的数据库,再用TSM还原相应的文件,如oracle的软件,最后再用rman直接读取带库恢复数据库。在这里把遇到的报错做一记录,以备查验。
我们的环境是数据库服务器和客户端在同一个机器上。在恢复数据库的第一步,从磁带还原控制文件的时候,发生报错了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
RMAN> run { 2> allocate channel c1 type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/usr/tivoli/tsm/client/oracle/bin64/tdpo_tstas015_d.opt)'; 3> restore controlfile FROM 'ctrl_3897_1_747929350'; 4> alter database mount; 5> release channel c1; 6> } allocated channel: c1 channel c1: sid=12 devtype=SBT_TAPE channel c1: Data Protection for Oracle: version 5.4.1.0 Starting restore at 11-APR-11 channel c1: restoring controlfile released channel: c1 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of restore command at 04/11/2011 17:30:46 ORA-19501: read error on file "ctrl_3897_1_747929350", blockno 1 (blocksize=512) ORA-27190: skgfrd: sbtread2 returned error ORA-19511: Error received from media manager layer, error text: ANS1314E (RC14) File data currently unavailable on server RMAN> |
这个报错最关键的一句是最后一句:ANS1314E (RC14) File data currently unavailable on server。它是个client message,大意是需要restore的文件在备份服务器端找不到,而引起这个文件在备份服务器端找不到的原因可能是以下:
(1)数据在备份服务器上丢失
(2)备份服务器读错误
(3)对应的文件正在备份服务器上正在做reclaim操作
(4)备份服务器要求的磁带已经被标注成unavaliable了。
我们顺着在rman环境变量的配置的TDPO_OPTFILE一路找下去(注:TDPO全称是Tivoli Data Protection for Oracle)。
ENV=(TDPO_OPTFILE=/usr/tivoli/tsm/client/oracle/bin64/tdpo_tstas015_d.opt),因此我们先去找/usr/tivoli/tsm/client/oracle/bin64/tdpo_tstas015_d.opt 这个opt文件(这个opt file位于客户端)在我们这个环境中,tdpo_tstas015_d.opt这个文件其实是一个合集,类似的,你在exp的时候,写一个par file是一样的道理。
如果你把tdpo_tstas015_d.opt中的内容放在rman的ENV一样可以:
1 2 3 4 5 6 7 |
run { 2> allocate channel c1 type 'sbt_tape' parms 'ENV=( DSMI_ORC_CONFIG=/usr/tivoli/tsm/client/oracle/bin64/dsm_tdpo_day.opt, TDPO_FS=ORACLEDB_TSTAS015, TDPO_NODE=tstas015_d_oracle )'; |
这样也是一样效果的。
我们来看一下这个文件的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
[oracle@tstas020:/bustools/oracle/xxx]# cat /usr/tivoli/tsm/client/oracle/bin64/tdpo_tstas015_d.opt *************************************************************************** * IBM Tivoli Storage Manager for Databases * Data Protection for Oracle * * Sample tdpo.opt for the AIX Data Protection for Oracle 64bit ********************************************************************* *DSMI_ORC_CONFIG /usr/tivoli/tsm/client/oracle/bin64/dsm.opt *DSMI_LOG /home/<oracle> *TDPO_FS adsmorc *TDPO_NODE <hostname> *TDPO_OWNER <username> *TDPO_PSWDPATH /usr/tivoli/tsm/client/oracle/bin64 *TDPO_DATE_FMT 1 *TDPO_NUM_FMT 1 *TDPO_TIME_FMT 1 *TDPO_MGMT_CLASS_2 mgmtclass2 *TDPO_MGMT_CLASS_3 mgmtclass3 *TDPO_MGMT_CLASS_4 mgmtclass4 DSMI_ORC_CONFIG /usr/tivoli/tsm/client/oracle/bin64/dsm_tdpo_day.opt TDPO_FS ORACLEDB_TSTAS015 TDPO_NODE tstas015_d_oracle [oracle@tstas020:/bustools/oracle/xxx]# |
在这个文件中,有几个针对oracle的非常重要的环境变量的配置:
DSMI_ORC_CONFIG:它指向API option file(dsm.opt)的路径,(这个参数如果备份DB2就是DSMI_CONFIG了,ORC代表oracle),这个API option file中会设置相关的Servername。
DSMO_FS:它包括了TSM服务器端filespace的名字,默认的名字是/adsmorc.
在这里,我找了DSMI_ORC_CONFIG 配置文件是/usr/tivoli/tsm/client/oracle/bin64/dsm_tdpo_day.opt,它属于user option file(以opt结尾):
1 2 |
[oracle@tstas020:/bustools/oracle/xxx/product/9.2.0.5/network/admin]# cat /usr/tivoli/tsm/client/oracle/bin64/dsm_tdpo_day.opt SErvername tsm_oracle_daily |
我们看到了SErvername是tsm_oracle_daily。
因此,我们要继续从user option file,去找system option file。而这个file,就是dsm.sys。
大致的途径,如下图:
dsm.sys文件通过在api路径下,在我们的环境中,即/usr/tivoli/tsm/client/api/bin64中,不过我发现他不在这个目录下,但做了个软链:
1 2 3 4 5 6 7 8 9 10 |
[root@tstas015:/usr/tivoli/tsm/client/api/bin64]# ls -l total 21240 -rw-r--r-- 1 root system 29 Dec 22 2008 dsm.opt -rw-r--r-- 1 root system 782 Mar 29 2009 dsm.opt.smp lrwxrwxrwx 1 root system 20 Aug 07 2008 dsm.sys -> ../../ba/bin/dsm.sys -rw-r--r-- 1 root system 971 Mar 29 2009 dsm.sys.smp -rwsr-xr-x 1 root system 5085448 Apr 22 2009 dsmtca lrwxrwxrwx 1 root system 33 Jul 15 2009 en_US -> /usr/tivoli/tsm/client/lang/en_US -rw-r--r-- 1 root system 5769233 Apr 22 2009 libApiTSM64.a drwxr-xr-x 2 root system 4096 Apr 22 2009 sample |
ok,我们去找/usr/tivoli/tsm/client/ba/bin/dsm.sys,并且,在TSM的dsm.sys配置文件中,我们去找对应Servername为tsm_oracle_daily节点的信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
[root@tstas020:/usr/tivoli/tsm/client/ba/bin]# cat dsm.sys ************************************************************************ * Tivoli Storage Manager * * * * Sample Client System Options file for AIX and SunOS (dsm.sys.smp) * ************************************************************************ * This file contains the minimum options required to get started * using TSM. Copy dsm.sys.smp to dsm.sys. In the dsm.sys file, * enter the appropriate values for each option listed below and * remove the leading asterisk (*) for each one. * If your client node communicates with multiple TSM servers, be * sure to add a stanza, beginning with the SERVERNAME option, for * each additional server. ************************************************************************ SErvername tsm_daily COMMMethod TCPip TCPPort 1500 TCPServeraddress 10.76.48.140 TCPClientaddress 10.76.48.140 Nodename tstas015_d Passwordaccess Generate Schedmode prompt TCPClientport 1501 Schedlogname /tsm/logs/dsmsched_daily.log ERRORLOGNAME /tsm/logs/dsmerror_daily.log Passworddir /usr/tivoli/tsm/client/ba/bin/pwd/daily SCHEDLOGRETENTION 7 D ERRORLOGRETENTION 7 D HTTPPORT 1581 exclude "/busdata/rfyt/tst0/_lgi/oracle/vol1/.../*" exclude "/busdata/rfyt/tst0/_lgi/oracle/vol2/.../*" SErvername tsm_monthly COMMMethod TCPip TCPPort 1500 TCPServeraddress tstas015.tst.mycompan.com TCPClientaddress tstas015.tst.mycompan.com Nodename tstas015_m Passwordaccess Generate Schedmode prompt TCPClientport 1502 Schedlogname /tsm/logs/dsmsched_monthly.log ERRORLOGNAME /tsm/logs/dsmerror_monthly.log Passworddir /usr/tivoli/tsm/client/ba/bin/pwd/monthly SCHEDLOGRETENTION 12 D ERRORLOGRETENTION 12 D HTTPPORT 1582 exclude "/busdata/rfyt/tst0/_lgi/oracle/vol1/.../*" exclude "/busdata/rfyt/tst0/_lgi/oracle/vol2/.../*" SErvername tsm_yearly COMMMethod TCPip TCPPort 1500 TCPServeraddress tstas015.tst.mycompan.com TCPClientaddress tstas015.tst.mycompan.com Nodename tstas015_y Passwordaccess Generate Schedmode prompt TCPClientport 1503 Schedlogname /tsm/logs/dsmsched_yearly.log ERRORLOGNAME /tsm/logs/dsmerror_yearly.log Passworddir /usr/tivoli/tsm/client/ba/bin/pwd/yearly SCHEDLOGRETENTION 10 D ERRORLOGRETENTION 10 D HTTPPORT 1583 SErvername tsm_oracle_daily COMMMethod TCPip TCPPort 1500 TCPServeraddress tstas015.tst.mycompan.com TCPClientaddress tstas015.tst.mycompan.com Nodename tstas015_d_oracle Passwordaccess Prompt Schedmode prompted SCHEDLOGRETENTION 7 D ERRORLOGRETENTION 7 D Schedlogname /tsm/logs/dsmsched_oracle_daily.log ERRORLOGNAME /tsm/logs/dsmerror_oracle_daily.log Passworddir /usr/tivoli/tsm/client/oracle/bin64/pwd/daily SErvername tsm_oracle_monthly COMMMethod TCPip TCPPort 1500 TCPServeraddress tstas015.tst.mycompan.com TCPClientaddress tstas015.tst.mycompan.com Nodename tstas015_m_oracle Passwordaccess Prompt Schedmode prompt TCPClientport 1502 Schedlogname /tsm/logs/dsmsched_oracle_monthly.log ERRORLOGNAME /tsm/logs/dsmerror_oracle_monthly.log Passworddir /usr/tivoli/tsm/client/oracle/bin64/pwd/monthly SCHEDLOGRETENTION 12 D ERRORLOGRETENTION 12 D SErvername tsm_oracle_yearly COMMMethod TCPip TCPPort 1500 TCPServeraddress tstas015.tst.mycompan.com TCPClientaddress tstas015.tst.mycompan.com Nodename tstas015_y_oracle Passwordaccess Prompt Schedmode prompt TCPClientport 1503 Schedlogname /tsm/logs/dsmsched_oracle_yearly.log ERRORLOGNAME /tsm/logs/dsmerror_oracle_yearly.log Passworddir /usr/tivoli/tsm/client/oracle/bin64/pwd/yearly SCHEDLOGRETENTION 12 D ERRORLOGRETENTION 12 D [root@tstas020:/usr/tivoli/tsm/client/ba/bin]# |
我们看关于日备tsm_oracle_daily的那段:
第一行SErvername 表示定义的服务器端的名称tsm_oracle_daily,
第二行 COMMMethod TCPip表示客户端和服务器端的通讯方式
第三行 TCPPort 1500表示客户端和服务器端的通讯端口
第四行 TCPServeraddress 表示服务器的hostname为tstas015.tst.mycompan.com(这个可以配置IP地址,如果配的是hostname,需要在/etc/hosts中做解析)
第五行 TCPClientaddress 表示客户端的hostname为tstas015.tst.mycompan.com(这个可以配置IP地址,如果配的是hostname,需要在/etc/hosts中做解析)
第六行 nodename表示这台客户端的节点名称tstas015_d_oracle。该配置类似于第一行,不过这个是客户端的名称,第一行是服务器端的名称。
因此,这边的第四和第五行就有点问题了,由于进行容灾测试的时候,机器是另外一个台机器(tstas020),已经不再是tstas015这台server,因此,我们要更换成tstas020的IP(因为容灾测试机,没配hosts解析)。
因此,问题已经明确,修改TCPServeraddress和TCPClientaddress为容灾机的地址,再次尝试rmanrestore,成功。
综上所述,对于TSM中从rman脚本到tsm配置的查找路径为:rman环境变量中的tdpo.opt->TSM的bin下的dsm.opt->TSM的api下dsm.sys。