基于catalog 的RMAN 备份与恢复

本文介绍如何使用RMAN基于catalog的方式进行数据库备份与恢复,包括创建备份脚本、执行备份及不同场景下的恢复操作。

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

-- 基于catalog RMAN 备份与恢复

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

 

    RMAN的备份与恢复存储仓库的数据通常存放于控制文件或恢复目录中,本文主要讲述基于catalog的备份与恢复。

    关于catalog的创建请参考:RMAN catalog的创建和使用

 

    catalog方式的RMAN备份与恢复只不过是将备份恢复信息数据放在catalog目录内,普通的rman方式则是存放在控制文件中

    catalog方式可以存储常用或特定的备份与恢复的脚本

    有关catalog方式RMAN存储脚本请参考:基于 catalog 创建RMAN存储脚本

   

一、基于catalog来备份数据库(目标数据库orcl,恢复目录数据库asmdb)   

    首先基于catalog创建备份脚本

    --连接到RMAN

        [oracle@oradb ~]$ rman target sys/redhat@orcl catalog rman/rman@asmdb

        connected to target database: ORCL (DBID=1263182651)

        connected to recovery catalog database 

   

    --创建全局删除废弃备份的脚本

        RMAN> create global script global_del_obso  comment 'A script for obsolete backup and delete it' {

        2> allocate channel ch1 device type disk;

        3> delete obsolete recovery window of 7 days; 

        4> release channel ch1;

        5> }

 

        new incarnation of database registered in recovery catalog

        starting full resync of recovery catalog

        full resync complete

        created global script global_del_obso  

   

    --创建全局归档日志的备份脚本

        RMAN> create global script global_arch

        2> comment ' A script for archivelog and delete it '

        3> {

        4>   allocate channel ch1 device type disk;

        5>   sql " alter system archive log current";

        6>   set limit channel ch1 readrate=10240;

        7>   set limit channel ch1 kbytes=2048000;

        8>   backup as compressed backupset archivelog all delete input

        9>   format='/u01/bk/rmbk/arch_%d_%U'

        10>  tag='Archbk';

        11>  release channel ch1;

        12> }

 

        created global script global_arch

 

    --创建全局0级增量备份脚本  

        RMAN> create global script global_inc0

        2> comment ' A script for backup database using incremental level 0'

        3> {

        4>   execute global script global_del_obso;

        5>   allocate channel ch1 device type disk;

        6>   set limit channel ch1 readrate=10240;

        7>   set limit channel ch1 kbytes=2048000;

        8>   backup as compressed backupset incremental level 0 database

        9>   format='/u01/bk/rmbk/inc0_%d_%U'

        10>  tag='Inc0';

        11>  release channel ch1;

        12>  execute global script global_arch;

        13> }

 

        created global script global_inc0

   

    --列出已经创建的全局脚本

        RMAN> list global script names;

 

        List of Stored Scripts in Recovery Catalog

 

            Global Scripts

 

               Script Name

               Description

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

               global_arch

                A script for archivelog and delete it

 

               global_del_obso

                A script for obsolete backup and delete it

 

               global_inc0

                A script for backup database using incremental level 0

   

    --启用控制文件的自动备份功能

        RMAN> configure controlfile autobackup on;

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

   

    --删除以前的备份

        RMAN> delete noprompt backupset;

   

    --备份前验证归档日志是否存在

        RMAN> crosscheck archivelog all;

       

    --删除无效的归档日志信息

        RMAN> delete noprompt expired archivelog all;

       

    --使用0级增量备份数据库

        RMAN> run { execute global script global_inc0;}

 

    --查看刚刚完成的备份情况

        RMAN> list backupset summary;

        RMAN> list backupset ;

        RMAN> list backup of controlfile ;

        RMAN> list backup of archivelog all;

        RMAN> list backup of database;

        RMAN> list backup of datafile n ;

       

二、恢复操作       

    1.非系统表空间的恢复步骤

        a. alter datafile n offline immediate; | alter tablespace tbs_name offline immediate;

        b. restore

        c. recover

        d. alter datafile n online; | alter tablespace tbs_name online

       

        --删除非系统表空间users的数据文件(数据库位于open 状态) 

            [oracle@oradb orcl]$ pwd

            /u01/oracle/oradata/orcl

            [oracle@oradb orcl]$ rm users01.dbf    

 

            lion@ORCL> select * from tb2;

            select * from tb2

                          *

            ERROR at line 1:

            ORA-01116: error in opening database file 4

            ORA-01110: data file 4: '/u01/oracle/oradata/orcl/users01.dbf'

            ORA-27041: unable to open file

            Linux Error: 2: No such file or directory

            Additional information: 3

 

            RMAN> run {

            2> allocate channel ch1 device type disk;

            3> sql " alter tablespace users offline immediate "; 

            4> restore tablespace users;

            5> recover tablespace users;

            6> sql " alter tablespace users online ";

            7> }

 

            lion@ORCL> select * from tb2;

 

                    ID NAME

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

                     1 Robinson

 

            也可以使用下面的恢复方式来完成恢复     

            RMAN> run {

            2> allocate channel ch1 device type disk;

            3> sql " alter database datafile 4 offline ";

            4> restore datafile 4;

            5> recover datafile 4;

            6> sql " alter database datafile 4 online ";

            7> }

 

        如果介质恢复时,需要用的日志尚未归档,需要指定联机重做日志文件所在的位置       

        注意

        表空间几种不同的脱机方式

            offline normal :

                表空间脱机的缺省方式,将位于SGA中且与该表空间所有的数据文件相关的数据块(blocks)写入到数据文件之后再进行脱机

                再次联机时不需要做介质恢复。

            offline temporary :

                实施检查点进程,即同样将SGA中且与该表空间所有的数据文件相关的数据块(blocks)写入到数据文件之后再进行脱机

                不保证所有的数据能够写入到数据文件。再次联机时要做介质恢复。

            offline immediate :

                不保证表空间的数据可用,也不实施检查点进程而直接脱机,再次联机时要做介质恢复。

               

            offline temporary offline immediate 脱机方式不适用于数据文件

       

            lion@ORCL> alter database datfile 4 offline immediate;

            alter database datfile 4 offline immediate

                                   *

            ERROR at line 1:

            ORA-02231: missing or invalid option to ALTER DATABASE

 

 

            lion@ORCL> alter database datfile 4 offline temporary;

            alter database datfile 4 offline temporary

                                   *

            ERROR at line 1:

            ORA-02231: missing or invalid option to ALTER DATABAS

       

            更多关于表空间与数据文件的管理,请参考:Oracle 表空间与数据文件

        对于表空间存在多个数据文件的情况,而单个或较少的数据文件受损,应尽可能使用第二种方式来恢复.resotre & recover datafile n

 

    2.UNDO表空间的恢复

        关于UNDO表空间的管理请参考:Oracle 回滚(ROLLBACK)和撤销(UNDO)

        恢复步骤(undo丢失后)

            alter database datafile 2 online;

            alter database datafile 2 offline;

            select * from v$recover_file;

            restore datafile 2;   --RMAN 完成

             

            recover datafile 2 ; 

            alter database datafile 2 online;

           

           

        --首先做一些操作,将数据填充到undo表空间

            lion@ORCL> select * from tb2;

 

                    ID NAME

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

                     1 Jack

 

            lion@ORCL> insert into tb2 select 2,'Jackson' from dual;

 

            lion@ORCL> commit;

 

            lion@ORCL> delete from tb2 where id=1;

 

            lion@ORCL> select * from tb2;

 

                    ID NAME

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

                     2 Jackson

                     

            lion@ORCL> ho rm $ORACLE_BASE/oradata/orcl/undotbs01.dbf

 

        注意:undo表空间不能被offline,也不能被readonly

            使用alter database datafile 2 online | offline强制执行该步骤,以告知oracle undo表空间被损坏,执行后会话被终止,如下

 

            lion@ORCL> alter database datafile 2 online;

            alter database datafile 2 online

            *

            ERROR at line 1:

            ORA-01116: error in opening database file 2

            ORA-01110: data file 2: '/u01/oracle/oradata/orcl/undotbs01.dbf'

            ORA-27041: unable to open file

            Linux Error: 2: No such file or directory

            Additional information: 3

 

            lion@ORCL> alter database datafile 2 offline;

            ERROR:

            ORA-03114: not connected to ORACLE

 

            alter database datafile 2 offline

            *

            ERROR at line 1:

            ORA-00603: ORACLE server session terminated by fatal error

   

        --接下面再来进行恢复

 

            RMAN> run {

            2> allocate channel ch1 device type disk;

            3> restore datafile 2;

            4> recover datafile 2;}

 

            starting media recovery            --还原被成功执行,介质恢复失败,且会话被终止

            media recovery failed

            ORA-00603: ORACLE server session terminated by fatal error

 

        --重新登录到数据库服务器并查看v$recover_file视图以及进行介质恢复

            sys@ORCL> select * from v$recover_file;

 

                 FILE# ONLINE  ONLINE_ ERROR              CHANGE# TIME

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

                     2 OFFLINE OFFLINE UNKNOWN ERROR       493982 23-NOV-10

         

            sys@ORCL> recover datafile 2;    --进行介质恢复,恢复后可以看到提示回话被终止

            ORA-00603: ORACLE server session terminated by fatal error

 

            sys@ORCL> conn / as sysdba   --再次连接

            Connected.

            sys@ORCL> select name,status from v$datafile where name like '%undo%';  --undo表空间已经处于offline状态

 

            NAME                                          STATUS

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

            /u01/oracle/oradata/orcl/undotbs01.dbf        OFFLINE

 

            sys@ORCL> alter database datafile 2 online;

 

            Database altered.

 

            sys@ORCL> select * from lion.tb2;

                    ID NAME

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

                     2 Jackson

 

        可以看到表中ID为的记录已经丢失,事实上在undo的数据文件丢失前,该事务并没有提交,由此可以推断,该事务进行了隐式提交.

                     

    3.系统表空间的恢复(system ,sysaux)

        系统表空间只能在Mount状态下来完成恢复,步骤如下

            startup mount;

            restore datafile 1;

            recover datafile 1;

            alter database open;

        --创建新表tb3,并插入记录。其数据字典信息则位于system表空间,数据内容位于users表空间

            lion@ORCL> create table tb3 tablespace users as select * from tb2;

 

            lion@ORCL> insert into tb3 select 1,'Johnson' from dual;

 

            lion@ORCL> commit;

 

            lion@ORCL> select * from tb3 order by id;

 

                    ID NAME

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

                     1 Johnson

                     2 Jackson

        --删除表空间system01.dbf  sysaux01.dbf           

            sys@ORCL> ho rm $ORACLE_BASE/oradata/orcl/system01.dbf

            sys@ORCL> ho rm $ORACLE_BASE/oradata/orcl/sysaux01.dbf     

            sys@ORCL> startup mount force; 

            RMAN> run {

            2> allocate channel ch1 device type disk;

            3> restore  datafile 1,3;

            4> recover  datafile 1,3;

            5> alter database open;

            6> release channel ch1;}

 

            sys@ORCL> select * from lion.tb3 order by id;  --成功恢复后表tb3也被恢复

 

                    ID NAME

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

                     1 Johnson

                     2 Jackson

                     

    4.控制文件的恢复

        步骤

            connect to target db and catalog(nocatalog) db

            startup nomount

            restore controlfile [from autobackup]

            alter database mount

            recover database

            alter database open resetlogs

           

        由于控制文件采取了自动备份策略,因此在每次备份或重大系统结果发生变化时,控制文件将被自动备份

           

            sys@ORCL> ho rm $ORACLE_BASE/oradata/orcl/*.ctl                --删除所有的控制文件*/

           

            sys@ORCL> select file#,status from v$datafile;   --查看v$datafile视图时,系统已检测到错误发生

            select file#,status from v$datafile

                                     *

            ERROR at line 1:

            ORA-00210: cannot open the specified control file

            ORA-00202: control file: '/u01/oracle/oradata/orcl/control01.ctl'

            ORA-27041: unable to open file

            Linux Error: 2: No such file or directory

            Additional information: 3

           

            sys@ORCL> shutdown abort;

           

            --重新连接到RMAN,注意连接target时使用/,否则提示TNS无法解析

            [oracle@oradb dbs]$ uniread rman target / catalog rman/rman@asmdb  

 

            connected to target database: orcl (not started)

            connected to recovery catalog database     

           

            RMAN> startup nomount;

            RMAN> run {

            2> allocate channel ch1 device type disk;

            3> restore controlfile;

            4> sql " alter database mount ";

            5> recover database;

            6> sql " alter database open resetlogs ";

            7> release channel ch1;}

             

        注:在此处有可能不要介质恢复,如果提示需要介质恢复,直接在RMANSQLPlus下执行recover database即可

            使用open resetlogs之后,一个新的incarnation将被生成,再此建议立即全备数据库。

       

        更多关于控制文件

            Oracle 控制文件(CONTROLFILE)

            Oracle 控制文件的备份与恢复

   

    5.联机重做日志文件的恢复(online redo log )

        当数据库置为mount状态,且将要转换为open状态时,数据文件,联机日志文件被打开,因此联机日志的丢失可以在mount状态完成

        恢复步骤

            a. 启动到mount状态(startup mount force)

            b. 还原数据库(restore database)

            c. 恢复数据库(recover database)

       

        下面对删除日志并进行恢复

            lion@ORCL> select * from tb2;

 

                    ID NAME

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

                     2 Jackson

 

            lion@ORCL> select current_scn from v$database;   --查看数据库当前的SCN

 

            CURRENT_SCN

            -----------

                1020638

 

            lion@ORCL> insert into tb2 select 1,'Johnson' from dual;   --为表tb2新增一条记录

 

            lion@ORCL> commit;

 

            lion@ORCL> select current_scn from v$database;             --数据库当前的SCN发生了变化为

 

            CURRENT_SCN

            -----------

                1020685

               

            lion@ORCL> select file#, checkpoint_change# from v$datafile_header;  --数据文件头部的checkpoint_change

 

                 FILE# CHECKPOINT_CHANGE#

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

                     1            1020368

                     2            1020368

                     3            1020368

                     4            1020368

                     5            1020368

                     6            1020368      

                     

            lion@ORCL> ho rm -f $ORACLE_BASE/oradata/orcl/*.log      --删除所有的日志文件  */

                       

            lion@ORCL> insert into tb2 select 2,'wilson' from dual;    --为表插入新记录

 

            lion@ORCL> commit;                                        

 

            lion@ORCL> select current_scn from v$database;            --数据库当前的SCN发生了变化为

 

            CURRENT_SCN

            -----------

                1020708        

 

            lion@ORCL> alter system archive log current;              --对日志进行归档时提示错误发生

            alter system archive log current

            *

            ERROR at line 1:

            ORA-16038: log 1 sequence# 1 cannot be archived

            ORA-00312: online log 1 thread 1: '/u01/oracle/oradata/orcl/redo01.log'

               

            lion@ORCL> conn / as sysdba

 

            sys@ORCL> startup mount force;

 

            [oracle@oradb ~]$ uniread rman target / catalog rman/rman@asmdb    --退出RMAN后并重新连接

            RMAN> run {

            2> allocate channel ch1 device type disk;

            3> restore database;

            4> recover database;

            5> release channel ch1;}

 

            RMAN-06054: media recovery requesting unknown log: thread 1 seq 1 lowscn 1020365

 

            sys@ORCL> recover database until cancel;                          --回到SQLPlus直接使用until cancel来进行恢复

 

            sys@ORCL> alter database open resetlogs;                          --执行opensetlogs打开数据库

 

            sys@ORCL> select * from lion.tb2;                          --在日志未完成自动归档前,删除日志的后数据全部丢失

 

                    ID NAME

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

                     2 Jackson

                     

        关于单个日志文件丢失或日志文件组受损,请参考:Oracle 联机重做日志文件(ONLINE LOG FILE)     

       

    6.所有数据全部丢失的处理

        步骤

            a.启动到nomount状态(startup nomount)

            b.还原控制文件(restore controlfile from autobackup)

            c.还原数据(restore database)

            d.将数据切换到mount状态(alter database mount)

            e.恢复数据库(recover database using backup controlfile until cancel)

            f.使用open resetlogs打开数据库(alter database open resetlogs)

           

        --下面演示数据文件、日志文件、控制文件全部丢失的处理

            sys@ORCL> ho rm $ORACLE_BASE/oradata/orcl/*           --删除所有的数据文件、日志文件、控制文件*/

 

            sys@ORCL> startup nomount ;

           

            [oracle@oradb ~]$ uniread rman target / catalog rman/rman@asmdb

            RMAN> startup nomount;     

            RMAN> restore controlfile from autobackup; 

            RMAN> run {

            2> allocate channel ch1 device type disk;

            3> restore database ;

            4> sql " alter database mount ";

            5> recover database ;}

 

            RMAN-06004: ORACLE error from recovery catalog database: RMAN-20003: target database incarnation not found in

                recovery catalog

 

            idle> recover database using backup controlfile until cancel;    --使用SQLPlus来完成恢复操作

 

            idle> alter database open resetlogs;

 

三、更多参考   

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

        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 归档日志

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风智语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值