大家都知道,在oracle数据库里,有一个很重要的机制,那就是SCN(system change number)系统改变号。这个号码是以timestamp时间戳为自变量的函数值。也就是说,这个scn值是源源不断的在增长的,每个数据库的事务都会有一个自己发生时的scn号。oracle中很多机制都依赖scn号,来完成正常功能,比如闪回,rman的备份、恢复。实例失败后的实例恢复。
在进行不完全恢复的时候,打开数据库时要加resetlogs关键字。这个关键字做了两件事情:(1)
在线日志序列号重置为1;(2)在线日志清空,归档日志不可用。这样相当于一个新的数据库生命诞生一样。如果你再想找到resetlogs之前的数据状态,那是不可能的。因为你怎么可能穿越时空回到自己的前世去找数据呢。
可是经过我对oracle的学习,我发现是可以回到自己的前世,去寻找那时候的数据状态。这个技术就叫做穿越resetlogs(through resetlogs),使scn值倒退到上一个数据库的原形(incarnation)中。
一切以事实为依据,试验如下:
首先要在归档模式下进行试验。
先热备一下数据文件:
sys:
alter database begin backup;
!cp orcl/*.dbf mybak
alter database end backup;
查看下scott方案下的数据状态:
scott:
SQL> select * from test;
1
2
3
4
SQL> select sysdate from dual;
20100507 23:45:50
SQL>select current_scn from v$database;
CURRENT_SCN
-----------
566708
改变数据状态,插入一条数据:
SQL> insert into test values(5);
sql>commit;
SQL> select sysdate from dual;
20100507 23:46:58
SQL>select current_scn from v$database;
CURRENT_SCN
-----------
566718
做一次基于时间的不完全恢复,并且以resetlogs打开数据库。不完全恢复后,也只能用resetlogs方式打开数据库,命令如下:
sys:
sql>shutdown immediate
sql>startup mount
sql>recover database until time '20100507 23:46:58';
sql>alter database open resetlogs;
ok
scott:
SQL> select * from test;
1
2
3
4
5
SQL>select current_scn from v$database;
CURRENT_SCN
-----------
567026
sys:
sql>shutdown immediate
sql>startup mount
后面还原时,要用到这个以前的版本,它是resetlogs前的数据:
sql>host cp mybak/*.dbf orcl/
查看数据库原形,要在rman里:
rman target sys/oracle
rman> list incarnation;
using target database control file instead of recovery catalog
List of Database Incarnations
DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1 1 ORCL 1238186065 PARENT 1 30-JUN-05
2 2 ORCL 1238186065 PARENT 446075 08-FEB-10
3 3 ORCL 1238186065 CURRENT 566933 09-FEB-10
设置原形:
RMAN> reset database to incarnation 2;
sys:
还原到resetlogs之前的数据库里:
sql>recover database until time '20100211 23:45:50';
auto
sql>alter database open resetlogs;
ok
scott:
SQL> select * from test;
1
2
3
4
SQL>select current_scn from v$database;
CURRENT_SCN
-----------
566962
rman target sys/oracle
rman> list incarnation;
List of Database Incarnations
DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1 1 ORCL 1238186065 PARENT 1 30-JUN-05
2 2 ORCL 1238186065 PARENT 446075 08-FEB-10
4 4 ORCL 1238186065 CURRENT 566699 09-FEB-10
3 3 ORCL 1238186065 ORPHAN 566933 09-FEB-10
穿越了一个原形incarnation,回到了前世,SCN值也变小了!
第一次resetlogs之后SCN值为567026,穿越之后SCN值为566962变小了吧!哈!
隐含参数_no_recovery_through_resetlogs 缺省值false,用于限制恢复能否跨越resetlogs,false允许,true不允许。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22782896/viewspace-662216/
,如需转载,请注明出处,否则将追究法律责任。