10g之前,如果采用了resetlogs打开数据库, 必须进行全备份,因为以前的归档日志对于以后
恢复将不在起作用。即ORACLE不能跨越incarnation恢复。因为scn和日志序列号都被重置。10g
之后。ORACLE可以跨越incarnation恢复,(很多高手还是建议resetlogs之后全备).测试过程如下:
SQL> create table mytest as select * from dba_objects where rownum>11
2 /
表已创建。
SQL> alter system checkpoint
2 /
系统已更改。
然后执行全备:
RMAN> backup database;
启动 backup 于 04-7月 -10
....省略
完成 backup 于 04-7月 -10
SQL> alter system switch logfile
2 /
系统已更改。
SQL> select recid,sequence#,first_change#,next_change# from v$archived_log
2 /
RECID SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ------------- ------------
1 30 511526 522464
2 30 511526 522464
3 31 522464 522646
4 31 522464 522646
再插入10条记录
SQL> insert into mytest select * from mytest;
已创建10行。
SQL> commit
2 /
提交完成。
SQL> alter system checkpoint
2 /
系统已更改。
SQL> alter system switch logfile
2 /
系统已更改。
SQL> select recid,sequence#,first_change#,next_change# from v$archived_log
2 /
RECID SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ------------- ------------
1 30 511526 522464
2 30 511526 522464
3 31 522464 522646
4 31 522464 522646
5 32 522646 523748
6 32 522646 523748
已选择6行。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 603979776 bytes
Fixed Size 1250380 bytes
Variable Size 167775156 bytes
Database Buffers 427819008 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
RMAN> restore database;
RMAN> list incarnation;
数据库原型列表
DB 关键字 Inc 关键字 DB 名 DB ID STATUS 重置 SCN 重置时间
------- ------- -------- ---------------- --- ---------- ----------
1 1 ANRAN 885607663 CURRENT 1 04-7月 -10
恢复到sequence 32:
RMAN> recover database until sequence 32 ;
启动 recover 于 04-7月 -10
使用通道 ORA_DISK_1
正在开始介质的恢复
存档日志线程 1 序列 31 已作为文件 D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00031_07234
68783.001 存在于磁盘上
存档日志文件名 =D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00031_0723468783.001 线程 =1
序列 =31
介质恢复完成, 用时: 00:00:04
完成 recover 于 04-7月 -10
SQL> alter database open resetlogs;
数据库已更改。
SQL> select count(1) from mytest
2 /
COUNT(1)
----------
10
恢复完成。
添加10行数据:
SQL> insert into mytest select * from mytest;
已创建10行。
SQL> alter system switch logfile
2 /
系统已更改。
SQL> alter system switch logfile
2 /
系统已更改。
SQL> select recid,sequence#,first_change#,next_change# from v$archived_log
2 /
RECID SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ------------- ------------
1 30 511526 522464
2 30 511526 522464
3 31 522464 522646
4 31 522464 522646
5 32 522646 523748
6 32 522646 523748
7 33 523748 523871
8 33 523748 523871
9 1 522647 524058
10 1 522647 524058
11 2 524058 524165
RECID SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ------------- ------------
12 2 524058 524165
13 3 524165 524611
14 3 524165 524611
用上一次的备份进行恢复:
RMAN> restore database;
RMAN> recover database ;
启动 recover 于 04-7月 -10
使用通道 ORA_DISK_1
正在开始介质的恢复
存档日志线程 1 序列 31 已作为文件 D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00031_07234
68783.001 存在于磁盘上
存档日志线程 1 序列 1 已作为文件 D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00001_072347
3384.001 存在于磁盘上
存档日志线程 1 序列 2 已作为文件 D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00002_072347
3384.001 存在于磁盘上
存档日志线程 1 序列 3 已作为文件 D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00003_072347
3384.001 存在于磁盘上
存档日志文件名 =D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00031_0723468783.001 线程 =1
序列 =31
存档日志文件名 =D:\ORACLE\PRODUCT\10.2.0\ARCH01\ARC00001_0723473384.001 线程 =1
序列 =1
介质恢复完成, 用时: 00:00:08
完成 recover 于 04-7月 -10
从恢复代码上可以看到恢复跳过了32,33两个归档文件,从v$archived_log中也可能看到31与1的SCN是连续的,即新的SCN是应用日志到的最后一条日志SCN+1。
SQL> alter database open
数据库已更改。
SQL> select count(1) from mytest
2 /
COUNT(1)
----------
20
完成完全恢复。
仍然用原来的备份我们还可以不完全恢复到sequence 1.
RMAN> recover database until sequence 1
注意的是这里的1当前incarnation的sequence。所以sequence 不要超过incarnation中的sequence最大值
RMAN> recover database until sequence 6;
报Rman-06054:介质恢复正请求未知的日志
(不知道怎么回事,从CMD上拷不下这段输出,现在也没整明白)
RMAN> list incarnation;
数据库原型列表
DB 关键字 Inc 关键字 DB 名 DB ID STATUS 重置 SCN 重置时间
------- ------- -------- ---------------- --- ---------- ----------
1 1 ANRAN 885607663 PARENT 1 04-7月 -10
2 2 ANRAN 885607663 CURRENT 522647 04-7月 -10
可以看到当前数据库存在两个incarnation。 [incarnation的信息存在控制文件中,重建控制文件之后,incarnation会恢复到1]。
如果这时仍然还想恢复到第一个incarnation的sequence 32.
要首先执行
RMAN> reset database to incarnation 1;
RMAN> recover database until sequence 32.
以后的操作都是一样的,这里就不演示了。
实验过程中,10.2.0.1有时会报 ORA-600 [krhpfh_03-1209] 错误,这是ORACLE的BUG[Bug 5701695].
ORA-600 [KCVSOR_CURRENT_INC_RDFAIL] 错误,这也是ORACLE的BUG[Bug 5443660]
升级到10.2.0.4 就可以了,新功能总是不太稳定。