ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SCN能够倒退么?答案是能!

SCN能够倒退么?答案是能!

原创 Linux操作系统 作者:小被子0000 时间:2010-05-08 11:15:10 0 删除 编辑
    大家都知道,在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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-05-08

  • 博文量
    10
  • 访问量
    28434