日期:2014-05-16  浏览次数:20344 次

oracle实例恢复 详解理论知识


实例恢复

当数据库突然崩溃,而还没有来得及将buffer cache里的脏数据块刷新到数据文件里,同时实例崩溃时正在运行着的事务被突然中断,则事务为中间状态,也就是既没有提交也没有回滚,这时数据文件里的内容不能体现实例崩溃的状态,这样关闭数据库是不一致的。

- 下次启动实例时,oracle会由smon进程自动进行实例恢复,实例启动时,smon进程会去检查控制文件所记录的每个在线的、可读写的数据文件STOP SCN 号,数据库正常运行过程,该STOP SCN 为空,而当数据库正常关闭时,会进行完全检查点,并将检查点SCN 号更新到 STOP SCN中,实例崩溃时 oracle 来不及更新STOP SCN ,则STOP SCN 为空,当smon发现STOP SCN 是空值时,就知道实例上次没有正常关闭,因此由smon进程开始实例恢复,

前滚:SMON 实例恢复时,会从控制文件中找到每3秒触发的增量检查点,检查点队列的第一个脏数据块检查点所对应的RBA地址,于是,smon进程到联机文件中找到该检查点RBA地址,然后从该位置开始往下应用,应用所有的redo 条目到ON DISK RBA(检查点队列的最后一个RBA) 就是联机日志文件的最后一条redo。从而buffer cache 里又恢复了实例崩溃那个时间的状态。这个过程叫前滚

前滚完毕之后,buffer cache里既有崩溃时已经提交还没有写入数据文件里的脏数据块,也还有事务被突然终止,而没有提交又没有回滚的事务所脏的数据块,前滚完毕后,smon进程立即打开数据库,但是,这时的数据库中还含有那些中间状态的,既没有提交又没有回滚的脏数据块,这种脏数据块是不能存在数据库中的,因为他们没有被提交必须回滚,打开数据库以后,Smon 进程会在后台进行回滚。

oracle database 10g 会从实例错误中自动进行恢复,DBA所需要执行的操作就是正常启动实例。实例会装载控制文件,然后尝试打开数据文件。如果发现数据文件在关闭过程中不同步,则使用重做日志组中包含的信息将数据文件前滚到关闭时的状态,然后回退所有未提交的事务处理(因为还原表空间也已前滚)。

· 原因是尝试打开的数据库中的文件在关闭时不同步

· 是自动执行的

· 使用重做日志组中存储的信息来同步文件

· 涉及到两个不同的操作

- 前滚:数据文件还原到出现实例错误之前所处的状态。

- 回退: 已执行但尚未提交的更改会返回到初始状态。

实例恢复阶段:

要使实例打开一个数据文件,数据文件头中包含的系统更改号(SCN)必须也数据库控制文件中存储的当前SCN匹配。

如果编号不匹配,实例会应用联机重做日志中的redo 数据,并按顺序“重做”事务处理,直到数据文件处于最新状态。所有数据文件与控制文件同步后,就会打开数据库,此时用户可登陆

应用重做日志后,会应用所有事务处理,使数据库返回到出现错误时的状态。这通常包含正在进行但尚未提交的事务处理。打开数据库之后,会回退那些未提交的事务处理。在实例恢复的回退阶段结束时,数据文件只包含提交的数据。

1.数据文件不同步

2.前滚(利用redo)

3.文件中的提交和未提交数据

4.回退(还原)