介质恢复与实例恢复

本文详细介绍了Oracle数据库中的介质恢复和实例恢复,包括SCN(System Change Number)的重要性和不同类型的SCN,如Commit SCN、Offline SCN、Checkpoint SCN等。SCN是标识数据库改动的关键,而实例恢复通过前滚redo日志达到一致性状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是介质恢复、实例恢复?

l  介质:数据文件

l  实例:内存+进程

实例恢复就是前滚(redo)恢复到一致性状态

参考表

 

状态

介质恢复

实例恢复

说明

系统正常关闭

SCN与系统一致

不需要

不需要

系统异常关闭

stop scn is null

不需要

需要

读取redo前滚

旧数据文件

System SCN>Start SCN
Stop SCN is null/nonull

需要

需要(is null)
不需要(nonull)

介质恢复:
System SCN=Start SCN
实例恢复:
System SCN=Stop SCN

 

了解oracle中的SCN

从接触oracle到使用过程中,始终能看到SCN的身影,在oracle的备份恢复原理中更是如此。由此看来SCN的重要性不言而喻呀,对其有个综合的了解能够有对其功能有清晰地认识,在oracle中SCN的种类不一中,对SCN理解的时候常常犯晕,偶尔这样,偶尔那样。说白了就是把多种SCN混淆在一起了。

 

如果结合控制文件,数据文件,redo等文件的dump内容来了解那几种重要的SCN,将会对其有更深的认识。

 

直接入题:

 

l  SCN: System Change Number

SCN是顺序递增的一个数字,在Oracle中用来标识数据库的每一次改动,及其先后顺序。SCN的最大值是0xffff.ffffffff。

 

l  Oracle对SCN的管理

单节点的instance中,SCN值存在SGA区,由systemcommit number latch保护。任何进程要得到当前的SCN值,都要先得到这个latch。

 

l  RAC/OPS环境中

Oracle通过排队机制(Enqueue)实现SCN在各并行节点之间的顺序增长。具体有两种方法:

 

l  Lamport算法:又称面包房算法,先来先服务算法。跟很多银行采用的排队机制一样。

客户到了银行,先领取一个服务号。一旦某个窗口出现空闲,拥有最小服务号的客户就可以去空闲窗口办理业务。

 

l  Commit广播算法:一有commit完成,最新的SCN就广播到所有节点中。

 

上述两种算法可以通过调整初始化参数max_commit_propagation_delay来切换。在多数系统 (除了CompaqTur64 Unix)中,该参数的默认值都是700厘秒(centisecond),采用Lamport算法。如果该值小于100厘秒,Oracle就采用广播算法,并且记录在alert.log文件中。

 

几种重要的SCN

l  Commit SCN

当用户提交commit命令后,系统将当前scn赋给该transaction。这些信息都反映在redobuffer中,并马上更新到redo log 文件里。

 

l  Offline SCN

除了System tablespace以外的任何表空间,当我们执行SQL>alter tablespace … offline normal命令时,就会触发一个checkpoint,将内存中的dirtybuffer写入磁盘文件中。Checkpoint完成后,数据文件头会更新checkpoint scn和offline normal scn值。其中数据库文件头的checkpoint scn值可通过查询列x$kccfe.fecps得到。

 

如果执行SQL>altertablespace …offline命令时采用temporary或 immediate选项,而不用normal选项时,offline normal scn会被设成0。这样当数据库重启后通过resetlog方式打开时,该表空间就无法再改回在线状态。

 

l  Checkpoint SCN

当数据库内存的脏数据块(dirtyblocks)写到各数据文件中时,就发生一次checkpoint。数据库的当前checkpoint scn值存在x$kccdi.discn中。Checkpoint scn在数据库恢复中起着至关重要的作用。无论你用何种办法恢复数据库,只有当各个数据库文件的checkpoint scn都相同时,数据库才能打开。

 

虽然参数“_allow_resetlogs_corruption”可以在checkpointscn不一致时强制打开数据库,但是这样的数据库在open后必须马上作全库的export,然后重建数据库并import数据。

 

l  Resetlog SCN

数据库不完全恢复时,在指定时间点后的scn都无法再应用到数据库中。Resetlog时的scn就被设成当前数据库scn,redo log也会被重新设置。

 

l  Stop SCN

Stop scn记录在数据文件头上。当数据库处在打开状态时,stop scn被设成最大值0xffff.ffffffff。在数据库正常关闭过程中,stop scn被设置成当前系统的最大scn值。在数据库打开过程中,Oracle会比较各文件的stop scn和checkpoint scn,如果值不一致,表明数据库先前没有正常关闭,需要做恢复。

 

l  High and Low SCN

Oracle的Redo log会顺序纪录数据库的各个变化。一组redo log文件写满后,会自动切换到下一组redo log文件。则上一组redo log的high scn就是下一组redo log的low scn。

在视图v$log_history中,sequence#代表redo log的序列号,first_change#表示当前redo log的low scn,列next_change#表示当前redo log的high scn。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值