在Oracle中,三大文件即控制文件,数据文件,日志文件的丢失与破坏都将需要使用还原或恢复来使数据库正常化。而RMAN还原与恢复

是实现数据库完整性、可靠性必不可少的手段之一。还原简言之即是将所需的文件从备份中复制到原来文件所在的路径。还原通常可以包括

数据库、表空间、数据文件级别的还原。通常还原后的内容会滞后于最新的数据库SCN,因此将归档日志、联机重做日志文件中的内容更新到

还原的数据文件中,这个过程称之为恢复。

 

    恢复的几种情形

        1.在mount 或open 阶段完成的灾难恢复

            非系统表空间,undo表空间,所有的数据文件

        2.在nomount 阶段完成的灾难恢复

            控制文件(controlfile)

        3.在mount 阶段完成的灾难恢复

            系统表空间,联机重做日志文件

   

一、RMAN在归档模式下的还原与恢复的简化例子

> connect target /   连接到目标数据库 或 rman target sys/change_on_install@testdb
> startup mount;
> restore database;
> recover database;
> alter database open;
 rman target / log d:\logs\rman_log.txt rman会将执行的结果直接输出到指定的d:\logs\rman_log.txt文件

二、使用RMAN进行还原与恢复(非catalog方式)  

 

    1.数据文件丢失的恢复处理

--设定客户端环境变量并连接到数据库

:/>set NLS_LANG=AMERICAN_AMERICA.AL32UTF8
 
:/>rman target sys/redhat@dedicated nocatalog

       

--对数据库做全备

> backup as
> format  '/u01/bk/rmbk/wb_%U'
> tag=Whole_bak database;
 
> sql  'alter system archive log current';

           

--对数据库做级增量备份

>
> allocate channel ch1 type disk;
> backup incremental level 0 database
> format '/u01/bk/rmbk/Inc_0_%U'
> tag=Inc_0;
> release channel ch1;}

 

--对表插入新记录并切换日志

> select * from tb2;
 
NAME
---------- ---------------------------------------------
                     1 Robinson
                     2 Henry
 
> insert into tb2 select 3,'Danny' from dual;
 
> commit;
 
> alter system checkpoint;
 
> alter system switch logfile;

           

--对数据库做级增量备份

>
>  allocate channel ch1 type disk;
>  backup incremental level 1 database
>  format '/u01/bk/rmbk/Inc_1%U'
>  tag=Inc_1;
>  release channel ch1;}
 
> shutdown immediate;   --关闭数据库
 
> ho rm $ORACLE_BASE/oradata/orcl/*.dbf  --删除所有的数据文件 */
 
>

 

--使用RMAN连接到未mount状态的数据库

> connect target sys/redhat@dedicated
 
to target database: ORCL (DBID=1257415066, not open)

 

--执行数据库还原

--注意当存在完整备份也同时存在级增量备份时,Oracle会自动使用级增量备份来还原数据库

> restore database;
=/u01/bk/rmbk/Inc_0_0alqu132_1_1 tag=INC_0   --下面可以看出还原的数据来自级增量备份

--执行数据库恢复

> recover database;
=/u01/bk/rmbk/Inc_10clqu1fe_1_1 tag=INC_1

--打开数据库验证恢复

> alter database open;
 
> select * from bk.tb2;
 
NAME
---------- ---------------------------------------------
                     1 Robinson
                     2 Henry
                     3 Danny

   

    2.磁盘损坏导致数据文件无法恢复到原始位置或不想恢复到原始位置的处理

        使用set newname 命令将数据文件还原到新路径

set newname for datafile 1 to '<newdir>/system01.dbf'; --为恢复的数据文件指定新路径或重命名

        使用switch命令将变更更新到控制文件

| all ;      --等同于alter database rename file命令,该命令将恢复的数据文件重命名更新到控制文件

       

--下面的示例首先删除tbs01.dbf,接下来将其恢复到oradata目录中

> ho rm $ORACLE_BASE/oradata/orcl/tbs01.dbf
 
> startup mount force;
 
> connect target sys/redhat@dedicated
 
to target database: ORCL (DBID=1257415066, not open)
 
>
> set newname for datafile 6 to '/u01/app/oracle/oradata/tbs01.dbf';
> restore database;
> switch datafile all;
> recover database;
> alter database open;}
 
> select file#,name,status from v$datafile where file#=6;
 
NAME
---------- -------------------------------------------------- -------
/u01/app/oracle/oradata/tbs01.dbf                  ONLINE
                     
> select count(1) from bk.tb2;  --表tb2位于tbs01.dbf内
 
COUNT(1)
----------
                     3

 

    3.恢复表空间

       

--删除表空间内的数据文件,删除后在针对位于该表空间的表进行插入记录以及实施检查点进程

> ho rm $ORACLE_BASE/oradata/tbs01.dbf
 
> insert into bk.tb2 select 4,'Jackson' from dual;
 
> commit;
 
> alter system checkpoint;

       

--强制检查点后,告警日志出现错误提示,视图v$recover_file给出了故障数据文件

-n 50 $ORACLE_BASE/admin/orcl/bdump/alert_orcl.log
in file /u01/app/oracle/admin/orcl/bdump/orcl_ckpt_4724.trc:
-01110: data file 6: '/u01/app/oracle/oradata/tbs01.dbf'
-01116: error in opening database file
-01110: data file 6: '/u01/app/oracle/oradata/tbs01.dbf'
-27041: unable to open file
: 2: No such file or
           
> select * from v$recover_file;
 
TIME
---------- ------- ------- ------------------ ---------- ---------
FILE NOT
 
> select name,status from v$datafile where file#=6;
 
NAME
-------------------------------------------------- -------
/u01/app/oracle/oradata/tbs01.dbf                  RECOVER

       

--使用RMAN命令恢复数据文件,此时数据库处于OPEN状态,因此首先需要将表空间脱机,恢复完成之后再将其联机

>
> sql 'alter tablespace tbs1 offline immediate';
> set newname for datafile 6 to '/u01/app/oracle/oradata/orcl/tbs01.dbf';
> restore tablespace tbs1;
> switch datafile all;
> recover tablespace tbs1;
> sql 'alter tablespace tbs1 online';}
 
> select name,status from v$datafile where file#=6;  --位置变动到orcl子目录下,状态变为online
 
NAME
-------------------------------------------------- -------
/u01/app/oracle/oradata/orcl/tbs01.dbf             ONLINE

 

--也可以使用下面的命令完成同样的功能

--注意如果表空间内有多个数据文件,而仅有单个数据文件损坏则采用下面的方式处理更为妥当

>
> sql 'alter database datafile 6 offline immediate';
> set newname for datafile 6 to '/u01/app/oracle/oradata/tbs01.dbf';
> restore datafile 6;
> switch datafile all;
> recover datafile 6;
> sql 'alter databaes datafile 6 online';}

    4.RMAN实现不完全恢复

        对于RMAN的不完全恢复,使用Oracle的闪回特性的处理有更多的优势。关于闪回请参考:Oracle 闪回特性

        步骤

.加载数据到mount状态(建议恢复前先做备份)

.为高并发分配多个通道

.还原所有(所需)的数据文件

            d.使用until time,until sequence,until scn来恢复数据库

            e.使用resetlogs打开数据库

.全备数据库

       

        演示RMAN基于until time的例子

> show user;
USER is
> create table tb1(id int,name varchar2(10));
 
> insert into tb1 select 1,'Lancy' from dual;
 
> ho strings $ORACLE_BASE/oradata/orcl/redo02.log | grep Lancy  --查看联机日志文件中不存在刚刚插入的记录
 
> commit;                                                       --注意commit是将日志缓冲内容写入到日志文件
 
> ho strings $ORACLE_BASE/oradata/orcl/redo02.log | grep Lancy  --提交后联机日志文件中才有新增的记录
            Lancy
 
> alter system switch logfile;
 
> ho ls $ORACLE_BASE/oradata/arch
.arc  log_1_1_732989889.arc
 
>
> allocate channel ch1 type disk;
> allocate channel ch2 type disk;
> backup as compressed backupset database plus archivelog delete
> format '/u01/bk/rmbk/wh_lg_%U'
> tag='Wholebak_Pluslog';
> release channel ch1;
> release channel ch2;}
 
:10:36 SQL> drop table tb1;
 
>
> allocate channel ch1 type disk;
> allocate channel ch2 type disk;
> set until time "to_date('2010-10-21 18:10:36','yyyy-mm-dd hh24:mi:ss')";
> restore database;
> recover database;
> alter database open resetlogs;
> release channel ch1;
> release channel ch2;}
 
> select * from tb1;
 
NAME
---------- ----------
                     1 Lancy

 

    5. SPFILE文件丢失的恢复

        SPFILE参数文件可以在RMAN中进行备份,因此可以使用RMAN来恢复SPFILE文件。可以自动备份SPFILE。

        SPFILE的自动备份是随着控制文件的备份一起被完成的,因此可以通过自动备份控制文件来实现自动备份SPFILE文件的目的

        其次,在备份系统表空间时将引发控制文件的自动备份,而不论是否设置自动备份参数为ON,此时同样也备份SPFILE文件

       

       

        有关SPFILE文件请参考:Oracle 参数文件

                            错误导致数据库无法启动(ORA-01565)

       

        SPFILE文件恢复步骤

a. startup nomount [force];
            b. set dbid=dbid_no;
            c. restore spfile from autobackup | '<dir>'
            d. startup force;   如果d执行失败则转到e,f,否则不用执行e,f。
            e. set dbid=dbid_no;
            f. startup;

       

        下面设定控制文件的自动备份以及设置其备份路径(注意要预先知道目标数据库的DBID,此次演示的DBID为)

> configure controlfile autobackup on;
> configure controlfile autobackup format for device type disk to '/u01/bk/rmbk/auto_ctl_%d_%F';
           
> exit
> alter tablespace users add datafile '$ORACLE_BASE/oradata/orcl/users02.dbf' size 5m;
auto*      --执行上一条alter tablespace users add datafile 语句将引发控制文件的自动备份
-1263182651-20101124-00
> shutdown immediate;
           
.ora spfileorcl.ora.bak   --将原来的spfile文件重命名
           
/
> startup nomount force;
> set dbid=1263182651;
> restore spfile from autobackup;   --此处并没有找到文件路径,按Oracle联机文档,在nomount状态应该可以找到
-06172: no autobackup found or specified handle is not a valid copy or
> restore spfile from '/u01/bk/rmbk/auto_ctl_ORCL_c-1263182651-20101124-00';    --手动指定路径
> startup force;

   

    6.联机重做日志文件丢失的恢复请参考:

        基于catalog 的RMAN 备份与恢复

        Oracle 联机重做日志文件(ONLINE LOG FILE)

   

    7.控制文件的恢复