今天仍旧是rman,恢复篇,而且笔者十分不负责任地不做有关数据文件的恢复,因为网上实在是太多人做这个了,所以笔者头上出角,做controlfile和spfile的恢复……

其实controlfile和spfile也是很重要的,controlfile的重要性不必多说。控制文件丢失或者损坏的话那是必须不完全回复的。关于spfile,有人说丢了也无所谓,用临时的pfile重建就是了,然后再生成spfile,就算都丢失了还可以手工重写。笔者承认,spfile的丢失不能算是灾难性的,但是如果一个dba花费了很多精力根据数据库设置配的参数说丢失就丢失了,那何尝不是一种悲剧- -||(请勿对号入座)

那言归正传,我们下面就来看整个操作。

先说环境,还是和上篇一样,nocatalog

恢复之前做一个备份,下面是笔者自己写的备份脚本:

run {
configure controlfile autobackup on;
configure controlfile autobackup format for device type disk to '/home/oracle/%F';
backup format '/home/oracle/rmantest/%U' database
plus archivelog
delete all input;
}

要注意目录必须是存在的,不然也会报错哦~

先解释一下开头的configure,那如果确实是全权对数据库负责的话,还是建议在脚本里加上configure,毕竟这样可以保证使用自己定制的策略。至于对controlfile的备份,不仅可以采用笔者这样的方法,也可以在备份的时候加上include current controlfile的语句来备份控制文件。要注意的是,spfile在开启autobackup 的情况下也会和控制文件一起被备份,恢复的时候也是用的同一个备份文件,详情可以看后面的演示。

%F,这个是autobackup专用的一个存储标识,由dbid和时间组成,需要注意的是只能用于autobackup,如果在backup format的时候指定%F是会报错的。至于%U和还有其他的命名标识,笔者这里不复制粘贴了,大家要学会自己动手,g一下就能知道。

plus archivelog 这句语句是用来备份归档的,主要是一下5个步骤:

1>.运行ALTER SYSTEM ARCHIVE LOG CURRENT语句对当前redolog进行归档。

2>.执行BACKUP ARCHIVELOG ALL命令备份所有已归档日志。

3>.执行BACKUP命令对指定项进行备份。

4>.再次运行ALTER SYSTEM ARCHIVE LOG CURRENT对当前redolog归档。

5>.对新生成的尚未备份的归档文件进行备份。(摘自三思笔记)

至于delete all input,上章讲过了,笔者就不再废话一次了。

然后连接rman并执行脚本,可以在rman连接的时候就用cmdfile指定脚本路径,rman target / cmdfile=/home/oracle/mybkp.rman,也可以在连接rman之后,用@命令,rman>@mybkp.rman。

然后大胆删除控制文件()

尝试启动数据库(能起来才怪),接下来就是rman大显身手了!

我们一点一点来,慢慢摸索,“想当然”地一步一步做,遇到错误再分析再动手。

首先startup force,没有控制文件自然只能到nomount阶段。

RMAN> startup force; 
Oracle instance started 
RMAN-00571: =========================================================== 
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== 
RMAN-00571: =========================================================== 
RMAN-03002: failure of startup command at 07/26/2011 22:23:44 
ORA-00205: error in identifying control file, check alert log for more info 

RMAN> restore controlfile;#想当然restore一下,结果发现应该from autobackup 
Starting restore at 26-JUL-11 
allocated channel: ORA_DISK_1 
channel ORA_DISK_1: sid=157 devtype=DISK 
RMAN-00571: =========================================================== 
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== 
RMAN-00571: =========================================================== 
RMAN-03002: failure of restore command at 07/26/2011 22:24:37 
RMAN-06563: control file or SPFILE must be restored using FROM AUTOBACKUP

RMAN> restore controlfile from autobackup; Starting restore at 26-JUL-11 
using channel ORA_DISK_1 
recovery area destination: /u01/app/oracle/flash_recovery_area 
database name (or database unique name) used for search: ORCL 
channel ORA_DISK_1: no autobackups found in the recovery area 
channel ORA_DISK_1: looking for autobackup on day: 20110726 
channel ORA_DISK_1: looking for autobackup on day: 20110725 
channel ORA_DISK_1: looking for autobackup on day: 20110724 
channel ORA_DISK_1: looking for autobackup on day: 20110723 
channel ORA_DISK_1: looking for autobackup on day: 20110722 
channel ORA_DISK_1: looking for autobackup on day: 20110721 
channel ORA_DISK_1: looking for autobackup on day: 20110720 
channel ORA_DISK_1: no autobackup in 7 days found 
RMAN-00571: =========================================================== 
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== 
RMAN-00571: =========================================================== 
RMAN-03002: failure of restore command at 07/26/2011 22:25:37 
RMAN-06172: no autobackup found or specified handle is not a valid copy or piece

 #发现oracle说着不到备份信息,记得咱们明明是configure autobackup on的呀,怎么会找不到呢?这里笔者要跟大家说了,因为笔者指定了归档的路径,也就是刚的第二条命令

configure controlfile autobackup format for device type disk to '/home/oracle/%F'; 如果是这样的话,那必须在恢复的时候指定路径(只有控制文件和参数文件需要,数据文件可以直接restore)

那接下来就一路顺风了,过程太长,笔者就把命令贴出来了。

rman>restore controlfile from ‘/home/oracle/c-1274771181-20110726-00’;

rman>sql'alter database mount';

rman>restore database;

rman>recover database;

rman>sql'alter database open resetlogs';

由于是控制文件丢失,必须做不完全恢复~恢复后记得做个整库备份哦!一个优秀的dba应该有个好的习惯。 

这样就完成了!那参数文件呢?参数文件绝大多数情况和控制文件是一样的。只不过开始时多了一步,我们来看看。 (有关于参数文件的命名啊,spfile和pfile啊,还有oralce查找参数文件的顺序啊,这里就省略了,模拟丢失spfile和pfile的情况)

RMAN> restore spfile from autobackup; 
Starting restore at 26-JUL-11 
using target database control file instead of recovery catalog 
allocated channel: ORA_DISK_1 
channel ORA_DISK_1: sid=36 devtype=DISK 
RMAN-00571: =========================================================== 
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== 
RMAN-00571: =========================================================== 
RMAN-03002: failure of restore command at 07/26/2011 22:45:10 
RMAN-06495: must explicitly specify DBID with SET DBID command

这里和前面稍稍有些不同哦,说必须设置dbid,dbid获取的方法有很多啦,在v$database里有,之前的rman登录时也有,但是现在数据库起不来,都不行,肿么办呢?不急,前面的%F有用了,autobackup的备份文件如下 /home/oracle/c-1274771181-20110726-01,其中1274771181就是dbid,那这里运行命令: 

RMAN> set dbid 1274771181; 
executing command: SET DBID

接下来的步骤和controlfile是一模一样的 只要restore spfile from '/home/oracle/c-1274771181-20110726-01就可以重新启动数据库了,不需要做数据文件的恢复啦,大家自己试试吧!

(需要注意的是如果直接运行

restore spfile from '/home/oracle/c-1274771181-20110726-01

那rman就会直接恢复spfile,不用再设置dbid了)

 

控制文件和参数文件的备份就到这里了,写得也不少,希望大家可以和笔者一样,自己动手试试,只有这样才会有进步嘛~