Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1099143
  • 博文数量: 276
  • 博客积分: 10077
  • 博客等级: 上将
  • 技术积分: 2513
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-24 20:31
文章分类

全部博文(276)

文章存档

2020年(1)

2015年(5)

2012年(2)

2011年(6)

2010年(7)

2009年(224)

2008年(31)

我的朋友

分类: Oracle

2008-08-21 19:07:40

1.未同步文件:一旦发现未同步的文件,Oracle 服务器会确定是否需要恢复数据库。例程故障,如关闭中止,就会导致不同步。在这种情况下,未提交的数据都将丢失,原因是在关闭之前内存中的数据尚未写入磁盘,因而文件未得到同步。
 
2.前滚阶段:DBWR 将已提交和未提交的数据都写入数据文件。前滚阶段的目的是将日志文件中记录的所有更改应用到数据块中。
注:
- 在前滚阶段中将向还原段置入条目。由于重做日志存储数据更改之前和之后的映像,因此如果在数据文件中发现未提交的块,且没有回退条目,则会添加还原段条目。
- 使用日志缓冲区来应用重做日志。已用缓冲区被标记为用于恢复,而不参与正常事务处理,直到它们被恢复进程放弃。
- 如果发生状态冲突(即,文件头声明该文件是只读的,但是控制文件将其识别为可读写,或是相反情况),重做日志将应用于只读数据文件。
 
3.数据文件中的已提交和未提交数据:前滚阶段成功结束后,所有已提交数据都将驻留在数据文件中,尽管未提交数据仍有可能存在。此时数据库即可打开。
 
4.回退阶段:要从文件中删除未提交数据,需要使用在前滚阶段或崩溃之前就已置入数据的还原段。当Oracle 服务器或用户请求块时,将向先请求的一方回退相应的块。因此,即使处在回退过程中,数据库也仍然可用。只有参与回退的那些数据块不可用。
 
5.数据文件中的已提交数据:当前滚和回退阶段都结束后,只有已提交的数据才驻留在磁盘上。
 
----------------------------------------------------------------------------------
 
    先rolling forward 前滚:由于oracle failure,sga中的内存信息丢失了,但是online redo log中还是存储了transaction信息,包括commited or uncommited data.可能这些修改信息并没有被oracle正确的来处理,包含两种情况:已经提交的还没有写入数据文件,或者没有提交的却被写入了数据文件。针对已经提交的还没有写入数据文件就要发生前滚,在前滚过程中,smon会根据online redo log中的记录来完成对datafile的修改。保证已经提交的数据已经写入数据文件。
    接下来,前滚结束后,数据库正常open,此时用户可以正常连接,可以访问已经recover的commited data,但是对于那些属于unrecoverable transaction的uncommited data,会被oracle 加锁,是不可以访问的。
    rolling back:假如有进程访问这些加锁的data,此时smon会对这些数据块做rollback回滚,从数据文件中撤销没有提交却被写入数据文件的数据。 

------------------------------------------------------------------------

数据库文件同步
• 要打开数据库,所有数据文件必须具有相同的检查点号,除非它们处于脱机状态或者是只读表空间的一部分。
• 所有Oracle 文件的同步是基于当前的重做日志检查点和序列号来进行的。
• 归档和联机重做日志文件恢复已提交的事务处理并回退未提交的事务处理,以便同步数据库文件。
• 归档和联机重做日志文件由Oracle 服务器在恢复阶段自动请求。确保日志存在于请求的位置。
阅读(1024) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~