1. 不完全恢复
2. 基于RMAN 的恢复主题
3. 表空间时间点恢复
4. 验证备份可恢复
5. 跨平台的数据库移动和RMAN
不完全恢复是指不完全的数据恢复,不完全恢复与完全恢复在许多方面是相同的,他们基本的命令集相同,但不完全恢复添加了一些其他命令。 引起不完全恢复的原因有很多,如丢失了联机重做日志或归档的重做日志,或者出现重大的用户错误。 不完全恢复会影响整个数据库,换句话,不能只对数据库的一部分执行不完全恢复操作,因为这个会使数据库的一部分具有与这个数据库其余部分不同的SCN和时间点。
要将数据库数据还原到与数据库剩余部分不同的时间点,可以用基于 或者用
基于时间,SCN,日志序列 或取消的恢复。
在,通常需要使用resetlogs命令打开数据库,这是因为我们要从已经简历的现有日志流中脱离出来,并且需要向Oracle 说明这种情况.这对于恢复操作来说非常重要.
每次使用resetlogs命令时,SCN 计数器不会被重置,不过Oracle 会重置其他计数器(如:日志序列号),同时还会重置联机重做日志的内容.
Oracle 10g 简化了通过resetlogs命令进行的恢复,在归档的重做日志名中添加了一个新的特换串(%r),该字符串表示resetlog ID 号。 在log_archive_dest_format 参数串中包括%r时,归档的重做日志名在每个resetlogs 命令中保持唯一。 这种改动以及其他的内部Oracle 数据库改动使oracle 可以很容易的通过给定的resetlogs操作恢复数据库。 因此,可以很容易的在执行操作后立刻备份数据库,然而,我们仍然认为在任何不完全恢复后备份数据库是很有必要的。
Oracle Rman跨resetlogs版本恢复
使用RMAN执行不完全恢复操作时需要完成一个工作是简历恢复目标。恢复目录是恢复进程的终点,通常我们基于一个时间点,一个指定的SCN 或者 一个日志序列号来表示它。 我们可以采用许多不同的方法建立恢复目标。
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错误。
这种方法避免使用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;
这种恢复类型允许用户将数据库恢复到与指定时间一致的状态。 当然,如果不存在能将数据库还原到用户请求的时间的有效备份或归档重做日志,Oracle 就会报RMAN-03002 和 RMAN-20207的错误。
必须具备在我们指定的恢复时间之前生成的数据库备份,此外还需要所有归档的重做日志。
Oracle 允许用户将数据库恢复到指定的SCN,实际上,这并不是一种常见的恢复方法。示例如下:
Startup mount;
Restore database until SCN 1000;
Recover database until SCN 1000;
Alter database open resetlogs;
RMAN 允许用户将数据库恢复到指定序列号的归档重做日志。如果归档的重做日志中存在间隙,使用这种恢复方法就非常方便。 间隙通常意味着我们只能将数据库还原到间隙的开始点。
Startup mount;
Restore database until sequence 100 thread 1;
Recover database until sequence 100 thread 1;
Alter database open resetlogs;
在默认情况下,即使丢失了只读的数据文件,RMAN也不会在执行完全恢复数据库还原操作时还原只读的数据文件。 要在完全恢复期间还原只读的数据文件,就必须在restore 命令中使用check readonly 参数,如:
Restore database check readonly;
在使用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 也不会在这个新的位置上恢复归档的重做日志。
可以从数据文件副本(不是备份集)中还原数据库的数据文件。 要实现这个功能,需要先使用restore from datafilecopy命令,然后再使用恢复数据库(或表空间,数据文件)的recover。
RMAN>Restore (datafile 5) from datafilecopy; -- 此处的圆括号是必须的,如果没有就报错
RMAN>Recover datafile 5;
SQL>Alter database datafile 5 online;
执行restore 时,该命令会识别需要还原的数据文件的最新副本,然后从这个副本中还原这些数据文件。 数据文件的最新副本可能是在一个数据文件副本中,而不是在一个副本中。 在这种情况下,Oracle 会恢复这个数据文件副本。
即使与讹误数据块关联的数据文件一直联机,也可以通过用块介质恢复(block Media recover: BMR)执行块级别恢复操作来修复Oracle 数据库中的这些逻辑上或者物理上的讹误数据块。
一般出现数据块错误时,都会有错误消息:
ORA-01578: ORACLE data block corrupted (file #18,block #88)
我们必须从一个备份中恢复这个数据文件,在恢复过程中,用户不能使用该数据块文件中的所有数据。
只需要执行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.
一个数据库的对应物(incarnation)对应这个数据库的特定逻辑生存期。 有时我们需要使用上次执行resetlogs命令打开数据库前生成的一个备份来还原数据库,或者可能需要还原到执行上一个resetlogs命令之前的时间点。 这就需要用到incarnation.
先假设使用恢复目录执行了备份操作,并且最近使用了resetlogs命令执行过时间点恢复,现在需要使用执行resetlogs命令之前的一个备份来恢复数据库。
(1)启动但不加载实例,这是因为我们要先得到一个与恢复数据库对应物关联的控制文件
(2)使用reset database to incarnation 命令为RMAN 指示对应物的备份集。
(3)Restore controlfile,使rman还原最新的控制文件
(4)加载数据库
(5)Restore 数据库
(6)Recover 数据库
(7)使用resetlogs 打开数据库
C:/Users/Administrator.DavidDai>
恢复管理器: 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;
为了通过前一个对应物进行恢复,需要一个包含前一个对应物信息的控制文件。在大多数情况下,这可能是当前的控制文件。如果当前的控制文件不了解需要恢复的对应物,则需要还原包含该信息的控制文件,从而使得利用该方法恢复数据。 可以使用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>
数据库原型列表
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>
RMAN>
RMAN>
将数据库重置为原型 2
RMAN>
启动 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 于 06-7月 -10
使用通道 ORA_DISK_1
正在开始介质的恢复
线程 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>
数据库已打开
RMAN>
数据库原型列表
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
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;
SQL> select sequence# from v$archived_log;
SEQUENCE#
161
2
3
4
从这个结果也证明resetlogs 会重置sequnce,但是scn不会被重置。
SQL>
CURRENT_SCN
-----------
8555698
SQL>
GET_SYSTEM_CHANGE_NUMBER
------------------------
8555706
Oracle Rman跨resetlogs版本恢复