测试9——为何在数据库在mount阶段可以查询v$datafile_header 视图

大家都知道只有当数据库进入到OPEN状态时,数据文件才被打开,才能读取其中的内容.那在mount状态下,就可以读取v$datafile_header中的信息,为什么呢?

这说明当从nomount状态进入mount状态时,还是扫描了一下数据文件头中的内容的,而且将相应的信息存储到了控制文件中(因为有网友说通过dump control file可以看到http://www.itpub.net/thread-1153987-1-1.html)。

我试着做了一个实验,首先,把所有数据文件全部移走,然后mount数据库:

SQL> startup mount;
ORACLE instance started.


Total System Global Area 1653518336 bytes
Fixed Size    2228904 bytes
Variable Size  956304728 bytes
Database Buffers  687865856 bytes
Redo Buffers    7118848 bytes
Database mounted.
SQL> select checkpoint_change#,checkpoint_time from v$datafile_header;


CHECKPOINT_CHANGE# CHECKPOIN
------------------ ---------
0
0
0
0

发现此时,已经读取不到数据文件头部的checkpoint_change#,checkpoint_time等信息。因为没有数据文件可以供扫描了。

然后我又把数据文件移动回来,再重新mount,就可以看到啦:

SQL> shutdown abort
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.


Total System Global Area 1653518336 bytes
Fixed Size    2228904 bytes
Variable Size  956304728 bytes
Database Buffers  687865856 bytes
Redo Buffers    7118848 bytes
Database mounted.
SQL> select checkpoint_change#,checkpoint_time from v$datafile_header;


CHECKPOINT_CHANGE# CHECKPOIN
------------------ ---------
  1104824 27-OCT-14
  1104824 27-OCT-14
  1104824 27-OCT-14
  1104824 27-OCT-14


顺便总结下,到底什么时候需要进行数据恢复:

在数据库启动的时候,会检查v$database视图,v$datafile视图,v$datafile_header视图 里的checkpoint_change#,当然这三个视图的数值来源是不同的。v$database视图,v$datafile视图 里的scn是来自控制文件的,而v$datafile_header视图 里的scn是来自数据文件头的。

所以当数据库启动的时候,如果发现v$datafile_header的scn小于v$database(或v$datafile)里的值,就需要进行实例或者介质恢复。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值