RMAN 系列(六) ---- RMAN 高级恢复

这几天心情不太好,这周连续加上3天班,有点累,但是不管怎样,学习不能放下,在当下的社会,要改变自己的命运只能靠学习了,有点很无耐,还是专心搞技术吧。 这篇资料主要讲了一下几个知识点:

1. 不完全恢复

2. 基于RMAN 的恢复主题

3. 表空间时间点恢复

4. 验证备份可恢复

5. 跨平台的数据库移动和RMAN

一. 不完全恢复

不完全恢复是指不完全的数据恢复,不完全恢复与完全恢复在许多方面是相同的,他们基本的命令集相同,但不完全恢复添加了一些其他命令。 引起不完全恢复的原因有很多,如丢失了联机重做日志或归档的重做日志,或者出现重大的用户错误。 不完全恢复会影响整个数据库,换句话,不能只对数据库的一部分执行不完全恢复操作,因为这个会使数据库的一部分具有与这个数据库其余部分不同的SCN和时间点。

要将数据库数据还原到与数据库剩余部分不同的时间点,可以用基于 表空间时间恢复 或者用 闪回技术。 

不完全恢复方法包括:基于时间,SCN,日志序列 或取消的恢复。

1.1 使用resetlogslogs 命令

不完全恢复期间,通常需要使用resetlogs命令打开数据库,这是因为我们要从已经简历的现有日志流中脱离出来,并且需要向Oracle 说明这种情况. Resetlogs 命令表示一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始数据库的逻辑生存期也称为一个对应物(Incarnation). 每次使用resetlogs命令都会创建一个新的数据库对应物,这对于恢复操作来说非常重要

每次使用resetlogs命令时,SCN 计数器不会被重置,不过Oracle 会重置其他计数器(:日志序列号),同时还会重置联机重做日志的内容.

Oracle 10g 简化了通过resetlogs命令进行的恢复,在归档的重做日志名中添加了一个新的特换串(%r),该字符串表示resetlog ID 号。 在log_archive_dest_format 参数串中包括%r时,归档的重做日志名在每个resetlogs 命令中保持唯一。 这种改动以及其他的内部Oracle 数据库改动使oracle 可以很容易的通过给定的resetlogs操作恢复数据库。 因此,可以很容易的在执行操作后立刻备份数据库,然而,我们仍然认为在任何不完全恢复后备份数据库是很有必要的。

Oracle Rmanresetlogs版本恢复

http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4682463.aspx

1.2 建立恢复点

使用RMAN执行不完全恢复操作时需要完成一个工作是简历恢复目标。恢复目录是恢复进程的终点,通常我们基于一个时间点,一个指定的SCN 或者 一个日志序列号来表示它。 我们可以采用许多不同的方法建立恢复目标。 

1.2.1 run 代码块中使用set 命令与until timeuntil SCN 或 until sequence参数

Run

{

Set until time "to_date('2010-07-05 14:02:00','yyyy-mm-dd hh24:mi:ss')";

Restore database;

Recover database alter database open resetlogs;

}

执行这条命令时,RMAN 会查找与恢复目标时间最近(并非恢复目标时间本身也不能是位于恢复目标之间的时间)的备份集,并且从这个备份集中还原数据库。 如果数据库置于noarchivelog 模式中,恢复操作会在备份集的时间停止;否则在执行recover命令期间,oracle 会在所定义的恢复目标(不包含恢复目标本身)上应用归档的重做日志(以及需要应用的任何增量备份)。

注意: 如果尝试恢复到特定备份的完成点,则必须恢复到备份集中文件的CKP SCN 或 CKP TIME,在不同备份集的RMAN list命令中会列出这些内容。 有时使用备份的CKP TIME 并不够,还可能导致ORA-1152错误。

1.2.2 restore recover 命令中直接使用until timeuntil SCN 和 until sequence 参数

这种方法避免使用run 代码块,也倾向与使用这种方法。 

Startup mount;

Restore database until time "to_date('2010-07-05 14:02:00','yyyy-mm-dd hh24:mi:ss')";

Recover database until time "to_date('2010-07-05 14:02:00','yyyy-mm-dd hh24:mi:ss')";

Alter database open resetlogs;

1.3 基于时间的恢复

这种恢复类型允许用户将数据库恢复到与指定时间一致的状态。 当然,如果不存在能将数据库还原到用户请求的时间的有效备份或归档重做日志,Oracle 就会报RMAN-03002 和 RMAN-20207的错误。

必须具备在我们指定的恢复时间之前生成的数据库备份,此外还需要所有归档的重做日志。

1.4 基于SCN 的恢复

Oracle 允许用户将数据库恢复到指定的SCN,实际上,这并不是一种常见的恢复方法。示例如下:

Startup mount;

Restore database until SCN 1000;

Recover database until SCN 1000;

Alter database open resetlogs;

注意: 该示例可以将数据库还原到SCN 1000,但是不会包含SCN.

1.5 基于日志序列的恢复

RMAN 允许用户将数据库恢复到指定序列号的归档重做日志。如果归档的重做日志中存在间隙,使用这种恢复方法就非常方便。 间隙通常意味着我们只能将数据库还原到间隙的开始点。 

Startup mount;

Restore database until sequence 100 thread 1;

Recover database until sequence 100 thread 1;

Alter database open resetlogs;

 

 

二. 基于RMAN 的恢复主题

2.1 只读表空间的恢复

在默认情况下,即使丢失了只读的数据文件,RMAN也不会在执行完全恢复数据库还原操作时还原只读的数据文件。 要在完全恢复期间还原只读的数据文件,就必须在restore 命令中使用check readonly 参数,如:

Restore database check readonly;

注意,执行recover tablespacerecover datafile命令时,RMAN的工作情况是不一样的。 使用这两个命令时,不管表空间是否为只读状态都会执行恢复操作。

2.2 归档重做日志的还原

在使用RMAN的普通恢复过程中,不必恢复归档的重做日志。 不过,偶尔也会要求还原一个或多个归档的重做日志。 例如,我们可能需要使用LogMiner 在备份中存储的归档重做日志文件里查找一些信息。

Restore archivelog all;

Restore archivelog from logseq=20 thread=1;

Restore archivelog from logseq=20 until logseq=30 thread=1;

还可以将归档的重做日志还原到默认位置以外的位置上:

Run

{

Set archivelog destination to "d:/arch";

Restore archivelog all;

}

注意:1. 上例中的set 命令没有替代方法,必须要求使用set。 

  2. 如果RMAN 认为一个归档的重做日志已存在,就不会在磁盘上还原这个归档的重做日志,即使设置的还原位置不同与默认的归档日志位置,Oracle 也不会在这个新的位置上恢复归档的重做日志。

2.3 数据文件副本的还原

可以从数据文件副本(不是备份集)中还原数据库的数据文件。 要实现这个功能,需要先使用restore from datafilecopy命令,然后再使用恢复数据库(或表空间,数据文件)的recover

RMAN>Restore (datafile 5) from datafilecopy;  -- 此处的圆括号是必须的,如果没有就报错

RMAN>Recover datafile 5;

SQL>Alter database datafile 5 online;

执行restore 时,该命令会识别需要还原的数据文件的最新副本,然后从这个副本中还原这些数据文件。 数据文件的最新副本可能是在一个数据文件副本中,而不是在一个副本中。 在这种情况下,Oracle 会恢复这个数据文件副本。 

2.4 恢复讹误的数据块

即使与讹误数据块关联的数据文件一直联机,也可以通过用块介质恢复(block Media recover: BMR)执行块级别恢复操作来修复Oracle 数据库中的这些逻辑上或者物理上的讹误数据块。

一般出现数据块错误时,都会有错误消息:

ORA-01578: ORACLE data block corrupted (file #18,block #88)

如果没有BMR时,我们必须从一个备份中恢复这个数据文件,在恢复过程中,用户不能使用该数据块文件中的所有数据。

BMR恢复就很简单,只需要执行blockrecover命令即可:

Blockrecover datafile 18 block 88;

如果有必要,可以同时恢复多个数据文件的多个数据块。如:

Blockrecover datafile 18 block 16,17,88,108;

Blcokrecover datafile 18 block 88 datafile 19 blcok 188;

Oracle 会跟踪在备份和恢复期间发生的数据块讹误。如果检测到备份或复制操作出现讹误,由于Oracle 不允许在备份中出现讹误,所有这个备份就会失败。 当然,可以配置RMAN允许一定数量的讹误,但是不推荐这种用法。

可以使用backup validate database 命令查看RMAN 检测到的所有数据库讹误。这条命令会在v$backup_corruption v$database_block_corruption视图中填充检测到的所有讹误数据块。 如果讹误发生在复制操作期间,v$copy_corruption视图就会指明包含讹误的备份集。

注意的是:v$backup_corruption 是一个显示历史讹误的视图,v$database_block_corruption 则是一个显示当前数据块讹误的视图。 一旦修正了数据库的块讹误,就需要重新运行backup validate database命令,然后查询v$database_block_corruption 视图以确保不存在其他讹误。

查询v$database_block_corruption视图可以查看讹误数据块的详细信息。 如下所示,使用具有corruption list restore 参数的blockrecover命令可以方便地修正v$database_block_corruption 视图中的讹误数据块。

Blockrecover corruption list restore until time 'SYSDATE-5';

这条命令将还原讹误列表中最近5天的所有讹误数据块。 在上面的命令中,还可以使用until time 和 until sequence.

2.5 恢复前一个对应物

一个数据库的对应物(incarnation)对应这个数据库的特定逻辑生存期。 有时我们需要使用上次执行resetlogs命令打开数据库前生成的一个备份来还原数据库,或者可能需要还原到执行上一个resetlogs命令之前的时间点。 这就需要用到incarnation.

2.5.1 使用恢复目录恢复前一个对应物

 先假设使用恢复目录执行了备份操作,并且最近使用了resetlogs命令执行过时间点恢复,现在需要使用执行resetlogs命令之前的一个备份来恢复数据库。

操作步骤:

(1)启动但不加载实例,这是因为我们要先得到一个与恢复数据库对应物关联的控制文件

(2)使用reset database to incarnation 命令为RMAN 指示对应物的备份集。

(3)Restore controlfile,使rman还原最新的控制文件

(4)加载数据库

(5)Restore 数据库

(6)Recover 数据库

(7)使用resetlogs 打开数据库

示例如下:

C:/Users/Administrator.DavidDai>rman target / catalog rman/rman@orcl;

恢复管理器: Release 11.2.0.1.0 - Production on 星期二 7月 6 10:31:40 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

连接到目标数据库: ORCL (DBID=1247395743)

连接到恢复目录数据库

RMAN> list incarnation;

数据库原型列表

DB 关键字  Inc 关键字 DB 名  DB ID            STATUS  重置 SCN  重置时间

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

2       12      ORCL     1250808537       PARENT  1          30-8月 -05

2       4       ORCL     1250808537       PARENT  534907     30-6月 -10

2       323     ORCL     1250808537       CURRENT 940996     06-7月 -10

RMAN> startup force nomount;

RMAN> reset database to incarnation 4;

RMAN> restore controlfile;

RMAN>alter database mount;

RMAN>restore database until scn 940990;

RMAN>recover database until scn 940990;

RMAN>alter database open resetlogs;

2.5.2 不使用恢复目录恢复前一个对应物

为了通过前一个对应物进行恢复,需要一个包含前一个对应物信息的控制文件。在大多数情况下,这可能是当前的控制文件。如果当前的控制文件不了解需要恢复的对应物,则需要还原包含该信息的控制文件,从而使得利用该方法恢复数据。 可以使用list incarnation of database 命令查看控制文件了解哪些对应物.

没有连接恢复目录的list incarnation 输出与已连接恢复目录时的list incarnation 输出有一些细微的区别。 这是因为信息从控制文件中获得的,因此某些键(如Inc key)将会不同。

操作步骤如下:

(1)RMAN中运行list incarnation 命令,确定希望复位到哪个对应物

(2)关闭数据库

(3)启动加载数据库

(4)执行reset database to incarnation 命令复位对应物

(5)使用restore 命令还原数据库

(6)recover恢复数据库

(7)使用resetlogs 打开数据库

示例如下:

RMAN> list incarnation of database;

数据库原型列表

DB 关键字  Inc 关键字 DB 名  DB ID            STATUS  重置 SCN  重置时间

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

1       1       ORCL     1247395743       PARENT  1          02-4月 -10

2       2       ORCL     1247395743       PARENT  940976     21-5月 -10

3       3       ORCL     1247395743       ORPHAN  8426617    06-7月 -10

4       4       ORCL     1247395743       CURRENT 8554968    06-7月 -10

RMAN>shutdown immediate;

RMAN>startup mount;

RMAN> reset database to incarnation 2;

将数据库重置为原型 2

RMAN> restore database until time "to_date('2010-7-5 23:50:39','yyyy-mm-dd hh24:mi:ss')";

启动 restore 于 06-7月 -10

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在开始还原数据文件备份集

通道 ORA_DISK_1: 正在指定从备份集还原的数据文件

通道 ORA_DISK_1: 将数据文件 00001 还原到 D:/APP/ADMINISTRATOR/ORADATA/ORCL/SYSTEM01.DBF

通道 ORA_DISK_1: 将数据文件 00002 还原到 D:/APP/ADMINISTRATOR/ORADATA/ORCL/SYSAUX01.DBF

通道 ORA_DISK_1: 将数据文件 00003 还原到 D:/APP/ADMINISTRATOR/ORADATA/ORCL/UNDOTBS01.DBF

通道 ORA_DISK_1: 将数据文件 00004 还原到 D:/APP/ADMINISTRATOR/ORADATA/ORCL/USERS01.DBF

通道 ORA_DISK_1: 将数据文件 00005 还原到 D:/APP/ADMINISTRATOR/ORADATA/ORCL/DAVE0.DBF

通道 ORA_DISK_1: 正在读取备份片段 F:/BACKUP/ORCL_1GLI2EN5_1_1.BAK

通道 ORA_DISK_1: 段句柄 = F:/BACKUP/ORCL_1GLI2EN5_1_1.BAK 标记 = TAG20100705T232732

通道 ORA_DISK_1: 已还原备份片段 1

通道 ORA_DISK_1: 还原完成用时: 00:01:45

完成 restore 于 06-7月 -10

RMAN> recover database until time "to_date('2010-7-5 23:50:39','yyyy-mm-dd hh24:mi:ss')";

启动 recover 于 06-7月 -10

使用通道 ORA_DISK_1

正在开始介质的恢复

线程 序列 156 的归档日志已作为文件 D:/ARCHIVELOG/ORCL_1_156_719615012.ARC 存在于磁盘上

归档日志文件名=D:/ARCHIVELOG/ORCL_1_156_719615012.ARC 线程=1 序列=156

介质恢复完成用时: 00:00:02

完成 recover 于 06-7月 -10

RMAN> alter database open resetlogs;

数据库已打开

RMAN> list incarnation;

数据库原型列表

DB 关键字  Inc 关键字 DB 名  DB ID            STATUS  重置 SCN  重置时间

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

1       1       ORCL     1247395743       PARENT  1          02-4月 -10

2       2       ORCL     1247395743       PARENT  940976     21-5月 -10

3       3       ORCL     1247395743       ORPHAN  8426617    06-7月 -10

4       4       ORCL     1247395743       CURRENT 8554968    06-7月 -10

注: until 后面可以跟三种类型: 

1. restore database until time "to_date('2010-7-5 23:50:39','yyyy-mm-dd hh24:mi:ss')";

2. recover database until scn 1000

3. recover database until sequence 150;

查看sequence:

SQL> select sequence# from v$archived_log;

 SEQUENCE#

       161

       162

         1

         2

         3

         4

从这个结果也证明resetlogs 会重置sequnce,但是scn不会被重置。

查看scn

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

8555698

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

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

 8555706

Oracle Rmanresetlogs版本恢复

http://www.cndba.cn/dave/article/1271

 

 

三. 表空间时间点恢复

表空间时间点恢复,TSPITR: tablespace point-in-time recovery.   Oracle 官网文档的连接地址:

RMAN Tablespace Point-in-Time Recovery (TSPITR)

http://www.cndba.cn/q195136130/article/180

使用表空间时间点恢复(TSPITR)可以一个或多个SYSTEM表空间恢复到与数据库其他部分不同的某个时间点上这点和Flashback 有点类型。 比如用户误删了3张表,我们就可以用TSPITR恢复。

Oracle Flashback 技术 总结

http://www.cndba.cn/Dave/article/1276

先看TSPITR 的工作流程,如下图所示:

(1) 在辅助实例上用target的备份集restore 数据文件

(2) 在辅助库上用target的归档文件recover 数据文件

(3) 在辅助库上导出相关数据

(4) 修改主库的控制文件

(5) 用辅助库上导出文件导入辅助库上。

几个相关相关的定义:

辅助实例(Auxiliary instance)我们创建的临时实例,RMAN可以使用这个实例执行TSPITR,完成TSPITR操作后,可以删除辅助实例。

辅助数据库(Auxiliary database)主数据库的一个复本或子集,用于表空间的临时恢复。

主数据库(Primary database)需要TSPITR的数据库

恢复集(Recovery set)构成恢复到某一个时间点表空间的表空间或数据文件,SYSTEM表空间数据文件不能作为恢复集的一部分

辅助集(Auxiliary set)需要执行TSPITR的其他目标数据库文件集。 辅助集包括备份控制文件,回滚和撤销段表空间数据文件,system表空间数据文件,辅助数据库的联机重做日志,以及一个可选的位于辅助数据库中的临时的表空间。

目标实例(target instance):包含将要恢复的表空间

3.1 执行自动的TSPITR

3.1.1 TSPITR 做准备

在开始执行TSPITR之前需要完成一些步骤。 

(1) 确定还原的时间点

这是最关键的因素。 我们需要认真对待这项操作,因为如果没有使用恢复目录,则表空间的恢复是一次性的过程。 如果错误地标识了恢复的时间点,则不能重新来过。 如果使用恢复目录,则不存在这种限制。

(2) 确定传送集中的对象是自包含的

应该使用TS_PITR_CHECK 视图来确保恢复集是完整的,并且标识所有可能要用到的其他表空间。 首先需要检查TS_PITR_CHECK 视图来确保没有其他相关的表空间。 比如我们检查DAVE 表空间,示例代码如下:

/* Formatted on 2010/7/7 17:10:00 (QP5 v5.115.810.9015) */

SELECT   obj1_owner,

         obj1_name,

         obj1_type,

         reason

  FROM   sys.ts_pitr_check

 WHERE   (ts1_name IN ('BL') AND ts2_name NOT IN ('BL'))

         OR (ts1_name NOT IN ('BL') AND Ts2_Name IN ('BL'))

如果没有冲突,则不会返回任何行。 如果存在冲突,则会看到描述的每个冲突的行。如果有冲突,我们也需要还原关联的表空间。

(3) 保存可能丢失的对象或数据

如果我们将Dave表空间恢复之前的某个时间,那么在这个时间以后的任何更改,如新建对象,更新,插入或者删除,都会丢失。 丢失这些对象可能没有问题,但假设我们需要保存这些数据,则需要导出将要保存的数据,或者将数据复制到数据库中的其他位置。 Oracle 提供了视图 TS_PITR_OBJECTS_TO_BEDROPPED, 该视图列出了将在恢复操作期间丢失的所有对象。 使用该视图可以确定表空间中的对象在恢复之后的状态。

SQL> col owner format a10

SQL> col name format a10

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

SQL> SELECT  *  FROM   ts_pitr_objects_to_be_dropped WHERE  tablespace_name = 'BL' ;

OWNER      NAME       CREATION_TIME       TABLESPACE_NAME

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

BL         BL         2010-07-07 19:24:18    BL

3.1.2 执行实际的TSPITR

Oracle Database 10g将为我们执行自动的TSPITR,这意味着它将创建辅助实例。 在这种情况下,我们只需要连接目标数据库和可选的恢复目录(如果有的话),并且执行recover tablespace 命令。 RMAN 将为我们完成剩余的工作。

下面演示使用recover tablespace 命令恢复BL 表空间的示例。 我们使用可选的auxiliary destination来指示RMAN 和 Oracle 应该在何处创建与辅助数据库关联的文件。 使用该参数使得该恢复成为一个具有自动化实例的自定义TSPITR。 如果没有使用该参数,TSPITR 就称为完全自动的TSPITR 恢复。

需要注意的是,如果使用auxiliary destination参数,则应该已经创建了目标目录,并且Oracle 必须能够写入到该目标目录。 在目标路径名中没有后缀的斜杠(/或/),如果包含斜杠将会导致TSPITR失败,并且获得错误消息无法确切地描述该问题。命令如下:

Recover tablespace BL until time "to_date('2010-7-7 20:38:18','yyyy-mm-dd hh24:mi:ss')" auxiliary destination 'F:/bl'

在执行这个命令之前有几点注意的地方,因为TSPITR 会用已经存在的备份集和归档文件来创建辅助数据库,所以在执行该命令之前需要确认target 数据库有备份和归档,并且控制文件也要有备份。 

RMAN> Recover tablespace BL until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')" auxiliary destination 'F:/bl';

启动 recover 于 07-7月 -10

使用目标数据库控制文件替代恢复目录

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: SID=145 设备类型=DISK

RMAN-05026: 警告假定以下表空间集适用于指定的时间点

表空间列表要求具有 UNDO 

表空间 SYSTEM

表空间 UNDOTBS1

使用 SID='iEfs' 创建自动实例  -- 这里是系统自动创建的辅助数据库名

供自动实例使用的初始化参数:

db_name=BL

db_unique_name=iEfs_tspitr_BL

compatible=11.2.0.0.0

db_block_size=8192

db_files=200

sga_target=280M

processes=50

db_create_file_dest=F:/bl

log_archive_dest_1='location=F:/bl'

#No auxiliary parameter file used

启动自动实例 BL

Oracle 实例已启动

系统全局区域总计     292933632 字节

Fixed Size                     1374164 字节

Variable Size                100665388 字节

Database Buffers             184549376 字节

Redo Buffers                   6344704 字节

自动实例已创建

对恢复集表空间运行 TRANSPORT_SET_CHECK

TRANSPORT_SET_CHECK 已成功完成

内存脚本的内容:

{

# set requested point in time

set until  time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";

# restore the controlfile

restore clone controlfile;

# mount the controlfile

sql clone 'alter database mount clone database';

# archive current online log

sql 'alter system archive log current';

# avoid unnecessary autobackups for structural changes during TSPITR

sql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;';

}

正在执行内存脚本

正在执行命令: SET until clause

启动 restore 于 07-7月 -10

分配的通道: ORA_AUX_DISK_1

通道 ORA_AUX_DISK_1: SID=59 设备类型=DISK

通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集

通道 ORA_AUX_DISK_1: 正在还原控制文件

通道 ORA_AUX_DISK_1: 正在读取备份片段 D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/B

L/AUTOBACKUP/2010_07_07/O1_MF_S_723759094_638VQR8R_.BKP

通道 ORA_AUX_DISK_1: 段句柄 = D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/BL/AUTOBA

CKUP/2010_07_07/O1_MF_S_723759094_638VQR8R_.BKP 标记 = TAG20100707T201134

通道 ORA_AUX_DISK_1: 已还原备份片段 1

通道 ORA_AUX_DISK_1: 还原完成用时: 00:00:02

输出文件名=F:/BL/BL/CONTROLFILE/O1_MF_638Y5Y3J_.CTL

完成 restore 于 07-7月 -10

sql 语句: alter database mount clone database

sql 语句: alter system archive log current

sql 语句: begin dbms_backup_restore.AutoBackupFlag(FALSE); end;

内存脚本的内容:

{

# set requested point in time

set until  time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";

# set destinations for recovery set and auxiliary set datafiles

set newname for clone datafile  1 to new;

set newname for clone datafile  3 to new;

set newname for clone datafile  2 to new;

set newname for clone tempfile  1 to new;

set newname for datafile  5 to

 "D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF";

# switch all tempfiles

switch clone tempfile all;

# restore the tablespaces in the recovery set and the auxiliary set

restore clone datafile  1, 3, 2, 5;

switch clone datafile all;

}

正在执行内存脚本

正在执行命令: SET until clause

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

临时文件 在控制文件中已重命名为 F:/BL/BL/DATAFILE/O1_MF_TEMP_%U_.TMP

启动 restore 于 07-7月 -10

使用通道 ORA_AUX_DISK_1

通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集

通道 ORA_AUX_DISK_1: 正在指定从备份集还原的数据文件

通道 ORA_AUX_DISK_1: 将数据文件 00001 还原到 F:/BL/BL/DATAFILE/O1_MF_SYSTEM_%U_.DBF

通道 ORA_AUX_DISK_1: 将数据文件 00003 还原到 F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_%U_.DBF

通道 ORA_AUX_DISK_1: 将数据文件 00002 还原到 F:/BL/BL/DATAFILE/O1_MF_SYSAUX_%U_.DBF

通道 ORA_AUX_DISK_1: 将数据文件 00005 还原到 D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF

通道 ORA_AUX_DISK_1: 正在读取备份片段 F:/BACKUP/BL_02LI7BSK_1_1.BAK

通道 ORA_AUX_DISK_1: 段句柄 = F:/BACKUP/BL_02LI7BSK_1_1.BAK 标记 = TAG20100707T200956

通道 ORA_AUX_DISK_1: 已还原备份片段 1

通道 ORA_AUX_DISK_1: 还原完成用时: 00:02:46

完成 restore 于 07-7月 -10

数据文件 已转换成数据文件副本

输入数据文件副本 RECID=4 STAMP=723761776 文件名=F:/BL/BL/DATAFILE/O1_MF_SYSTEM_638Y6B6B_.DBF

数据文件 已转换成数据文件副本

输入数据文件副本 RECID=5 STAMP=723761776 文件名=F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_638Y6B8V_.DBF

数据文件 已转换成数据文件副本

输入数据文件副本 RECID=6 STAMP=723761777 文件名=F:/BL/BL/DATAFILE/O1_MF_SYSAUX_638Y6B7Q_.DBF

内存脚本的内容:

{

# set requested point in time

set until  time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";

# online the datafiles restored or switched

sql clone "alter database datafile  1 online";

sql clone "alter database datafile  3 online";

sql clone "alter database datafile  2 online";

sql clone "alter database datafile  5 online";

# recover and open resetlogs

recover clone database tablespace  "BL", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;

alter clone database open resetlogs;

}

正在执行内存脚本

正在执行命令: SET until clause

sql 语句: alter database datafile  1 online

sql 语句: alter database datafile  3 online

sql 语句: alter database datafile  2 online

sql 语句: alter database datafile  5 online

启动 recover 于 07-7月 -10

使用通道 ORA_AUX_DISK_1

正在开始介质的恢复

线程 序列 的归档日志已作为文件 D:/ARCHIVELOG/BL_ARC0000000007_0723658881.0001 存在于磁盘上

线程 序列 的归档日志已作为文件 D:/ARCHIVELOG/BL_ARC0000000008_0723658881.0001 存在于磁盘上

线程 序列 的归档日志已作为文件 D:/ARCHIVELOG/BL_ARC0000000009_0723658881.0001 存在于磁盘上

归档日志文件名=D:/ARCHIVELOG/BL_ARC0000000007_0723658881.0001 线程=1 序列=7

归档日志文件名=D:/ARCHIVELOG/BL_ARC0000000008_0723658881.0001 线程=1 序列=8

归档日志文件名=D:/ARCHIVELOG/BL_ARC0000000009_0723658881.0001 线程=1 序列=9

介质恢复完成用时: 00:00:14

完成 recover 于 07-7月 -10

数据库已打开

内存脚本的内容:

{

# online the tablespaces that will be exported

sql clone 'alter tablespace  BL online';

# make read only the tablespace that will be exported

sql clone 'alter tablespace  BL read only';

# create directory for datapump import

sql "create or replace directory TSPITR_DIROBJ_DPDIR as ''

F:/bl''";

# create directory for datapump export

sql clone "create or replace directory TSPITR_DIROBJ_DPDIR as ''

F:/bl''";

}

正在执行内存脚本

sql 语句: alter tablespace  BL online

sql 语句: alter tablespace  BL read only

sql 语句: create or replace directory TSPITR_DIROBJ_DPDIR as ''F:/bl''

sql 语句: create or replace directory TSPITR_DIROBJ_DPDIR as ''F:/bl''

正在执行元数据导出...

   EXPDP> 启动 "SYS"."TSPITR_EXP_iEfs":

   EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK

   EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/TABLE

   EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK

   EXPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_EXP_iEfs"

   EXPDP> ******************************************************************************

   EXPDP> SYS.TSPITR_EXP_iEfs 的转储文件集为:

   EXPDP>   F:/BL/TSPITR_IEFS_51961.DMP

   EXPDP> ******************************************************************************

   EXPDP> 可传输表空间 BL 所需的数据文件:

   EXPDP>   D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF

   EXPDP> 作业 "SYS"."TSPITR_EXP_iEfs" 已于 20:59:10 成功完成

导出完毕

内存脚本的内容:

{

# shutdown clone before import

shutdown clone immediate

# drop target tablespaces before importing them back

sql 'drop tablespace  BL including contents keep datafiles';

}

正在执行内存脚本

数据库已关闭

数据库已卸装

Oracle 实例已关闭

sql 语句: drop tablespace  BL including contents keep datafiles

正在执行元数据导入...

   IMPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_IMP_iEfs"

   IMPDP> 启动 "SYS"."TSPITR_IMP_iEfs":

   IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK

   IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/TABLE

   IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK

   IMPDP> 作业 "SYS"."TSPITR_IMP_iEfs" 已于 21:00:49 成功完成

导入完毕

内存脚本的内容:

{

# make read write and offline the imported tablespaces

sql 'alter tablespace  BL read write';

sql 'alter tablespace  BL offline';

# enable autobackups after TSPITR is finished

sql 'begin dbms_backup_restore.AutoBackupFlag(TRUE); end;';

}

正在执行内存脚本

sql 语句: alter tablespace  BL read write

sql 语句: alter tablespace  BL offline

sql 语句: begin dbms_backup_restore.AutoBackupFlag(TRUE); end;

删除自动实例

自动实例已删除

已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_TEMP_638YDTJF_.TMP

已删除辅助实例文件 F:/BL/BL/ONLINELOG/O1_MF_3_638YDJ2V_.LOG

已删除辅助实例文件 F:/BL/BL/ONLINELOG/O1_MF_2_638YDDND_.LOG

已删除辅助实例文件 F:/BL/BL/ONLINELOG/O1_MF_1_638YD9K7_.LOG

已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_SYSAUX_638Y6B7Q_.DBF

已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_638Y6B8V_.DBF

已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_SYSTEM_638Y6B6B_.DBF

已删除辅助实例文件 F:/BL/BL/CONTROLFILE/O1_MF_638Y5Y3J_.CTL

完成 recover 于 07-7月 -10

RMAN>

一旦完成了TSPITR,我们就应该能够查看到已经恢复的表空间中的对象,并且发现他们已经被恢复到请求的时间点。 我们需要将恢复的表空间改回到联机状态以使用它们。 

SQL> select tablespace_name,online_status from dba_data_files;

TABLESPACE_NAME     ONLINE_

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

USERS                 ONLINE

UNDOTBS1             ONLINE

SYSAUX               ONLINE

SYSTEM               SYSTEM

BL                     OFFLINE

SQL> Alter tablespace BL online;

表空间已更改。

如果产生错误,Oracle 就会保持辅助实例和相关数据文件的完整性。 我们可以尝试修正问题并重新启动恢复操作。 在这种情况下,使用auxiliary参数重新启动RMAN,并且连接辅助实例。

如果辅助实例的创建工作没有完全成功,可以很容易的删除辅助实例和它的服务,而不是使用手工的TSPITR过程重新启动恢复操作。首先,指出失败的原因,然后删除实例和服务,并且重新启动自动的TSPITR过程。

删除辅助实例,用sysdba连接sqlplus,然后执行一下命令即可:

SQL> conn / as sysdba

已连接。

SQL>  exec dbms_backup_restore.manageauxinstance('sjus',1);

PL/SQL 过程已成功完成。

这里的sjus 是辅助实例名,在RMAN的输出中有显示。这使TSPITR恢复之前清除所有旧的辅助实例,可以在执行该命令后进入辅助目标目录,并删除该目录中的任何文件。

3.1.3 带有自动化实例的自定义自动TSPITR

在执行TSPITR时可以使用自定义自动化实例创建,并且仍然允许Oracle 创建实例的其他的方法:

(1) 使用set newname 命令指示恢复集的单个数据文件的位置

(2) 使用configure auxname命令定义辅助实例名

(3) 为辅助实例创建自己的控制文件,并且在参数文件中提供参数(如:db_file_name_convert)。通过在$ORACLE_HOME/rdbms/admin 中创建名为parms_auxint.ora 文件来完成这项工作。 作为选择,我们可以使用RMAN命令set auxiliary instance parameter file 来指定辅助实例参数文件驻留在客户端上的路劲。

一旦已经自定义了辅助实例,就可以通过执行recover tablespace 命令让RMAN 创建辅助实例。

3.2 手工执行TSPITR

Oracle 支持为TSPITR 创建自己的辅助实例。 也可以使用手工的TSPITR来完成失败的自动TSPITR操作。 首先,依然是应用前面的准备阶段中列出的步骤,接着必须准备辅助实例,然后执行TSPITR过程。

3.2.1 准备辅助实例

首先,需要启动和运行辅助实例。辅助实例只是RMAN用于执行TSPITR的临时实例。 辅助实例必须驻留在与目标数据库相同的机器中,并且在辅助实例上不能执行任何类型的DML

在启动TSPITR前,需要准备辅助实例。和普通的数据库实例创建一样。 

Windows Oracle 10G手工创建数据库

http://www.cndba.cn/Dave/article/1273

    linux 下手工新建数据库

http://www.cndba.cn/Dave/article/1274

我们假设创建的辅助实例名是TEST. 操作步骤如下:

(1) 创建口令文件

C:>orapwd file=D:/app/Administrator/product/11.2.0/dbhome_1/database/PWDTEST.ora password=admin

(2) 创建服务

C:/>oradim -new -sid TEST

oradim是创建实例的工具程序名称,-new表明执行新建实例,-delete表明执行删掉实例,-sid指定害例的名称。 

(3) 创建参数文件

辅助数据库的参数文件不同于目标数据库所使用的参数文件。辅助实例中应该添加的一些参数如下表:

参数名

可选或必选

说明

Db_name

可选

与目标数据库相同的名称

Lock_name_space

必选

不同于创建辅助实例所在系统上其他数据库名的唯一名称。

Db_file_name_convert

可选

RMAN还原辅助数据库中的数据文件时,该参数用于为这些数据文件定义一组文件命名转换模式。 它可以代替RMANconfigure auxname命令。

Log_file_name_convert

可选

RMAN还原辅助数据库中的重做日志时,该参数用于为这些重做日志定义一组命令转换模式。 它可以代替RMANset newnameml .

Control_files

必要

这个参数定义了辅助实例控制文件的名称和位置。 辅助实例控制文件的名称应当不同于锁一定位置中已有的其他控制文件名。

Remote_login_passwordfile

可选/必要

用于允许RMAN 通过Oracle networking 服务连接辅助数据库。 要求存在一个当前的口令文件。 如果要本地连接辅助数据库,就不需要设置该参数。

Compatible

必要

必须与目标数据库的设置相同

Db_block_size

可选/必要

如果在目标数据库上设置了该参数,在辅助数据库中也必须设置为同样的参数值。 

我们将所有辅助实例都放到F:/TEST目录下,辅助实例的参数如下:

db_name=BL

db_unique_name=TEST

db_block_size=8192

db_cache_size=8388608

timed_statistics=TRUE

shared_pool_size=110M

large_pool_size=1M

compatible=11.2.0.0.0

Background_dump_dest=F:/TEST

Core_dump_dest=F:/TEST

User_dump_dest=F:/TEST

Control_files=F:/TEST/control01.ctl

db_create_file_dest=F:/TEST

log_file_name_convert=('D:/app/Administrator/oradata/bl','F:/TEST');

将该参数保存为initTEST.ora, 存放在F:/TEST/下。

(4) 启动辅助实例,并检查网络连通性

C:/Users/Administrator.DavidDai>set ORACLE_SID=TEST

C:/Users/Administrator.DavidDai>sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 7月 8 15:52:17 2010

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

SQL> conn / as sysdba

已连接到空闲例程。

SQL> startup nomount pfile='f:/test/inittest.ora';

ORA-32006: BACKGROUND_DUMP_DEST initialization parameter has been deprecated

ORA-32006: USER_DUMP_DEST initialization parameter has been deprecated

ORACLE 例程已经启动。

Total System Global Area  163221504 bytes

Fixed Size                  1373236 bytes

Variable Size             146803660 bytes

Database Buffers            8388608 bytes

Redo Buffers                6656000 bytes

SQL>

(5) 执行带有手工辅助实例的TSPITR

RMAN 连接目标数据库,辅助实例,和恢复目录(如果有)。

还原控制文件,打开辅助实例。 

C:/Users/Administrator.DavidDai>set ORACLE_SID=TEST

C:/Users/Administrator.DavidDai>rman target sys/admin@bl auxiliary=/

恢复管理器: Release 11.2.0.1.0 - Production on 星期四 7月 8 16:05:56 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

连接到目标数据库: BL (DBID=680066685)

已连接到辅助数据库: BL (未装载)

RMAN>    run

2>      {

3>      set until  time "to_date('2010-7-8 16:23:18','yyyy-mm-dd hh24:mi:ss')";

4>      restore clone controlfile ;

5>      sql clone 'alter database mount clone database';

6>      sql 'alter system archive log current';

7>      }

正在执行命令: SET until clause

启动 restore 于 08-7月 -10

使用通道 ORA_AUX_DISK_1

通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集

通道 ORA_AUX_DISK_1: 正在还原控制文件

通道 ORA_AUX_DISK_1: 正在读取备份片段 D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/B

L/AUTOBACKUP/2010_07_08/O1_MF_S_723831710_63C2O0HN_.BKP

通道 ORA_AUX_DISK_1: 段句柄 = D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/BL/AUTOBA

CKUP/2010_07_08/O1_MF_S_723831710_63C2O0HN_.BKP 标记 = TAG20100708T162150

通道 ORA_AUX_DISK_1: 已还原备份片段 1

通道 ORA_AUX_DISK_1: 还原完成用时: 00:00:02

输出文件名=F:/TEST/CONTROL01.CTL

完成 restore 于 08-7月 -10

sql 语句: alter database mount clone database

sql 语句: alter system archive log current

RMAN>

说明:1. alter system archive log current,它确保用于副本数据库恢复的所有重做都可用。 

      2. Sql colne 命令是在副本数据库上执行sql命令

确定并还原数据文件

 我们需要还原systemsysaux, undo, temp 表空间,和我们将要还原的表空间,这里是BL 表空间。要注意的是,在我们开始创建辅助实例之前,要将待恢复的表空间设置为offline.

SQL> select file_id,tablespace_name from dba_data_files;

   FILE_ID TABLESPACE_NAME

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

         4 USERS

         3 UNDOTBS1

         2 SYSAUX

         1 SYSTEM

         5 BL

SQL> alter tablespace BL offline for recover;

表空间已更改。

RMAN> run

2> {

3> # set requested point in time

4> set until  time "to_date('2010-7-8 16:23:18','yyyy-mm-dd hh24:mi:ss')";

5> # set destinations for recovery set and auxiliary set datafiles

6> set newname for clone datafile  1 to new;

7> set newname for clone datafile  3 to new;

8> set newname for clone datafile  2 to new;

9> set newname for clone tempfile  1 to new;

10> set newname for datafile  5 to  "D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF";

11> # switch all tempfiles

12> switch clone tempfile all;

13> # restore the tablespaces in the recovery set and the auxiliary set

14> restore clone datafile  1, 3, 2, 5;

15> switch clone datafile all;

16> }

说明: set newname for clone 命令确保还原期间正确的命令这些文件。 对数据文件5进行set newname是为还原该数据文件做准备。

打开辅助实例,准备执行TSPITR

run

{

# set requested point in time

set until  time "to_date('2010-7-8 16:23:18','yyyy-mm-dd hh24:mi:ss')";

# online the datafiles restored or switched

sql clone "alter database datafile  1 online";

sql clone "alter database datafile  3 online";

sql clone "alter database datafile  2 online";

sql clone "alter database datafile  5 online";

# recover and open resetlogs

recover clone database tablespace  "BL", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;

alter clone database open resetlogs;

}

导出元数据,在导入数据

Exp user/pwd point_in_time_recover=y tablespaces=BL file=tspitr.dmp

Imp user/pwd point_in_time_recover=y file=tspitr.dmp

最后将BL表空间online

Alter tablespace BL online. 

操作完成后,别忘了重新备份数据库,及删除辅助实例。

从上面的步骤来看,手工操作和自动步骤是一样的,只不过手工将这些步骤分开了。

3.3 TSPITR的限制

TSPITR 有许多的限制:

(1)不能还原包含SYS用户特有对象的表空间

(2)不能用TSPITR恢复含有复制主表的表空间

(3)不支持使用快照日志的表空间

(4)不能还原含有回滚段的表空间

(5)如果要恢复的表空间中的对象包含如下对象,则不支持:

Varray

嵌套表

外部文件

此外,TSPITR 不能用于恢复删除的表空间,我们也不能恢复旧的对象统计表。

如果使用不含恢复目录的RMAN,还会存在下面与TSPITR的限制:

1)在要恢复的点和当前的点之间,目标数据库中撤销和回滚段的当前物理结构必须没有变化。 回滚段在恢复期间不能发生变化。

2)完成指定表空间的TSPITR后,这个表空间以前的所有备份就不能在用于以后的TSPITR。 这就是TSPITR后的表空间备份操作非常重要的原因,只有再次备份表空间后才能执行下一个TSPITR.

 

 

四. 验证备份可恢复

如果备份不可恢复,那么它就没有用处。 RMAN 提供了一种不需要还原数据库就能检查数据库还原能力的方法,并且为用户提供了几个检查选项。

4.1  restore preview命令

该命令可以查看RMAN 使用哪个备份集来执行特定的恢复。 该命令将列出还原所需的备份集的详细信息。

RMAN> restore database preview;

启动 restore 于 08-7月 -10

使用通道 ORA_DISK_1

备份集列表

===================

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间

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

7       Full    987.05M    DISK        00:01:40     08-7月 -10

        BP 关键字: 7   状态: AVAILABLE  已压缩: NO  标记: TAG20100708T161959

段名:F:/BACKUP/BL_07LI9IPG_1_1.BAK

  备份集 中的数据文件列表

  文件 LV 类型 Ckp SCN    Ckp 时间   名称

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

  1       Full 1041819    08-7月 -10 D:/APP/ADMINISTRATOR/ORADATA/BL/SYSTEM01.DBF

  2       Full 1041819    08-7月 -10 D:/APP/ADMINISTRATOR/ORADATA/BL/SYSAUX01.DBF

  3       Full 1041819    08-7月 -10 D:/APP/ADMINISTRATOR/ORADATA/BL/UNDOTBS01.DBF

  4       Full 1041819    08-7月 -10 D:/APP/ADMINISTRATOR/ORADATA/BL/USERS01.DBF

  5       Full 1041819    08-7月 -10 D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF

db_unique_name 为 BL 的数据库的归档日志副本列表

=====================================================================

关键字     线程序列     时间下限

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

8       1    12      A 08-7月 -10

        名称: D:/ARCHIVELOG/BL_ARC0000000012_0723658881.0001

9       1    13      A 08-7月 -10

        名称: D:/ARCHIVELOG/BL_ARC0000000013_0723658881.0001

介质恢复启动 SCN 是 1041819

恢复范围必须超出 SCN 1041819 才能清除数据文件模糊性

完成 restore 于 08-7月 -10

4.2 verify 和 check logical参数的restore 命令

Restore 命令提供一些验证数据库可恢复和备份有效的选项。 首先,可以使用backup命令的validate参数使RMAN 检查备份,以确定数据库是可恢复的。 使用validate选项时,Oracle会检查用于恢复数据库的最新备份集以确定这个备份集是完整的,还会检查操作需要使用的所有数据文件副本和归档的重做日志备份集,并确定他们也是完整的。 此外,validate 选项会对备份集执行全面的验证操作,以确保这些备份的完整性。 验证操作的时间不会太长,并且这是确保数据库可恢复的一种方法。

RMAN> restore database validate;

启动 restore 于 08-7月 -10

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在开始验证数据文件备份集

通道 ORA_DISK_1: 正在读取备份片段 F:/BACKUP/BL_07LI9IPG_1_1.BAK

通道 ORA_DISK_1: 段句柄 = F:/BACKUP/BL_07LI9IPG_1_1.BAK 标记 = TAG20100708T161959

通道 ORA_DISK_1: 已还原备份片段 1

通道 ORA_DISK_1: 验证完成用时: 00:00:26

完成 restore 于 08-7月 -10

此外,使用restore 命令的check logical 参数能够更完全地检查最新备份集。 这个命令使RMAN检查数据库的备份,如果这些备份通过物理讹误检查,还要检查备份的数据和索引段中是否存在逻辑讹误。 如果发现逻辑讹误,Oracle 会采用下面的一种方法来响应错误:

(1) 如果设置了maxcorrupt参数,并且还原检查逻辑操作期间的讹误数没有超过这个参数值,RMAN就会在Oracle v$database_block_corruption 视图中填充讹误的数据块列表。

(2) 如果还原检查逻辑操作期间的讹误数超过了maxcorrupt参数值,操作就会终止。

在默认情况下,maxcorrupt 参数被设置为0,因此任何逻辑讹误都会导致检查操作的失败。 通过set 命令可以修改默认的maxcorrupt参数值,但只能在run代码块的范围内使用这条命令。 此外,maxcorrupt参数是为每个数据文件单独设置的,而不是为所有的数据文件设置。

RMAN> run

2> {

3> set maxcorrupt for datafile 1,2,3 to 10;   -- 123datafile maxcorrupt 设为10

4> restore database check logical validate;

5> }

正在执行命令: SET MAX CORRUPT

启动 restore 于 08-7月 -10

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在开始验证数据文件备份集

通道 ORA_DISK_1: 正在读取备份片段 F:/BACKUP/BL_07LI9IPG_1_1.BAK

通道 ORA_DISK_1: 段句柄 = F:/BACKUP/BL_07LI9IPG_1_1.BAK 标记 = TAG20100708T161959

通道 ORA_DISK_1: 已还原备份片段 1

通道 ORA_DISK_1: 验证完成用时: 00:00:27

完成 restore 于 08-7月 -10

4.3 使用validate backupset 命令

使用具有validate参数或者check logical 参数的restore 命令只能检查最新的备份集,如果我们要检查任意的备份集,就需要使用validate backupset命令。 使用这条命令前,必须首先确定要检查的备份集键(backup set key)。 每个备份集在生成时都会被指派一个称为备份集键的唯一标识符。 

RMAN> list backupset ;

备份集列表

===================

BS 关键字  大小       设备类型占用时间 完成时间

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

      52.15M     DISK        00:00:04     07-7月 -10

        BP 关键字: 1   状态: AVAILABLE  已压缩: NO  标记: TAG20100707T200948

段名:F:/BACKUP/BL_01LI7BSC_1_1.BAK

  备份集 中的已存档日志列表

  线程序列     低 SCN    时间下限   下一个 SCN   下一次

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

  1    5       986340     06-7月 -10 1006590    07-7月 -10

  1    6       1006590    07-7月 -10 1008501    07-7月 -10

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间

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

      Full    974.46M    DISK        00:01:33     07-7月 -10

        BP 关键字: 2   状态: AVAILABLE  已压缩: NO  标记: TAG20100707T200956

段名:F:/BACKUP/BL_02LI7BSK_1_1.BAK

  备份集 中的数据文件列表

  文件 LV 类型 Ckp SCN    Ckp 时间   名称

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

  1       Full 1008510    07-7月 -10 D:/APP/ADMINISTRATOR/ORADATA/BL/SYSTEM01.DBF

  2       Full 1008510    07-7月 -10 D:/APP/ADMINISTRATOR/ORADATA/BL/SYSAUX01.DBF

  3       Full 1008510    07-7月 -10 D:/APP/ADMINISTRATOR/ORADATA/BL/UNDOTBS01.DBF

  4       Full 1008510    07-7月 -10 D:/APP/ADMINISTRATOR/ORADATA/BL/USERS01.DBF

  5       Full 1008510    07-7月 -10

根据上面查出来的backup set key,来验证:

RMAN> validate backupset 1;

启动 validate 于 08-7月 -10

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在开始验证归档日志备份集

通道 ORA_DISK_1: 正在读取备份片段 F:/BACKUP/BL_01LI7BSC_1_1.BAK

通道 ORA_DISK_1: 段句柄 = F:/BACKUP/BL_01LI7BSC_1_1.BAK 标记 = TAG20100707T200948

通道 ORA_DISK_1: 已还原备份片段 1

通道 ORA_DISK_1: 验证完成用时: 00:00:05

完成 validate 于 08-7月 -10

RMAN> validate backupset 1 check logical;

启动 validate 于 08-7月 -10

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在开始验证归档日志备份集

通道 ORA_DISK_1: 正在读取备份片段 F:/BACKUP/BL_01LI7BSC_1_1.BAK

通道 ORA_DISK_1: 段句柄 = F:/BACKUP/BL_01LI7BSC_1_1.BAK 标记 = TAG20100707T200948

通道 ORA_DISK_1: 已还原备份片段 1

通道 ORA_DISK_1: 验证完成用时: 00:00:03

完成 validate 于 08-7月 -10

 

五. 跨平台的数据库移动和RMAN

Oracle 10g R2支持手工跨平台移动数据库,即使这些平台具有不同的尾数格式(endian format。 尾数格式与字节排序有关,它有两种不同的格式,即大尾数小尾数。 如果在不同尾数字节格式的平台之间移动数据库,就需要手工操作,并且使用RMANconvert datafile 或者 convert tablespace命令来将传送的数据文件转换为正确的尾数格式。

5.1 可跨平台传送的表空间

Oracle 支持几乎(不是所有)Oracle 数据库家族的所有平台之间的表空间移动。该功能具有如下的一些优点:

(1) 在不同的内容提供者之间有效地发布数据

(2) 在不同数据仓库,数据集和OLTP 系统之间轻松地转移数据。

(3) 轻松地跨平台迁移数据库

为了能够在平台之间移动表空间,必须将compatible 设置为10.0.0 或更高的值。 设置该参数后,在下一次启动操作时,表空间数据文件将被设置为支持跨平台操作。 注意的是: 只有在设置为可读写或联机时,只读文件和脱机数据文件才可支持跨平台操作。

5.2 字节排序和数据文件转换

5.2.1 数据文件排序

Oracle 平台一般使用两种不同的字节排序方法(称为:尾数格式)。 如果多个平台使用相同的字节排序方案,则可以采用以前的常用方法传送表空间,而不会产生任何问题。

如果字节排序方案不同,则需要在RMAN中使用convert 命令来将表空间转换为目标平台上所需的格式。 可以通过连接动态视图v$database和新的v$transportable_platform 视图来确定尾数格式:

SQL> select endian_format from v$transportable_platform tp, v$database d where tp.platform_name=d.platform_name;

ENDIAN_FORMAT

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

Little

该示例中,当前系统使用的是小尾数格式。 因此,如果在两个系统上的查询返回相同的结果,则表示有兼容的数据文件格式;如果返回不同的结果,则需要使用RMANcompatible 参数来传送表空间。

5.2.2 使用RMAN 转换表空间尾数格式

如果需要转换另一个平台的表空间,则可以使用RMAN。 

1)转换表空间: 

先将表空间转换为只读模式:

SQL> alter tablespace BL read only;

表空间已更改。

RMAN> convert tablespace BL to platform='AIX-Based Systems (64-bit)' 

db_file_name_convert='D:/APP/ADMINISTRATOR/ORADATA/BL','F:/bl';

启动 conversion at source 于 08-7月 -10

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 启动数据文件转换

输入数据文件文件号=00005 名称=D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF

已转换的数据文件 = F:/BL/BL01.DBF

通道 ORA_DISK_1: 数据文件转换完毕经过时间: 00:00:07

完成 conversion at source 于 08-7月 -10

启动 Control File and SPFILE Autobackup 于 08-7月 -10

段 handle=D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/BL/AUTOBACKUP/2010_07_08/O1_M

F_S_723857700_63CW16C1_.BKP comment=NONE

完成 Control File and SPFILE Autobackup 于 08-7月 -10

说明,在这个实验中,我们发现它备份了控制文件和spfile文件,这也说明了以前的一个观点,当数据文件发生变化时,在开启自动备份的前提下,会自动备份这2个文件。

(2) 转换数据文件

RMAN> convert datafile 'D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF' from platform

'AIX-Based Systems (64-bit)' db_file_name_convert 'D:/APP/ADMINISTRATOR/ORADATA/

BL','F:/bl';

有关 CONVERT DATAFILE or TABLESPACE,参考联机文档

http://www.di.unipi.it/~ghelli/didattica/bdldoc/B19306_01/backup.102/b14191/dbxptrn001.htm

使用平台名来自v$transportable_platform视图的platform_name列。 Oracle 对于放入正确的名称有严格的要求。

一旦完成了转换,就可以用下面的方式完成移动,使用可传送表空间手工移动数据文件或表空间。 注意的是,如果尾数格式不同,RMAN 就不能完成操作。尾数相同的可以按下面方法操作。

SQL> select * from v$transportable_platform;

PLATFORM_ID PLATFORM_NAME

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

          1 Solaris[tm] OE (32-bit)

          2 Solaris[tm] OE (64-bit)

          7 Microsoft Windows IA (32-bit)

         10 Linux IA (32-bit)

          6 AIX-Based Systems (64-bit)

          3 HP-UX (64-bit)

5.3 跨平台移动数据库

Oracle 10g 提供了全新的功能处理在尾数格式相同的平台之间移动数据库Convert database命令结合DBMS_TDP程序包可以减少在平台之间移动数据库的整体工作量。 该过程包括如下步骤:

5.3.1 以只读方式打开数据库

Start mount;

Alter database open read only;

5.3.2 使用dbms_tdp.check_db 过程来检查数据库状态。 

Set serveroutput on

Declare 

Db_ready boolean;

Begin

Db_ready := dbms_tdb.check_db

('Microsoft Windows IA (32-bit)',dbms_tdb.skip_readonly);

End;

/

5.3.3 使用dbms_tdb.check_external 过程来标识外部对象:

Set serveroutput on

Declare

External boolean;

Begin

External := dbms_tdb.check_external;

End;

/

5.3.4 当数据库主备好传送时,就可以使用RMAN convert database命令。 RMAN 创建数据库移动所需要的脚本,但不实际执行移动,而是创建移动所需要的文件。

Convert database new database  'copy' transport scripts 'c:/oracle/copyscripts' to platform 'Microsoft Windows IA (32-bit)';

一旦完成该命令,只需遵循RMAN 提供的指令就可以在目标数据库上完成转换。

 

 

 

整理自《Oracle 10g RMAN 备份与恢复》

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

QQ: 492913789
Email: [email protected]
Blog: http://www.cndba.cn/dave

网上资源: http://tianlesoftware.download.csdn.net 

相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 

DBA1 群:62697716(); DBA2 群:62697977

DBA3 群:63306533;     聊天 群:40132017

你可能感兴趣的:(Oracle,RMAN)