大家都知道隻有當資料庫進入到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)裡的值,就需要進行執行個體或者媒體恢複。