Instance Recovery的步骤

mount到open状态时:

各个数据文件头的stop SCN值应该与控制文件中记录的数据文件最后SCN相同。

  • 如果相同,刚数据库上次是正常关闭,不需要instance recovery.直接打开数据库给用户提供服务;
  • 如果数据文件头的stop SCN与控制文件中的SCN不一致(比如,shutdown abort情况下,数据文件头的stop SCN为无穷大),则需要instance recovery,各个数据文件的SCN不一致,需要恢复到一致状态才能打开数据库。

Instance recovery

  1. 打开数据库时,各个数据文件头的stop SCN与控制文件中的SCN记录不一致;
  2. 使用redo logfile来执行前滚操作(rolling forward)这里需要使用的信息为“上一次checkpoint到日志文件结束之间的redo信息”,包括undo表空间中的数据文件,前滚操作将数据库恢复到实例失败前的那一时刻,所有commit与uncommit的事务都会forward写入到各自数据文件;
  3. 这时,redo的forward操作完成;数据文件的SCN与控制文件中记录的SCN值(控制文件中为每个数据文件记录其SCN)达到一致状态,这时,正常打开数据库,为用户提供服务;
  4. 此时,实例恢复并没有完全完成,仅仅是完成了redo信息的前滚,所有的事务都已经应用的数据库中,包括commit与uncommit的事务,都已经恢复到实例失败前的那一刻。
  5. 这时,回滚数据文件中的记录也forward到实例失败时刻。使用undo段中的数据来实现事务的回滚操作,将未提交的工作回滚到一个一致性状态。(比如说,一个大的事务操作,产生了很多的redo数据。这些redo信息不是一直等到commit时才会写入日志文件,未提交的事务信息会先行写入日志文件,但是日志文件中没有commit或rollback的相关记录而已,此时,实例失败了,这种情况下的forward就会一直完成这些事务操作,会将日志文件中记录的信息都应用到数据库中)回滚操作所要实现的就是将数据库恢复到这些未提交的事务开始前的状态(注1)。回滚到数据文件只包含已经commited的数据为止。到此,才算完成整个实例恢复操作。

实例恢复的步骤

注1:

回滚操作并不像大多数人想像的那样将数据库恢复到事务开始前的样子,实际上,仅仅是逻辑的将事物回滚,而数据库级所做的一些操作不会回到事务开始前的状态(比如,一个事务导致了某个段空间的扩展,数据库为这个段分区了新的extents,rollback操作不会把这些已经分配的块回收)

看下面示例:

SQL> create table t as select *from all_objects where 1=0;
 
表已创建。
 
SQL> select segment_name,extents,blocks from user_segments where segment_name='T';
 
SEGMENT_NA    EXTENTS     BLOCKS
---------- ---------- ----------
T                   1          8
 
SQL> set autotrace on statistic
SQL>
SQL> select * from t;
 
未选定行
 
统计信息
------------------------------------------------------
        263  recursive calls
          0  db block gets
         30  consistent gets
          0  physical reads
          0  redo size
 
SQL> insert into t select *from all_objects;
 
已创建5643行。
 
SQL> /
 
已创建5643行。
 
SQL> select segment_name,extents,blocks from user_segments
 
SEGMENT_NA    EXTENTS     BLOCKS
---------- ---------- ----------
T                  17        256
 
SQL> rollback;
 
回退已完成。
 
SQL> select * from t;
 
未选定行
 
统计信息
----------------------------------------------------------
         29  recursive calls
          1  db block gets
        255  consistent gets
          0  physical reads
        176  redo size
 
SQL> select segment_name,extents,blocks from user_segments;
 
SEGMENT_NA    EXTENTS     BLOCKS
---------- ---------- ----------
T                  17        256
 
 
 
  
 
  
 
  
 
 

转载于:https://www.cnblogs.com/zwfha/archive/2007/12/04/982302.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值