ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle数据库备份与恢复之RMAN2

Oracle数据库备份与恢复之RMAN2

原创 Linux操作系统 作者:gjm008 时间:2008-12-27 20:17:26 0 删除 编辑

4.4.3  非归档模式下的  BACKUP  备份与恢复

    恢复目录:    打开目标数据库:例程启动,数据库加载,mount  不能 open因为目标数据库不在归档模式下,所以当进行备份/恢复操作的时候数据库无法打开。目标数据库只能在  MOUNT 状态不能 Open,所以属于脱机备份。

    非归档模式不备份 redo日志,只有完全备份和 readonly/offline表空间和数据文件备份是有意义的,所以非归档模式最好不用 RMAN进行备份,备份语法与归档模式相 同,所以这里只做简单介绍。

    4.4.3.1  全库备份

    例:  使用默认的设置脱机全备份的语句

    RMAN> shutdown immediate;RMAN> startup mount;RMAN> backup database;RMAN> startup;

    例:不使用默认的设置执行脱机备份操作  ,在备份命令中指定备份选项

    RMAN> shutdown immediate;

    RMAN> startup mount;

    RMAN> run { allocate channel c1 type disk format '/xxx/ming_%U';

    allocate channel c2 type disk format '/xxx/ming_%U';

    backup full tag full_db_backup format "/backups/db_t%t_s%s_p%p" (database);

    backup current controlfile;

    release channel c1 ;

    release channel c2 ;}

    在这个例子中,我们分配了两个通道,备份位置是在/xxx.默认情况下,如果备份数据文件 1 (SYSTEM  表空间),控制文件和参数文件也会备份。 可以通过下面的命令显示恢复目录中记载的备份集信息: RMAN> list backupset of database;

    4.4.3.2  全库备份的恢复

    $ rman target /

    RMAN> startup mount

    RMAN> restore database;

    RMAN> recover database;

    RMAN> alter database open resetlogs;

    4.4.3.3  表空间备份

    只有 readonly/offline表空间的备份才有意义。

    RMAN> run {

    2> allocate channel dev1 type disk;

    3> backup

    4> tag tbs_users_read_only

    5> format "/oracle/backups/tbs_users_t%t_s%s"

    6> (tablespace users);

    7> }

    使用下列命令来显示恢复目录中该表的备份信息:RMAN> list backupset of tablespace users;

    4.4.3.4  表空间备份的恢复

    RMAN> RUN{

    sql "alter tablespace xx offline immediate;"

    restore tablespace xx;

    recover tablespace xx;

    sql "alter tablespace xx online;" }

    4.4.3.5  备份控制文件

    RMAN> run {

    2> allocate channel dev1 type "SBT_TAPE";

    3> backup

    4> format "cf_t%t_s%s_p%p"

    5> tag cf_monday_night

    6> (current controlfile);

    7> release channel dev1;8> }

    注:数据库完全备份将自动备份控制文件。(或者备份时加 include current controlfile)

4.4.4  归档模式下的BACKUP备份与完全恢复

    要用  RMAN  进行联机备份操作,数据库就必须位于  ARCHIVELOG  模式。恢复 目录必须打开,目标数据库例程必须启动,数据库加载或者打开。

    这部分只介绍完全恢复,不完全恢复见下一节。

    4.4.4.1  整库备份与恢复备份命令:

    只备份数据文件  (如果 configure controlfile autobackup  on;  将自动包括控件文件,SPFILE):RMAN> backup database;同时备份归档日志,然后将备份后的归档日志删除RMAN> backup database plus archivelog delete input;明确指定同时备份控件文件:

    RMAN> run{

    allocate channel c1 type disk;

    sql 'alter system archive log current';

    backup full database include current controlfile tag 'dbfull'

    format '/u06/oracle/rmanback/full_%u_%s_%p';

    sql 'alter system archive log current';

    release channel c1;}

    可以用 RMAN的 plus archvielog 选项简化数据库备份:

    RMAN> run {

    2> backup database

    3> format '/xxfull%d_%T_%s'

    4> plus archivelog

    5> format '/xx/arch_%d_%T_%s'

    6> delete all input;

    7> }

    完全恢复:目标数据库必须是 mount状态$ rman target / RMAN> startup mount RMAN> restore database;RMAN> recover database;RMAN> alter database open;

    4.4.4.2  表空间的备份与恢复

    备份命令:RMAN> backup tablespace users ;

    例:RMAN> RUN{

    allocate channel c1 type disk;

    backup tablespace users tag 'ts_users' format '/oracle/rmanback/ts_%u_%s_%p' ;

    release channel c1;

    }

   format 'D:Back Updb bakRMAN_BKdb_full_%u_%p_%s.RMN' --------备份片的输出名称的格式,%u:8位,备份集号+备份时间;%p:备份片数;%s:备份集数

 

    恢复:如果我们只丢失了特定的表空间的数据文件,那么我们可以选择只恢复这个表空间,而不是恢复整个数据库。表空间恢复可以在不关闭数据库的情况下进行,只需要将需要恢复的 表空间 offline.

    RMAN> RUN{

    sql "alter tablespace xx offlineimmediate;"

    restore tablespace xx;

    recover tablespace xx;

    sql "alter tablespace xx online;"

    }

    恢复到一个不同的位置:

    RMAN> RUN{

    sql "alter tablespace xx offline immediate;"

    SET NEWNAME for datafile 1 to '/xx';

    restore tablespace xx;

    switch datafile 1;

    recover tablespace xx;

    sql "alter tablespace tbs1 online;"

    }

    4.4.4.3  数据文件的备份与恢复

    备份命令:

    RMAN> backup datafile 3;

    RMAN> backup datafile 'D:\ORAC LE\ORADATA\TEST\TEST.DB';

    恢复命令:数 据文件 恢复与表空间恢 复类 似 .假设数 据文件 号 为  5  的文件丢失 ,文 件名 是:'E:\ORACLE\ORADATA\USERS.DBF',  那么我们恢复的时候可以指定文件号,也可以指定文件名。

    RMAN> run {

    2> allocate channel dev1 type disk;

    3> sql "alter tablespace users offline immediate";

    4> restore datafile 4;    ——或者  restore 'E:\ORACLE\ORADATA\USERS.DBF'

    5> recover datafile 4;

    6> sql "alter tablespace users online";

    7> release channel dev1;

    8> }

    恢复到一个不同的位置:

    $ rman target /

    RMAN> startup mount

    RMAN> RUN{

    sql "alter tablespace users offline immediate";

    SET NEWNAME for datafile 9 to '/xx/user01.dbf';

    restore datafile 9;

    switch datafile all;

    recover datafile 9;

    sql "alter tablespace users online";

    }

4.4.4.4  归档重做日志的备份与恢复

    备份:整库备份的同时,备份所有归档  (以及联机日志):RMAN> backup database plus archivelog;

    备份所有归档:RMAN> backup archivelog all;

    备份两天来的归档:RMAN> backup archivelog from time='sysdate-2' [to time=‘xxx’] ;

    备份从 sequence 1  开始的归档:RMAN> backup archivelog from sequence 1[to sequence =‘n];

    备份没有三次备份的归档:RMAN> backup archivelog not backed up 3 times;

    备份所有归档,然后删除归档:RMAN> backup archivelog all delete input;

    恢复:显示恢复目录中的归档日志:RMAN> list backupset of archivelog all;

    一般情况下,在  RMAN  的普通恢复过程中,不必恢复归档的重做日志。不过偶尔也需 要恢复重做日志,例如我们用 Log Miner  来从归档中查找一些东西。

    RMAN命令举例:

    RMAN> RESTORE ARCHIVELOG ALL;

    RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1UNTIL LOGSEQ=20;

    RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1;

    可以用  SET命令来指定归档日志的还原位置,例如:RMAN> run{ set archivelog destination to "d:\temp";restore archivelog all;}需要注意的是,即使新的归档日志目录不同于默认的归档日志目录,如果  Oracle 判定日志已存在,也不会恢复该归档日志文件。

    4.4.4.5  联机日志的备份

    联机日志不能用  RMAN  来备份,可以先将其归档,再备份。为了实现这点,必须在 RMAN中执行归档命令语句:

    RMAN> run {

    2> allocate channel dev1 type disk;

    3> sql "alter system archive log current";

    4> backup (archivelog from time "sysdate-1" all delete input)

    5> "format "/oracle/backups/log_t%t_s%s_p%p";

    6> release channel dev1;

    7>

    }

    上面的脚本可以在执行完一个完整的联机数据库备份后执行,确保所有的重做日志可以将数据库恢复到一个一致性的状态。

    当然,也可以在全库备份时使用  plus archvielog  选项,将自动完成联机日志的备份。

    4.4.4.6  控制文件和服务器参数文件的备份与恢复备份:

    //  设置文件名格式RMAN> set controlfile autobackup format for device t ype disk to 'ctl_%F';

    1. RMAN> configure controlfile autobackup on;    // backup database 时将自动备份

    2. RMAN> backup current controlfile;

    3. RMAN> backup …… include control file;

    4. RMAN> backup file 1;                // system datafile 自动备份

    恢复SPFILE:

    SPFILE(PFILE)的丢失/损坏,对数据库不会产生致命影响,可以从其他方式恢复。不过既然RMAN的备份计划中包括了SPFILE的备份,那么就可以使用RMAN来还原SPFILE了。

    $ rman target / catalog "rman/rman@db" RMAN> set dbid=153910023    // SET DBID 这个步骤是不能省略的,否则会报错。

    RMAN> restore spfile from autobackup [MAXDAYS 100];    //  或者 restore spfile;

    RMAN> startup force

    或者从某个备份集恢复:RMAN> restore spfile from backupset bs_num 命令。 使用dbms_backup_restore 包恢复服务器参数文件:在一些不常见的情况下,我们可能需要直接使用dbms_backup_restore  包来恢复spfile.当然这个包也可以用来恢复其它数据,是常规办法都没有用的时候的一个利器。这个包可以在数据库  NOMOUNT状态下使用。 假设我们有一个自动备份文件C-2600315304-20060829-02,我们需要从这里恢复数据,那么可以通过执行下面的脚本来完成:

    SQL>

    DECLARE

    DEVTYPE VARCHAR2(256);

    DONE BOOLEAN;

    BEGIN

    DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL);

    DBMS_BACKUP_RESTORE.restoresetdatafile;

    DBMS_BACKUP_RESTORE.restorespfileto('/back/SPFILE.ORA');

    DBMS_BACKUP_RESTORE.restorebackuppiece('/back/C-2600315304-20060829-02',DONE=>done);

    DBMS_BACKUP_RESTORE.devicedeallocate(NULL);END;

    恢复控制文件:

    RMAN> startup nomount; RMAN> set dbid=153910023

    RMAN> restore controlfile from autobackup

    或

    RMAN> restore controlfile from'/arch/ct_c-2347671489-20060630-00';

    联机状态:目标数据库 MOUNT 或 OPEN

    RMAN> restore controlfile to 'd:\temp\control01.ctl';

    然后再执行恢复数据库的其他步骤:RMAN> restore database; RMAN> recover database;RMAN> alter database open resetlogs;

    使用  dbms_backup_restore 包恢复控制文件:

    SQL>

    DECLARE DEVTYPE VARCHAR2(256);

    DONE BOOLEAN;

    BEGIN

    DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL);

    DBMS_BACKUP_RESTORE.restoresetdatafile;

    DBMS_BACKUP_RESTORE.restorecontrolfileto('/back/CONTROL01.CTL');

    DBMS_BACKUP_RESTORE.restorebackuppiece('/back/C-2600315304-20060829-00',DONE=>done);

    DBMS_BACKUP_RESTORE.devicedeallocate(NULL);END;/

    4.4.4.7  备份集的备份的备份与恢复

    备份:备份所有备份集:RMAN> backup backupset all;备份指定备份集:RMAN> backup backupset bs_num;恢复:(这种备份只是增加一个镜像,不用恢复)

    主要用于改变备份集的位置,或者创建多个镜像备份,比如将备份集从硬盘备份到磁带。

4.4.5  归档模式下的不完全恢复

    不完全恢复就意味着有数据的丢失。引起不完全恢复的原因有很多,如丢失了联机日志或某个归档日志。另外如果出现了严重损害数据库的用户错误,比如某用户错误的删除了某 个重要的数据,那么数据库也要恢复到这个错误操作之前。

    不完全恢复会影响整个数据库,需要在 MOUNT 状态下进行。在不完全恢复完成之后, 通常需要使用  resetlogs  选项来打开数据库。resetlogs  表示一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始。数据库的逻辑生存期也被称为一个对应物(incarnation)。 每次使用  resetlogs  选项来打开数据库后都会创建一个新的数据库对应物,这对于恢复操作 来说非常重要。每次使用  resetlogs  后,SCN计数器不会被重置,但是 Oracle会重置联机日 志序列号,同时还会重置联机重做日志内容。因此执行了  resetlogs  之后,应该立即重新备 份整个数据库,否则恢复起来相当麻烦。 (注:Oracle 10g 中已经可以在  resetlogs 之后不备 份数据库,恢复的时候能够穿越 resetlogs)

    使用RMAN执行不完全恢复操作时需要完成的一个工作是建立恢复目标。恢复目标是要终止恢复进程的点,可以是时间点、指定的  SCN  或者一个日志序列号。我们可以在  run代码中使用 set  命令和 until time、until scn、until sequence 参数。

    也可以选择在RESTORE 和RECOVER命令中直接使用UNTIL TIME、UNTIL SCN、 或者 UNTIL SEQUENCE 参数,这样就可以避免使用  run  代码。例如;

    startup mount;

    restore database "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')"; recover database "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')"; alter database open resetlogs;

    4.4.5.1  基于SCN的恢复

    如果知道数据库出错前的 SCN,可以将数据库还原到指定  SCN  状态。

    $ startup mount;

    RMAN> run{

     allocate channel d1 type disk;

    restore database until scn 1317011;          ——或者  set until scn 1317011

    recover database until scn 1317011;

    sql 'alter database open resetlogs';

    release channel d1;

    }

    4.4.5.2  基于时间的恢复

    下面使用 set until time  命令为  2005  年  8  月  1  日下午  1点的恢复目标:

    $ startup mount;

    RMAN> run{

    set until time "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')";

    restore database;

    recover database;

    alter database open resetlogs;

    }

    执行上面的命令时, RMAN  会查找与恢复目标时间最近、但是不包含恢复目标时间及以后时间的备份集,并且从这个备份中还原数据库。如果数据库非归档模式,那么恢复操作会在备份集的时间点停止;否则  RECOVER  命令会应用恢复目标之前的归档重做日志或需要的增量备份。

    4.4.5.3  基于日志序列的恢复

    RMAN  允许用户将数据库恢复到指定的归档重做日志序列号。如果归档的重做日志中有间隙(某个归档日志文件或备份损坏或丢失)  ,使用这种方法就很方便。间隙通常意味 着我们只能将数据库还原到间隙开始的地方。

    SQL> startup mount;

    RMAN> restore database until sequence 100 thread 1;    ——not include 100 RMAN> recover database until sequence 100 thread 1;

    SQL> alter database open resetlogs;

    RMAN> RUN {

    2> SET UNTIL SEQUENCE 120 THREAD 1;

    4> RESTORE DATABASE;

    5> RECOVER DATABASE;    ——recovers through log 119 not include 120

    6> ALTER DATABASE OPEN RESESTLOGS;

    7> }

4.5. RMAN 查看信息List 与Report

    4.5.1  恢复目录相关视图

    恢复目录本身有一组视图,用于存放目标数据库与备份信息,可

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/16486600/viewspace-522841/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-12-25

  • 博文量
    43
  • 访问量
    198776