天天看點

測試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

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

發現此時,已經讀取不到資料檔案頭部的checkpoint_change#,checkpoint_time等資訊。因為沒有資料檔案可以供掃描了。

然後我又把資料檔案移動回來,再重新mount,就可以看到啦:

SQL> shutdown abort

ORACLE instance shut down.

  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)裡的值,就需要進行執行個體或者媒體恢複。