以下转自作者ORA-600的博文(二篇合为一篇)

http://blog.itpub.net/22235/viewspace-348212/

http://blog.itpub.net/22235/viewspace-352013/


上午刚处理完客户的一个问题,正在发呆,一个哥们在msn上跟我发了个链接,问起我Oracle里incarnation的问题,本来也没想那么多,回答了几个问题,后来觉得这么说说不明白,干脆做个演示好了,于是就在这两天,作了一些incarnation的测试。
先解释一下我对incarnation的理解吧,incarnation,我把这个叫做数据库实体,不知道其他人怎么个叫法,从含义上看,它指的是一个重置scn后的数据库场景。一个数据库在刚开始被创建出来时,scn号为1,随着运行,scn不断单调递增,Oracle就是根据scn描述数据库的整个发展进程,可以说scn就是数据库的时间轴。当数据库正常运行,或者执行完全恢复时,scn只会单调递增直到最新的scn,这样数据库中所有的数据都按照时间的顺序改变着,但如果数据库出现了人为误操作,需要执行不完全恢复,这时候就得用以前备份的所有数据文件将数据版本回到以前,然后从那个起点开始应用日志,直到出现人为故障之前的那一刻,但这时,scn并未到达最新的scn,而是到了之前的某个scn,在这一刻,人为故障还未发生。在完成recover .. until .. 的操作后,所有的数据文件通过应用日志到了统一的一点,但数据库暂时还不能正常打开,因为控制文件中记录的是最新的scn,与应用日志后的数据文件并不一致,因此无法直接打开数据库回到原始的状态,必须通过resetlogs的方式强制控制文件、重做日志文件以及数据文件的scn一致,此时新打开的数据库中第一个scn等于应用日志到的最后一条日志的scn号+1(在告警日志文件中可以看到RESETLOGS after incomplete recovery UNTIL CHANGE 145936 这样的信息,打开数据库后的scn则为145937)。数据库每次resetlogs之后,scn和日志序列号都被重置,因此每次resetlogs都会产生一个新的incarnation,而incarnation的信息存储在控制文件中,在rman中可以通过list incarnation看到实体信息。
我们交流的问题主要是Oracle在控制文件中为什么要存储实体信息,相应的reset database命令有什么用?
在下面的例子中也可以看到,Oracle在控制文件中记录实体信息,一方面可以清楚的看到数据库实体的发展过程(毕竟resetlogs对数据库是一个具有较大影响的动作,必须能够清楚的查看到数据库生命期内出现的所有实体信息),另一方面,也可以通过reset database命令选择在rman中将要操作的数据库实体,进而将数据库恢复到某个以前实体对应的数据生命期,这个功能在以前8i的时候是不支持的,从9i开始,可以重置实体到以前,使用resetlogs之前的备份进行数据库恢复。具体操作如下:

--在实体5中对数据库进行全库备份

RMAN> backup database format='c:\bak\df_%d_%s_%p.bak';

启动 backup 于 26-3月 -08
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=143 devtype=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
输入数据文件 fno=00002 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
输入数据文件 fno=00003 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
输入数据文件 fno=00004 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 26-3月 -08
通道 ORA_DISK_1: 已完成段 1 于 26-3月 -08
段句柄=C:\BAK\DF_ORCL_26_1.BAK 标记=TAG20080326T224202 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:16
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 26-3月 -08
通道 ORA_DISK_1: 已完成段 1 于 26-3月 -08
段句柄=C:\BAK\DF_ORCL_27_1.BAK 标记=TAG20080326T224202 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:04
完成 backup 于 26-3月 -08

--关闭数据库,将当前重做日志文件删除,模拟故障,造成resetlogs的恢复场景

RMAN> shutdown immediate

数据库已关闭
数据库已卸载
Oracle 实例已关闭

RMAN> startup mount

已连接到目标数据库 (未启动)
Oracle 实例已启动
数据库已装载

系统全局区域总计     314572800 字节

Fixed Size                     1248768 字节
Variable Size                 79692288 字节
Database Buffers             226492416 字节
Redo Buffers                   7139328 字节

RMAN> alter database open resetlogs;
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: alter db 命令 (在 03/26/2008 22:50:16 上) 失败
ORA-01139: RESETLOGS 选项仅在不完全数据库恢复后有效

RMAN> recover database;

启动 recover 于 26-3月 -08
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=157 devtype=DISK

正在开始介质的恢复
无法恢复介质
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: recover 命令 (在 03/26/2008 22:50:36 上) 失败
ORA-00283: recovery session canceled due to errors
RMAN-11003: 在分析/执行 SQL 语句期间失败: alter database recover if needed
start
ORA-00283: 恢复会话因错误而取消
ORA-19909: 数据文件 1 属于孤立的原型
ORA-01110: 数据文件 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF'

--强制打开后,看到现在已经进入实体6
RMAN> alter database open resetlogs;

数据库已打开

RMAN> list incarnation;


数据库原型列表
DB 关键字  Inc 关键字 DB 名  DB ID            STATUS  重置 SCN  重置时间
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1176767170       PARENT  1          10-3月 -08
2       2       ORCL     1176767170       PARENT  472611     25-3月 -08
3       3       ORCL     1176767170       PARENT  474163     25-3月 -08
4       4       ORCL     1176767170       PARENT  488631     26-3月 -08
5       5       ORCL     1176767170       PARENT  490308     26-3月 -08
6       6       ORCL     1176767170       CURRENT 504418     26-3月 -08

--将数据库关闭,重新启动数据库到mount状态
RMAN> shutdown immediate

数据库已关闭
数据库已卸载
Oracle 实例已关闭

RMAN> startup mount

已连接到目标数据库 (未启动)
Oracle 实例已启动
数据库已装载

系统全局区域总计     314572800 字节

Fixed Size                     1248768 字节
Variable Size                 79692288 字节
Database Buffers             226492416 字节
Redo Buffers                   7139328 字节


--实体5中有备份,现在需要将数据库恢复到实体5的数据中,首先重置实体
RMAN> reset database to incarnation 5;

将数据库重置为原型 5

--在重置实体后,restore和recover都会针对重置设置的实体进行,rman自动选择重置到的实体5所对应的备份进行恢复
RMAN> restore database;

启动 restore 于 26-3月 -08
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=157 devtype=DISK

通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
正将数据文件00002恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
正将数据文件00003恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
正将数据文件00004恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 正在读取备份段 C:\BAK\DF_ORCL_26_1.BAK
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:\BAK\DF_ORCL_26_1.BAK 标记 = TAG20080326T224202
通道 ORA_DISK_1: 恢复完成, 用时: 00:01:07
完成 restore 于 26-3月 -08

RMAN> recover database;

启动 recover 于 26-3月 -08
使用通道 ORA_DISK_1

正在开始介质的恢复

无法找到存档日志
存档日志线程 =1 序列=3
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: recover 命令 (在 03/26/2008 22:54:34 上) 失败
RMAN-06054: 介质恢复正请求未知的日志: 线程 1 seq 3 lowscn 504053

RMAN> list incarnation;


数据库原型列表
DB 关键字  Inc 关键字 DB 名  DB ID            STATUS  重置 SCN  重置时间
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1176767170       PARENT  1          10-3月 -08
2       2       ORCL     1176767170       PARENT  472611     25-3月 -08
3       3       ORCL     1176767170       PARENT  474163     25-3月 -08
4       4       ORCL     1176767170       PARENT  488631     26-3月 -08
5       5       ORCL     1176767170       CURRENT 490308     26-3月 -08
6       6       ORCL     1176767170       ORPHAN  504418     26-3月 -08

--在应用日志后,强制打开数据库,可以看到已经将实体5重置为新的实体7,但实体7的scn大于实体5的scn,但小于实体6的scn
RMAN> alter database open resetlogs;

数据库已打开

RMAN> list incarnation;


数据库原型列表
DB 关键字  Inc 关键字 DB 名  DB ID            STATUS  重置 SCN  重置时间
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1176767170       PARENT  1          10-3月 -08
2       2       ORCL     1176767170       PARENT  472611     25-3月 -08
3       3       ORCL     1176767170       PARENT  474163     25-3月 -08
4       4       ORCL     1176767170       PARENT  488631     26-3月 -08
5       5       ORCL     1176767170       PARENT  490308     26-3月 -08
7       7       ORCL     1176767170       CURRENT 504054     26-3月 -08
6       6       ORCL     1176767170       ORPHAN  504418     26-3月 -08




上一次,测试了一下reset incarnation的作用,朋友又提出下一个问题,能不能跨多个实体进行恢复呢,理论上是可以的,不过没实践过,还是测试一下吧。

--首先在实体5上进行全库备份
RMAN> backup database format='c:\bak\%U.bak';

启动 backup 于 26-3月 -08
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=142 devtype=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
输入数据文件 fno=00002 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
输入数据文件 fno=00003 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
输入数据文件 fno=00004 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 26-3月 -08
通道 ORA_DISK_1: 已完成段 1 于 27-3月 -08
段句柄=C:\BAK\0QJC96UQ_1_1.BAK 标记=TAG20080326T235922 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:05
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 27-3月 -08
通道 ORA_DISK_1: 已完成段 1 于 27-3月 -08
段句柄=C:\BAK\0RJC970R_1_1.BAK 标记=TAG20080326T235922 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:04
完成 backup 于 27-3月 -08

--关闭数据库,删除当前日志文件,强制open resetlogs打开数据库
RMAN> shutdown immediate

数据库已关闭
数据库已卸载
Oracle 实例已关闭

RMAN> startup

已连接到目标数据库 (未启动)
Oracle 实例已启动
数据库已装载
数据库已打开

系统全局区域总计     314572800 字节

Fixed Size                     1248768 字节
Variable Size                 79692288 字节
Database Buffers             226492416 字节
Redo Buffers                   7139328 字节

RMAN> shutdown immediate

数据库已关闭
数据库已卸载
Oracle 实例已关闭

RMAN> startup mount

已连接到目标数据库 (未启动)
Oracle 实例已启动
数据库已装载

系统全局区域总计     314572800 字节

Fixed Size                     1248768 字节
Variable Size                 79692288 字节
Database Buffers             226492416 字节
Redo Buffers                   7139328 字节

RMAN> recover database;

启动 recover 于 27-3月 -08
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=157 devtype=DISK

正在开始介质的恢复
无法恢复介质

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: recover 命令 (在 03/27/2008 00:08:47 上) 失败
ORA-00283: recovery session canceled due to errors
RMAN-11003: 在分析/执行 SQL 语句期间失败: alter database recover if needed
start
ORA-00283: 恢复会话因错误而取消
ORA-19909: 数据文件 1 属于孤立的原型
ORA-01110: 数据文件 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF'

RMAN> alter database open resetlogs;

数据库已打开

--打开数据库后,形成实体6
RMAN> list incarnation;


数据库原型列表
DB 关键字  Inc 关键字 DB 名  DB ID            STATUS  重置 SCN  重置时间
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1176767170       PARENT  1          10-3月 -08
2       2       ORCL     1176767170       PARENT  472611     25-3月 -08
3       3       ORCL     1176767170       PARENT  474163     25-3月 -08
4       4       ORCL     1176767170       PARENT  488631     26-3月 -08
5       5       ORCL     1176767170       PARENT  490308     26-3月 -08
6       6       ORCL     1176767170       CURRENT 506067     27-3月 -08

--再次关闭数据库,删除当前日志文件,通过sqlplus做open resetlogs,形成实体7
RMAN> shutdown immediate

数据库已关闭
数据库已卸载
Oracle 实例已关闭

RMAN> quit


恢复管理器完成。

D:\>rman target / nocatalog

恢复管理器: Release 10.2.0.1.0 - Production on 星期四 3月 27 00:18:13 2008

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

连接到目标数据库: ORCL (DBID=1176767170)
使用目标数据库控制文件替代恢复目录

RMAN> list incarnation;


数据库原型列表
DB 关键字  Inc 关键字 DB 名  DB ID            STATUS  重置 SCN  重置时间
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1176767170       PARENT  1          10-3月 -08
2       2       ORCL     1176767170       PARENT  472611     25-3月 -08
3       3       ORCL     1176767170       PARENT  474163     25-3月 -08
4       4       ORCL     1176767170       PARENT  488631     26-3月 -08
5       5       ORCL     1176767170       PARENT  490308     26-3月 -08
6       6       ORCL     1176767170       PARENT  506067     27-3月 -08
7       7       ORCL     1176767170       CURRENT 506961     27-3月 -08

--发现有对象丢失,需要进行基于时间的恢复,但丢失对象是发生在实体5的运行过程中,因此使用实体5的备份进行不完全恢复
RMAN> shutdown immediate

数据库已关闭
数据库已卸载
Oracle 实例已关闭

RMAN> startup mount

已连接到目标数据库 (未启动)
Oracle 实例已启动
数据库已装载

系统全局区域总计     314572800 字节

Fixed Size                     1248768 字节
Variable Size                 79692288 字节
Database Buffers             226492416 字节
Redo Buffers                   7139328 字节

--直接执行恢复命令报错,因为当前是实体7,实体7的时间在需要被恢复的时间之后
RMAN> run{
2> sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';
3> set until time='2008-3-27 00:02:00';
4> restore database;
5> recover database;
6> alter database open resetlogs;
7> }

sql 语句: alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"

正在执行命令: SET until clause

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: set 命令 (在 03/27/2008 00:28:18 上) 失败
RMAN-20207: UNTIL TIME 或 RECOVERY WINDOW 在 RESETLOGS 时间之前


--重置数据库实体为5,然后进行基于时间的恢复
RMAN> reset database to incarnation 5;

将数据库重置为原型 5

RMAN> run{
2> sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';
3> set until time='2008-3-27 00:02:00';
4> restore database;
5> recover database;
6> alter database open resetlogs;
7> }

sql 语句: alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"

正在执行命令: SET until clause

启动 restore 于 27-3月 -08
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=157 devtype=DISK

通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
正将数据文件00002恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
正将数据文件00003恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
正将数据文件00004恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 正在读取备份段 C:\BAK\0QJC96UQ_1_1.BAK
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:\BAK\0QJC96UQ_1_1.BAK 标记 = TAG20080326T235922
通道 ORA_DISK_1: 恢复完成, 用时: 00:01:05
完成 restore 于 27-3月 -08

启动 recover 于 27-3月 -08
使用通道 ORA_DISK_1

正在开始介质的恢复

存档日志线程 1 序列 3 已作为文件 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\OR
CL\ARCHIVELOG\2008_03_27\O1_MF_1_3_3YNWZ1KL_.ARC 存在于磁盘上
存档日志文件名 =E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\200
8_03_27\O1_MF_1_3_3YNWZ1KL_.ARC 线程 =1 序列 =3
介质恢复完成, 用时: 00:00:02
完成 recover 于 27-3月 -08

数据库已打开

--恢复完成,由于再次使用open resetlogs打开数据库,因此现在实体为8,而实体8的scn低于实体6、7
RMAN> list incarnation;


数据库原型列表
DB 关键字  Inc 关键字 DB 名  DB ID            STATUS  重置 SCN  重置时间
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1176767170       PARENT  1          10-3月 -08
2       2       ORCL     1176767170       PARENT  472611     25-3月 -08
3       3       ORCL     1176767170       PARENT  474163     25-3月 -08
4       4       ORCL     1176767170       PARENT  488631     26-3月 -08
5       5       ORCL     1176767170       PARENT  490308     26-3月 -08
8       8       ORCL     1176767170       CURRENT 505314     27-3月 -08
6       6       ORCL     1176767170       ORPHAN  506067     27-3月 -08
7       7       ORCL     1176767170       ORPHAN  506961     27-3月 -08

RMAN>

从上面可以看得出,跨实体作恢复是可行的,只不过呢,呵呵,以前实体的备份肯定是要有的,否则可就回天无力了。