RMAN 还原与恢复

系统 1442 0

--====================

-- RMAN 还原与恢复

--====================

 

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

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

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

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

 

    恢复的几种情形

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

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

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

            控制文件 (controlfile)

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

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

   

    有关恢复、介质恢复、一致性或非一致性恢复的详细概念请参考: Oracle 基于用户管理恢复的处理

   

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

    RMAN > connect target /

    RMAN > startup mount ;

    RMAN > restore database ;

    RMAN > recover database ;

    RMAN > alter database open ;

 

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

 

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

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

            C : / > set NLS_LANG = AMERICAN_AMERICA . AL32UTF8

 

            C : / > rman target sys / redhat@dedicated nocatalog

       

        -- 对数据库做全备

            RMAN > backup as backupset                 

            2 > format   '/u01/bk/rmbk/wb_%U'

            3 > tag = Whole_bak database ;

 

            RMAN > sql   'alter system archive log current' ;

           

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

            RMAN > run{                                  

            2 > allocate channel ch1 type disk ;

            3 > backup incremental level 0 database

            4 > format '/u01/bk/rmbk/Inc_0_%U'

            5 > tag = Inc_0 ;

            6 > release channel ch1 ;}

 

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

            SQL > select * from tb2 ;

 

                    ID NAME

            ---------- ---------------------------------------------

                      1 Robinson

                      2 Henry

 

            SQL > insert into tb2 select 3 , 'Danny' from dual ;

 

            SQL > commit ;

 

            SQL > alter system checkpoint ;

 

            SQL > alter system switch logfile ;

           

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

            RMAN > run{                              

            2 >   allocate channel ch1 type disk ;

            3 >   backup incremental level 1 database

            4 >   format '/u01/bk/rmbk/Inc_1%U'

            5 >   tag = Inc_1 ;

            6 >   release channel ch1 ;}

 

            SQL > shutdown immediate ;    -- 关闭数据库

 

            SQL > ho rm $ORACLE_BASE / oradata / orcl /*.dbf   -- 删除所有的数据文件 */

 

            SQL > startup mount

 

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

            RMAN > connect target sys / redhat@dedicated

 

            connected to target database : ORCL ( DBID = 1257415066 , not open )

 

        -- 执行数据库还原

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

            RMAN > restore database ;  

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

 

        -- 执行数据库恢复

            RMAN > recover database ;

            piece handle =/ u01 / bk / rmbk / Inc_10clqu1fe_1_1 tag = INC_1

 

        -- 打开数据库验证恢复

            RMAN > alter database open ;

 

            SQL > select * from bk . tb2 ;

 

                    ID NAME

            ---------- ---------------------------------------------

                      1 Robinson

                      2 Henry

                      3 Danny

   

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

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

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

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

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

       

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

       

            SQL > ho rm $ORACLE_BASE / oradata / orcl / tbs01 . dbf

 

            SQL > startup mount force ;

 

            RMAN > connect target sys / redhat@dedicated

 

            connected to target database : ORCL ( DBID = 1257415066 , not open )

 

            RMAN > run{

            2 > set newname for datafile 6 to '/u01/app/oracle/oradata/tbs01.dbf' ;

            3 > restore database ;

            4 > switch datafile all;

            5 > recover database ;

            6 > alter database open ;}

 

            SQL > select file# , name , status from v$datafile where file# = 6 ;

 

                  FILE# NAME                                                 STATUS

            ---------- -------------------------------------------------- -------

                      6 / u01 / app / oracle / oradata / tbs01 . dbf                   ONLINE

                     

            SQL > select count ( 1 ) from bk . tb2 ;   -- tb2 位于 tbs01.dbf

 

              COUNT ( 1 )

            ----------

                      3

 

    3. 恢复表空间

       

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

            SQL > ho rm $ORACLE_BASE / oradata / tbs01 . dbf

 

            SQL > insert into bk . tb2 select 4 , 'Jackson' from dual ;

 

            SQL > commit ;

 

            SQL > alter system checkpoint ;

       

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

            [oracle@oradb ~]$ tail - n 50 $ORACLE_BASE / admin / orcl / bdump / alert_orcl . log

            Errors in file / u01 / app / oracle / admin / orcl / bdump / orcl_ckpt_4724 . trc :

            ORA - 01110 : data file 6 : '/u01/app/oracle/oradata/tbs01.dbf'

            ORA - 01116 : error in opening database file 6

            ORA - 01110 : data file 6 : '/u01/app/oracle/oradata/tbs01.dbf'

            ORA - 27041 : unable to open file

            Linux Error : 2 : No such file or directory

           

            SQL > select * from v$recover_file ;

 

                  FILE# ONLINE   ONLINE_ ERROR                  CHANGE# TIME

            ---------- ------- ------- ------------------ ---------- ---------

                      6 OFFLINE OFFLINE FILE NOT FOUND               0

 

            SQL > select name , status from v$datafile where file# = 6 ;

 

            NAME                                                 STATUS

            -------------------------------------------------- -------

            / u01 / app / oracle / oradata / tbs01 . dbf                   RECOVER

       

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

            RMAN > run{

            2 > sql 'alter tablespace tbs1 offline immediate' ;

            3 > set newname for datafile 6 to '/u01/app/oracle/oradata/orcl/tbs01.dbf' ;

            4 > restore tablespace tbs1 ;

            5 > switch datafile all;

            6 > recover tablespace tbs1 ;

            7 > sql 'alter tablespace tbs1 online' ;}

 

            SQL > select name , status from v$datafile where file# = 6 ;   -- 位置变动到 orcl 子目录下,状态变为 online

 

            NAME                                                STATUS

            -------------------------------------------------- -------

            / u01 / app / oracle / oradata / orcl / tbs01 . dbf              ONLINE

 

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

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

            RMAN > run{

            2 > sql 'alter database datafile 6 offline immediate' ;

            3 > set newname for datafile 6 to '/u01/app/oracle/oradata/tbs01.dbf' ;

            4 > restore datafile 6 ;

            5 > switch datafile all;

            6 > recover datafile 6 ;

            7 > sql 'alter databaes datafile 6 online' ;}

 

    4.RMAN 实现不完全恢复

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

        步骤

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

            b . 为高并发分配多个通道

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

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

            e. 使用 resetlogs 打开数据库

            f . 全备数据库

       

        演示 RMAN 基于 until time 的例子

            SQL > show user ;

            USER is "BK"

            SQL > create table tb1 ( id int , name varchar2 ( 10 ));

 

            SQL > insert into tb1 select 1 , 'Lancy' from dual ;

 

            SQL > ho strings $ORACLE_BASE / oradata / orcl / redo02 . log | grep Lancy   -- 查看联机日志文件中不存在刚刚插入的记录

 

            SQL > commit ;                                                        -- 注意 commit 是将日志缓冲内容写入到日志文件

 

            SQL > ho strings $ORACLE_BASE / oradata / orcl / redo02 . log | grep Lancy   -- 提交后联机日志文件中才有新增的记录

            Lancy

 

            SQL > alter system switch logfile ;

 

            SQL > ho ls $ORACLE_BASE / oradata / arch

            log_1_1_732989230 . arc   log_1_1_732989889 . arc

 

            RMAN > run{

            2 > allocate channel ch1 type disk ;

            3 > allocate channel ch2 type disk ;

            4 > backup as compressed backupset database plus archivelog delete input

            5 > format '/u01/bk/rmbk/wh_lg_%U'

            6 > tag = 'Wholebak_Pluslog' ;

            7 > release channel ch1 ;

            8 > release channel ch2 ;}

 

            18 : 10 : 36 SQL > drop table tb1 ;

 

            RMAN > run{

            2 > allocate channel ch1 type disk ;

            3 > allocate channel ch2 type disk ;

            4 > set until time "to_date('2010-10-21 18:10:36','yyyy-mm-dd hh24:mi:ss')" ;

            5 > restore database ;

            6 > recover database ;

            7 > alter database open resetlogs ;

            8 > release channel ch1 ;

            9 > release channel ch2 ;}

 

            SQL > select * from tb1 ;

 

                    ID NAME

            ---------- ----------

                      1 Lancy

 

    5. SPFILE 文件丢失的恢复

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

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

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

       

       

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

                               SPFILE 错误导致数据库无法启动(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 )

       

            RMAN > configure controlfile autobackup on ;

            RMAN > configure controlfile autobackup format for device type disk to '/u01/bk/rmbk/auto_ctl_%d_%F' ;

           

            RMAN > exit

            sys@ORCL > alter tablespace users add datafile '$ORACLE_BASE/oradata/orcl/users02.dbf' size 5m ;

            [oracle@oradb rmbk]$ ls auto *       -- 执行上一条 alter tablespace users add datafile 语句将引发控制文件的自动备份

            auto_ctl_ORCL_c - 1263182651 - 20101124 - 00

            sys@ORCL > shutdown immediate ;

           

            [oracle@oradb dbs]$ mv spfileorcl . ora spfileorcl . ora . bak    -- 将原来的 spfile 文件重命名

           

            [oracle@oradb ~]$ rman target / nocatalog

            RMAN > startup nomount force ;

            RMAN > set dbid = 1263182651 ;

            RMAN > restore spfile from autobackup ;    -- 此处并没有找到文件路径,按 Oracle 联机文档,在 nomount 状态应该可以找到

            RMAN - 06172 : no autobackup found or specified handle is not a valid copy or piece

            RMAN > restore spfile from '/u01/bk/rmbk/auto_ctl_ORCL_c-1263182651-20101124-00' ;     -- 手动指定路径

            RMAN > startup force ;

   

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

        基于 catalog RMAN 备份与恢复

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

   

    7. 控制文件的恢复处理

        控制文件中描述了数据库的相关物理信息,如创建时间、 DBID 、数据文件、日志文件等相关信息,因此一旦控制文件丢失数据库将

    不能启动,鉴于其重要性,控制文件的备份与恢复将单独列出。有关控制文件请参考下列

        基于 catalog RMAN 备份与恢复

        Oracle 控制文件的备份与恢复

   

三、更多参考    

有关基于用户管理的备份和备份恢复的概念请参考:

        Oracle 冷备份

        Oracle 热备份

        Oracle 备份恢复概念

        Oracle 实例恢复

        Oracle 基于用户管理恢复的处理 ( 详细描述了介质恢复及其处理 )

       

    有关 RMAN 的恢复与管理请参考:

        RMAN 概述及其体系结构

        RMAN 配置、监控与管理

        RMAN 备份详解

        RMAN 还原与恢复

       

    有关 Oracle 体系结构请参考:

        Oracle 实例和Oracle 数据库(Oracle 体系结构)

        Oracle 表空间与数据文件

        Oracle 密码文件

        Oracle 参数文件

Oracle 数据库实例启动关闭过程

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

        Oracle 控制文件(CONTROLFILE)

        Oracle 归档日志

 

RMAN 还原与恢复


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论