一步一步学RMAN第八篇 演练rman恢复
首先注意:rman备份的时候并不会备份临时表空间的数据文件(想想也是,反正是临时的,备它干嘛),所以完全恢复之后,如果临时表空间的数据文件也丢失,需要手工重新创建临时表空间的数据文件。据消息灵通人士称,10G之后的版本会在恢复过程中自动创建临时表空间的数据文件,手头没有环境(11g都出了,俺还在学9i,落后啊。),未经尝试,有心的朋友如果落实该消息,也不妨通知俺一下:)
其次需要了解:Oracle数据库的恢复实际上包含了两个概念:数据库修复(RESTORE)与数据库恢复(RECOVER):
数据库修复:是指利用备份的数据库文件来替换已经损坏的数据库文件或者将其恢复到一个新的位置。RMAN在进行修复操作时,会利用恢复目录(没有建立恢复目录的话就使用目标数据库的控制文件)来获取备份信息,并从中选择最合适的备份进行修复操作。选择备份时有两个原则(1、选择距离恢复目录时刻最近;2、优先选择镜像复制,其次才是备份集)
数据库恢复:是指利用重做日志或增量备份来重建丢失的数据。
再然后需要明白:我们在对目标数据库做任何形式的修复或者恢复之前,目标数据库必须处于加载状态,恢复指定数据文件时,也可以在打开状态下恢复(什么,控制文件丢了,进不了加载状态?黑黑,麻烦了,不过也并非完全无可救药,接着往下看吧)。
一、对数据库进行完全介质恢复
过程有三个步骤:
1、启动数据库到加载状态
RMAN>?SHUTDOWN?IMMEDIATE;
RMAN>?STARTUP?MOUNT;
2、执行恢复操作(记的我们刚说过的,恢复分两步,有先有后的。)
RMAN>?RESTORE?DATABASE;
RMAN>?RECOVER?DATABASE?DELETE?ARCHIVELOGS?SKIP?TABLESPACE?TEMP;
注意:DELETE?ARCHIVELOGS和SKIP?TABLESPACE两个参数是可选择的,作用如下:
DELETE?ARCHIVELOGS:表示RMAN将在完成恢复过程后自动删除那些在恢复过程中修复的归档日志文件。
SKIP?TABLESPACE:跳过指定表空间,比如临时表,当然临时表空间即使你不跳过它也不会恢复的。
3、打开数据库
RMAN>?ALTER?DATABASE?OPEN;
此处需要注意的一点是,如果你的数据库并非处于归档模式,那么必须使用ALTER?DATABASE?OPEN?RESETLOGS来打开数据库,因为RMAN会认为在非归档模式下是一个不一致的备份,执行resetlogs之后,oracle将会把scn重新置为0。
二、恢复表空间
同样也可以分成三个步骤:
1、启动数据库到加载状态
RMAN>?SHUTDOWN?IMMEDIATE;
RMAN>?STARTUP?MOUNT;
2、进行恢复操作,在恢复之前,如果需要被恢复的表空间未处于脱机状态,需要通过alter?tablespace?...?Offline语句将其置为脱机:
RMAN>?SQL?'ALTER?TABLESPACE?jweb?OFFLINE?IMMEDIATE';
RMAN>?RESTORE?TABLESPACE?jweb;
RMAN>?RECOVER?TABLESPACE?jweb;
RMAN>?SQL?'ALTER?TABLESPACE?jweb?ONLINE';
3、打开数据库
RMAN>?ALTER?DATABASE?OPEN;
三、恢复数据文件
事实上,恢复表空间实际就是恢复其所对应的数据文件(一个表空间可能对应多个数据文件),所以步骤与上相似。
1、启动数据库到加载状态
RMAN>?SHUTDOWN?IMMEDIATE;
RMAN>?STARTUP?MOUNT;
2、进行恢复操作,在恢复之前,如果需要被恢复的表空间未处于脱机状态,需要通过alter?tablespace?...?Offline语句将其置为脱机,操作数据文件时可以直接指定数据文件,也可以以数据文件序号代替:
RMAN>SQL?'ALTER?DATABASE?DATAFILE?10?OFFLINE;
RMAN>?RESTORE?DATAFILE?10;
RMAN>?RECOVER?DATAFILE?10;
RMAN>SQL?'?ALTER?DATABASE?DATAFILE?10?ONLINE;
3、打开数据库
RMAN>?ALTER?DATABASE?OPEN;
四、示例:归档模式下,假设某数据文件丢失,恢复该数据文件。
我们来模拟一个过程,首先我们创建一份数据库的完全备份,然后在数据库中进行若干操作,之后删除该数据文件来模拟该文件意外丢失,最后我们通过rman来恢复该数据文件。
还记的我们6章实战备份里写的备份脚本吗,ok,我们先执行该脚本,进行数据库备份。
E:\oracleScript\backup>?database_backup_jssweb.bat
千万表忘了执行完之后看一下输出的log,一定要确保你所有的操作都是正确执行了的。
Ok,下面连接数据库模拟一些操作。(我懒,以下就少注文字,大家重点看过程就是了。)
C:\Documents?and?Settings\Administrator>sqlplus?/nolog
SQL*Plus:?Release?9.2.0.1.0?-?Production?on?星期三?7月?18?10:17:44?2007
Copyright?(c)?1982,?2002,?Oracle?Corporation.??All?rights?reserved.
SQL>?conn?jss/jss
已连接。
SQL>?create?table?tmp3(col?varchar2(50));
######创建一个临时表并插入一些数据
表已创建。
SQL>?insert?into?tmp3?values?('test1');
已创建?1?行。
SQL>?insert?into?tmp3?values?('test2');
已创建?1?行。
SQL>?insert?into?tmp3?values?('test3');
已创建?1?行。
SQL>?select?*from?tmp3;
COL
--------------------------------------------------
test1
test2
test3
SQL>?commit;
提交完成。
SQL>?conn?/?as?sysdba????####已dba用户连接并关闭数据库
已连接。
SQL>?shutdown?immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE?例程已经关闭。
SQL>?host?del?F:\OraHome1\oradata\jssweb\jweb.ora
######手动删除数据文件
SQL>?startup
ORACLE?例程已经启动。
Total?System?Global?Area??143727516?bytes
Fixed?Size???????????????????453532?bytes
Variable?Size?????????????109051904?bytes
Database?Buffers???????????33554432?bytes
Redo?Buffers?????????????????667648?bytes
数据库装载完毕。
ORA-01157:?无法标识/锁定数据文件?10?-?请参阅?DBWR?跟踪文件
ORA-01110:?数据文件?10:?'F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA'
#######看看,启动报错了吧
SQL>?select?instance_name,status?from?v$instance;
#######看看当前数据库状态,应该是处于mount
INSTANCE_NAME????STATUS
----------------?------------
jssweb???????????MOUNTED
OK,下面该RMAN出马了。
SQL>exit
C:\Documents?and?Settings\Administrator>set?oracle_sid=jssweb
C:\Documents?and?Settings\Administrator>rman?target?/
恢复管理器:?版本9.2.0.1.0?-?Production
Copyright?(c)?1995,?2002,?Oracle?Corporation.??All?rights?reserved.
连接到目标数据库:?JSSWEB?(DBID=3391142503)
RMAN>?restore?datafile?'F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA';
####首先修复数据文件。是不是有疑问,为什么不像上面第三节讲的那样先将该数据文件置为脱机,笨啊你,数据库都没打开,脱什么机啊,整个数据库现在都是脱机的。
启动?restore?于?18-7月?-07
正在使用目标数据库控制文件替代恢复目录
分配的通道:?ORA_DISK_1
通道?ORA_DISK_1:?sid=11?devtype=DISK
通道?ORA_DISK_1:?正在开始恢复数据文件备份集
通道?ORA_DISK_1:?正在指定从备份集恢复的数据文件
正将数据文件00010恢复到F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA
通道?ORA_DISK_1:?已恢复备份段?1
段?handle=D:\BACKUP\1AIN4JU5_1_1?tag=TAG20070718T092837?params=NULL
通道?ORA_DISK_1:?恢复完成
完成?restore?于?18-7月?-07
RMAN>?recover?datafile?'F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA';
########恢复数据文件
启动?recover?于?18-7月?-07
使用通道?ORA_DISK_1
正在开始介质的恢复
完成介质的恢复
完成?recover?于?18-7月?-07
RMAN>?alter?database?open;???########看起来很顺利,打开数据库看看
数据库已打开
RMAN>?host;
Microsoft?Windows?[版本?5.2.3790]
(C)?版权所有?1985-2003?Microsoft?Corp.
C:\Documents?and?Settings\Administrator>sqlplus?jss/jss??####连到该用户
SQL*Plus:?Release?9.2.0.1.0?-?Production?on?星期三?7月?18?10:33:50?2007
Copyright?(c)?1982,?2002,?Oracle?Corporation.??All?rights?reserved.
连接到:
Oracle9i?Enterprise?Edition?Release?9.2.0.1.0?-?Production
With?the?Partitioning,?OLAP?and?Oracle?Data?Mining?options
JServer?Release?9.2.0.1.0?-?Production
SQL>?select?*from?tmp3;?????######查询我们备份后创建的表
COL
--------------------------------------------------
test1
test2
test3
#######yeah,成功恢复,没有数据丢失。
SQL>
附个SQL:用来查询数据文件,临时文件与表空间对应及数据文件序号:
select?ts.tablespace_name,?df.file_name,?df.file_id,?tf.file_name
??from?dba_tablespaces?ts,?dba_data_files?df,?dba_temp_files?tf
?where?ts.tablespace_name?=?df.tablespace_name(+)
???and?ts.tablespace_name?=?tf.tablespace_name(+)