Chinaunix首页 | 论坛 | 博客
  • 博客访问: 924346
  • 博文数量: 206
  • 博客积分: 10276
  • 博客等级: 上将
  • 技术积分: 2358
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-01 02:41
文章分类

全部博文(206)

文章存档

2014年(1)

2013年(1)

2012年(2)

2011年(10)

2010年(14)

2009年(15)

2008年(33)

2007年(90)

2006年(40)

我的朋友

分类: Oracle

2008-09-05 07:54:39

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;

恢复:(这种备份只是增加一个镜像,不用恢复)

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

 

带。如果要详细了解,见我在 ITPUB上发的帖子:

http://www.itpub.net/viewthread.php?tid=1007747&page=1&extra=

 

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  恢复目录相关视图

 

 恢复目录本身有一组视图,用于存放目标数据库与备份信息,可以用 RMAN用户登录数 据库进行查看,例:

RC_DATABASE

 

RC_DATAFILE

RC_STORED_SCRIPT RC_STORED_SCRIPT_LINE RC_TABLESPACE

4.5.2 RMAN  动态性能视图

 

以下是目标数据库上与  RMAN  备份有关系的一些动态性能视图,可以用 SYS用户进行 查询。

V$ARCHIVED_LOG V$BACKUP_CORRUPTION V$COPY_CORRUPTION V$BACKUP_DEVICE V$CONTROLFILE_RECORD_SECTION

V$BACKUP_DATAFILE      用于通过确 定各数 据文件中 的块数来创建大小 相同的备份

集。通过它也可以找出数据文件中已损坏的块数。 V$BACKUP_REDOLOG    显示在备份集中存储的归档日志。 V$BACKUP_SET    显示已经创建的备份集。 V$BACKUP_PIECE      显示为备份集创建的备份片。

这里还有一个视图,可以大致的监控到  RMAN  备份进行的程度。如通过如下的  SQL

脚本,将获得备份的进度。

SQL> SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK,

2 ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE"

3 FROM V$SESSION_LONGOPS

4 WHERE OPNAME LIKE 'RMAN%'

5 AND OPNAME NOT LIKE '%aggregate%'

6 AND TOTALWORK != 0

7 AND SOFAR <> TOTALWORK;

要在备份过程中将某一进程与一个通道关联起来,请:

1.启动恢复管理器并连接到目标数据库和恢复目录(与后者的连接是可选的)。

rmantarget / catalog rman/rman@rcat

2.在分配通道后,设置 COMMAND ID 参数,然后复制所需的对象。

run {

allocate channel t1 type disk;

set command id to 'rman';

copydatafile 1 to '/u01/backup/df1.cpy';

release channel t1;}

3.查询 V$SESSION_LONGOPS 视图以获得复制的状态。

SELECT sid, serial#, context, sofar, totalwork

 

round(sofar/totalwork*100,2) "% Complete",

FROM v$session_longops

WHERE opname LIKE 'RMAN:%'

AND opname NOT LIKE 'RMAN: aggregate%';

4.使用 SQL*Plus 并查询 V$PROCESS 和 V$SESSION 以获得 SID 和 SPID。然后,       使用操作系统实用程序来监视进程或线程。

SELECT sid, spid, client_info FROM v$process p, v$session s WHERE p.addr = s.paddr

AND client_info LIKE '%id=rman%';

 

4.5.3 List

  

List  命令是一种在数据库控制文件 或者恢复目录中查询备份的历史信息的方法。 List提供了一组信息,可以提供各种备份的信息,如对应物、备份集、归档日志备份、控 制文件备份等等。

列出对应物:

RMAN> list incarnation;

列出备份概要信息:

RMAN> list backup summary;

按备份类型列出备份:

RMAN> list backup by file;

获得备份的详细信息,包括备份片的物理文件名:

RMAN> list backup; RMAN> list backupset bs#;

或者按照TAG  来查:

RMAN> list backup tag=tab_number;

列出过期的备份:

RMAN> list expired backup; 按照表空间和数据文件来列出备份:列出 USERS 表空间的备份:

RMAN> list backup of tablespace USERS;

列出文件  5  的备份:

RMAN> list backup of datafile 5;

列出文件  E:\ORACLE\USERS.DB  的备份:

RMAN> list backup of datafile ' E:\ORAC LE\USERS.DB ';

列出控制文件的备份:

RMAN> list backup of controlfile;

 

列出归档日志的备份:

RMAN> list archivelog all;

RMAN> list backup of archivelog all;

列出副本:

RMAN> list copy                                  列出所有的副本。 RMAN> list copy of controlfile       列出控制文件副本 RMAN> list copy of archivelog all   列出所有归档日志副本

RMAN> list copy of database           列出数据库所有数据文件的副本

 

4.5.4 Report

 

Report  命令被用于判断数据库的当前可恢复状态和提供数据库备份的特定信息,可以检测哪些文件需要备份,哪些备份能被删除以及那些文件能不能获得的信息。可以报 告数据库的所有能备份数据文件对象,包括数据文件名、文件号、表空间、文件大小、 是否含有回滚段等。

RMAN> report schema

或者

RMAN> REPORT SCHEMA AT TIME 'SYSDATE-14'; RMAN> REPORT SCHEMA AT SCN 1000;

RMAN> REPORT SCHEMA AT SEQUENCE 100 THREAD 1;

 

 报告需要备份的数据文件

RMAN> report need backup [ redundancy | days | incremental n];

报告过期了的数据文件或者不可用的备份与拷贝

RMAN> Report obsolete [orphan]

报告最近没有备份的数据文件

RMAN> report need backup days=10;        //  恢复需要超过 10天的归档日志

RMAN> report need backup incremental=3; //  恢复时需要超过 3  增量的文件报表

文件  增量 名称

8

15

E:\ORACLE\ORADATA\MING_RECOVER\MINGDICT.DB

9

15

E:\ORACLE\ORADATA\MING_RECOVER\MINGLOB.DB

 

这个报告中,列出的数据文件,在进行恢复的时候,需要从 3  个以上的增量备份文件中

恢复。我们知道如果需要从很多文件中恢复,会影响恢复速度,可以根据情况来重新备份这

些文件。

报告备份冗余或恢复窗口

我们可以执行 report need backup redundancy  来确定为满足冗余备份策略而需要备份的 文件。例如:

RMAN> report need backup redundancy=2;    //  文件冗余备份少于 2  个

我们也可以按照恢复窗口来查找需要备份的文件。比如我们要求恢复窗口小于 2  天,那 么用下面的命令:

RMAN> report need backup recovery window of 2 days;    //文件报表的恢复需要超过 2天

的归档日志

 

这个命令等同于:report need backup days=2;

 

待续。。。。。。

阅读(1345) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~