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共同讨论学习进步。