今天必须记住这个历史的时刻,工作3年多了,今天头一次遇到数据库需要恢复的情况,早上9点的时候,一个开发的人过来说培训的库访问不了,我赶紧看了看,发现ssh登陆失败,但是可以ping通,随后根据管理网地址登陆到ILO口上看下机器的文本界面,发现没有命了提示符了,随后果断将机器重启,焦急的等待了10分钟,发现pv无法访问,从报错日志看,基本可以确定是raid卡坏掉了,由于这是一台hp的机器,还好机器再保,赶紧联系厂商的人去修,得到的答案是下午1点才可以到现场。考虑到还有那么多人等着使用系统,随后通知领导,让领导去协调用户,其实就是安慰下用户。为了节省时间,我赶紧将数据库恢复到另一台机器上(DP从磁盘恢复)。
1 配置监听和sys密码文件(都是为dp链接时使用)
2 构造pfile文件,启动到nomount
3 恢复ctl文件
找到restore中要恢复的库,然后开始配置,随后就遇到了一个报错:
这个错误的原因很明显,就是说host找不到呗,当然找不到了,主机都down了,以前都是从在dp上从rac到rac的恢复测试,这个单机恢复我也没害怕,虽然这次有点紧张,但还是平静了一下,想了想,这种情况dp肯定是可以恢复的,随后我开始先配置options选项,让dp先知道我是异机恢复,就不要去尝试连接主机了,就这样,就这么简单,问题就解决了。以下是配置:
这里红色的部分就是client了,也就是异机恢复的那个主机名,这里我是主机名,但一定要是在备份服务器的hosts文件里写好,而且还得和备份服务器有连接,然后下面是异机os的信息,之后最重要的就是settings那,也就是下面sys那了,这里是刚才创建口令文件的密码。基本所有的信息都是异机的信息,也就是目标机器的信息。
随后在回到source选择restore:
然后就next,之后就restore了。
由于我是hp的机器,所有dp会将ctl文件恢复到var下,如下:
$ pwd
/var/opt/omni/tmp
$ ll
total 16
-rw-rw-rw- 1 orazkf oinstall 380 Dec 4 13:10 ob2_dpmctl_restore_5160_d08b.dma--在ctl正在恢复时,可以看到有这个文件,内容大概就是restore的信息,还有一会会产生的ctl的名字。待dp那restore完毕后,在看就可以看到ctl啦。
$ ll
total 19552
-rw-r----- 1 1000 oinstall 10010624 Dec 2 22:12 ctrl_ORCL1.dbf
$ file ctrl_ORCL1.dbf
ctrl_ORCL1.dbf: awk program text
$ rman target /
Recovery Manager: Release 11.1.0.6.0 - Production on Wed Dec 4 13:27:26 2013
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: ZKFT1 (not mounted)
RMAN> restore controlfile from '/var/opt/omni/tmp/ctrl_ORCL1.dbf';
接下来就是恢复datafile:
$ sqlplus / as sysdba
SQL> alter database mount;
Database altered.
在rman中执行以下命令:
run {
allocate channel 'dev_0' type 'sbt_tape'
parms 'SBT_LIBRARY=/opt/omni/lib/libob2oracle8_64bit.so,ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=ORCL1,OB2BARLIST=ORCL1)';
send device type 'sbt_tape' 'OB2BARHOSTNAME=原库主机名';
restore database from tag 'TAG20131202T220019';---这里tag是通过list backup来看到的。
release channel 'dev_0';
}
恢复归档文件:
RMAN> list backup of archivelog all summary completed after "to_date('2013-12-02 22:00:00','yyyy-mm-dd hh24:mi:ss')";
List of Backups
===============
Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag
------- -- -- - ----------- --------------- ------- ------- ---------- ---
8370 B A A SBT_TAPE 02-DEC-13 1 1 NO TAG20131202T220901
8371 B A A SBT_TAPE 02-DEC-13 1 1 NO TAG20131202T220901
8372 B A A SBT_TAPE 02-DEC-13 1 1 NO TAG20131202T220901
run {
allocate channel 'dev_0' type 'sbt_tape'
parms 'SBT_LIBRARY=/opt/omni/lib/libob2oracle8_64bit.so,ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=ORCL1,OB2BARLIST=ORCL1)';
send device type 'sbt_tape' 'OB2BARHOSTNAME=原库主机名';
restore archivelog time between "to_date('2013-12-02 22:00:00','YYYY-MM-DD HH24:MI:SS')" and "to_date('2013-12-03 12:30:00','YYYY-MM-DD HH24:MI:SS')";
release channel 'dev_0';
}
为了减少篇幅,我之类就写了一个通道,其实可以多分配几个的。
然后到sql窗口执行:
sql>recover database using backup controlfile;
sql>alter database open resetlogs;
随后更改应用服务器上链接db的信息,最后将应用拉起来。
最后说下感受:
工作这么久,一直认为恢复离自己好远,因为在第一家公司工作的时候根本就没有恢复过,连测试都没有过,现在在第二家公司,数据变得重要了,偶尔还做个恢复测试,但那种心情,真是毫无压力,以前做过一次帮用户找数据的恢复,当时是nbu,恢复到solaris的机器上,相对心情也不错,感觉不到救火的心情,但这次真的不一样了,n多n多的用户再等着你解决。不过遇到问题的时候,真的,心有点慌呀。看来还是救火救的少呀。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24500180/viewspace-1062197/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24500180/viewspace-1062197/