oracle-10g-深入理解incarnation

Truncate table t; begin

for i in 1 .. 10000 loop

insert into t values(dbms_flashback.get_system_change_number); commit; end loop; end; /

SQL> select min(tscn),max(tscn) from t; MIN(TSCN) MAX(TSCN) ---------- ----------

886422 905307 5.2模拟错误的不完全恢复

我希望恢复到scn 900000 ,可是我现在错误的恢复到890000。看是否还能恢复到900000

run {

startup mount force; set until scn 890000; restore database; recover database;

alter database open resetlogs; }

SQL> select min(tscn),max(tscn) from t; MIN(TSCN) MAX(TSCN) ---------- ----------

886422 889997

发现并没有找回我们所希望的数据

5.3再次进行不完全恢复

SQL> select current_scn from v$database; CURRENT_SCN -----------

908431

尝试恢复到900000 run {

startup mount force; set until scn 900000; restore database; recover database;

alter database open resetlogs; }

SQL> select min(tscn),max(tscn) from t;

MIN(TSCN) MAX(TSCN) ---------- ----------

886422 889997

依然并没有恢复到我希望的情况;

5.4反清复明后再进行恢复

startup mount force;

reset database to incarnation 11;

run {

set until scn 900000; restore database; recover database;

alter database open resetlogs; }

SQL> select min(tscn),max(tscn) from t; MIN(TSCN) MAX(TSCN) ---------- ----------

886422 899997

已经恢复到我所希望的情况了;

5.5总结分析

我之前一直无法理解oracle设置incarnation这个东西干什么用,通过这个实验,我们就能够理解incarnation的作用了;

Incarnation 11 and 12都包括scn 900000 的spot

所以当incarnation 12 做 until scn的时候,是恢复到当前incarcation 的 scn; 但是根据我们的需要,我们需要的是incarnation 11的scn 900000;

所以就需要使用reset database to incarnation 11才能找回我们需要的数据;

Incarnation 14BackupScn 890000Scn 900000Incarnation 11Incarnation 12Incarnation 13SCNScn 900000

后记:

通过以上几个实验,我们能够基本理解incarnation了;

如果实际中需要进行不完全恢复,一定要小心谨慎,因为可能出现更加复杂的情况。比如数据结构不同,控制文件丢失等等都会造成更加混乱的局面,但是只要思路清晰,相信这些都不是问题。

最后,本实验只是出于我个人的理解。如果有什么不正确,以及疑问,欢迎发送邮件到oraclerlee@sohu.com共同讨论学习进步。

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4