Oracle实例恢复

来源:互联网 发布:田纳西大学 知乎 编辑:程序博客网 时间:2024/06/08 16:10

实例恢复会在数据库没有安全关闭的情况下会发生,在数据库shutdown abort和数据库异常down掉,或者断电会发生实例恢复。实例恢复的原因就是,在数据库down掉那一刻,有部分修改过的数据没有写到磁盘上面,虽然数据在内存里面丢掉了,但是redo写到磁盘上面了,所以实例恢复用redo将丢掉的数据恢复,那么数据库就恢复了,就可以打开了。

 

在出现掉电这种情况,可能连实例恢复都恢复不了,虽然redo日志会很快的刷到磁盘上面,但是总有一个时间是还没来得及刷到磁盘上面,如果非常不恰巧,日志还没有写到磁盘的那一瞬间掉电了,那么这个时候数据也就恢复不了了,因为保护数据的redo没有写入到磁盘上面。这个情况下数据库就可能坏了。

 

实例恢复是一个自动的过程,不需要人工的干预,控制文件的一个作用就是检查数据库文件的各个版本和存储在控制文件里面的版本是不是一致,如果不一致就需要实例恢复。


SQL> conn /as sysdba

已连接。

SQL> shutdown abort;   突然间将数据库关闭,没有将内存里面的脏数据写到磁盘上面

ORACLE 例程已经关闭。

这种方式关闭数据库那么数据库在重新启动的时候就会有一个实例恢复的过程。

SQL> startup nomount;    Oracle启动的第一个过程,将实例启动(其实就是操作系统给Oracle分配了一些内存,同时Oracle将后台的一些进程启动)

ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance

ORACLE 例程已经启动。

 

Total System Global Area 3390558208 bytes

Fixed Size                  2180464 bytes

Variable Size            2214595216 bytes

Database Buffers         1157627904 bytes

Redo Buffers               16154624 bytes

 

SQL> alter database mount;  这个阶段就是在配置文件里面去找控制文件,将控制文件挂载

 

数据库已更改。

 

第一个阶段和第二个阶段都不会发生实例恢复,都不会检查数据库的完整性,只有在第三个阶段才会去检查数据库的完整性。如果完整性有问题了就需要恢复了。

SQL> alter database open;  第三个阶段将数据库打开发生实例恢复

 

数据库已更改。


文件头:每一个数据文件头记录着文件更新的信息,在数据库里面更新的信息通常使用SCN来表示,SCN记录着Oracle的变化。

恢复实际上就是读redo log里面信息。


前滚,即redo的过程不是执行SQL的过程,实际上是一个数据块修正的过程,因为数据库还没有打开,SQL语句都没有办法解析,所以使用redo在数据块上面进行更新。在将所有可以应用的redo应用完之后,这个时候数据库就可以打开了。数据库打开就可以使用了,这个时候就有了回滚的问题,在数据库非正常关闭,有些事务还没有提交,这个时候就突然断电了,可能这个事务将数据修改了但是没有提交,重启之后就要将这些没有提交的事务回滚。回滚就将回滚段相应的数据拿回来就行了。回滚是在数据库打开之后做的,而不是先前滚再回滚最后打开数据库。


在将数据库shoutdown abort之后,在start up之后,去数据库alter文件里面看就会看到上面那些实例恢复的信息。在使用shutdown immediately就不会出现上面的信息,不需要实例恢复,因为将内存里面的脏数据写到磁盘上面了。

 

11g以前oraclealter文件是在bdump目录下呢。oracle 11g一改常态以XML与传统的文本两种格式提供Alert 日志。oracle 11g新的日志的位置由Automatic Diagnostic Respository(ADR)决定。 可以通过新的初始化参数DIAGNOSTIC_DEST控制ADR BASE的位置。 显示DIAGNOSTIC_DEST的位置show parameter DIAGNOSTIC_DEST; 查询两种日志的位置 查询xml文件的目录select value from v$diag_info where name='Diag Alert';查询文本文件的目录 select value from v$diag_info where name='Diag Trace';也可以通过查询background_dump_dest来查看oracle的文本日志show paramter backgound_dump_dest; 或是select value from v$parameter where name=’background_dump_dest’;

 

 

Oracle在每一次启动的过程当中,都会去做一致性的检查,如果发现有问题会去做实例恢复。


原创粉丝点击