在控制文件中存放着數據文件的信息,這些信息包含了一些經常改變的屬性,比如說數據文件的“結束SCN”.
這些東西在數據庫啓動時,對於驗證數據庫文件的完整性具有很重要的意義。
在ITpub上找到了一篇文章,很好,轉過來了,並作了一些測試。
1、系統檢查點scn
當一個檢查點動作完成後,Oracle就把系統檢查點的SCN存儲到控制文件中。
select checkpoint_change# from v$database
2、數據文件檢查點scn
當一個檢查點動作完成後,Oracle就把每個數據文件的scn單獨存放在控制文件中。
select name,checkpoint_change# from v$datafile
3、啓動scn
Oracle把這個檢查點的scn存儲在每個數據文件的文件頭中,這個值稱爲啓動scn,因爲它用於在數據庫實例啓動時,檢查是否需要執行數據庫恢復。
select name,checkpoint_change# from v$datafile_header
4、終止scn
每個數據文件的終止scn都存儲在控制文件中。
select name,last_change# from v$datafile
在正常的數據庫操作過程中,所有正處於聯機讀寫模式下的數據文件的終止scn都爲null.
5、在數據庫運行期間的scn值
在數據庫打開並運行之後,控制文件中的系統檢查點、控制文件中的數據文件檢查點scn和每個數據文件頭中的啓動scn都是相同的。控制文件中的每個數據文件的終止scn都爲null.
在安全關閉數據庫的過程中,系統會執行一個檢查點動作,這時所有數據文件的終止scn都會設置成數據文件頭中的那個啓動scn的值。在數據庫重新啓動的時候,Oracle將文件頭中的那個啓動scn與數據庫文件檢查點scn進行比較,假如這兩個值相互匹配,oracle接下來還要比較數據文件頭中的啓動 scn和控制文件中數據文件的終止scn。假如這兩個值也一致,就意味着所有數據塊多已經提交,所有對數據庫的修改都沒有在關閉數據庫的過程中丟失,因此這次啓動數據庫的過程也不需要任何恢復操作,此時數據庫就可以打開了。當所有的數據庫都打開之後,存儲在控制文件中的數據文件終止scn的值再次被更改爲 null,這表示數據文件已經打開並能夠正常使用了。
我做的測試如下:
A.數據庫打開時,使用mount參數,不把數據庫open.
系統檢查點scn
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1775875
控制文件中的數據文件檢查點scn
SQL> select name,checkpoint_change# from v$datafile ;
NAME CHECKPOINT_CHANGE#
------------------------------------- ------------------
/opt/oracle/oradata/dbora817/system01.dbf 1775875
/opt/oracle/oradata/dbora817/tools01.dbf 1775875
/opt/oracle/oradata/dbora817/rbs01.dbf 1775875
/opt/oracle/oradata/dbora817/temp01.dbf 1775875
/opt/oracle/oradata/dbora817/users01.dbf 1775875
/opt/oracle/oradata/dbora817/indx01.dbf 1775875
/opt/oracle/oradata/dbora817/drsys01.dbf 1775875
/opt/oracle/oradata/dbora817/perfstat.dbf 1775875
數據文件的文件頭中的啓動scn
SQL> select name,checkpoint_change# from v$datafile_header;
NAME CHECKPOINT_CHANGE#
------------------------------------- ------------------
/opt/oracle/oradata/dbora817/system01.dbf 1775875
/opt/oracle/oradata/dbora817/tools01.dbf 1775875
/opt/oracle/oradata/dbora817/rbs01.dbf 1775875
/opt/oracle/oradata/dbora817/temp01.dbf 1775875
/opt/oracle/oradata/dbora817/users01.dbf 1775875
/opt/oracle/oradata/dbora817/indx01.dbf 1775875
/opt/oracle/oradata/dbora817/drsys01.dbf 1775875
/opt/oracle/oradata/dbora817/perfstat.dbf 1775875
控制文件中的數據文件終止scn
SQL> select name,last_change# from v$datafile;
NAME LAST_CHANGE#
------------------------------------- ------------------
/opt/oracle/oradata/dbora817/system01.dbf 1775875
/opt/oracle/oradata/dbora817/tools01.dbf 1775875
/opt/oracle/oradata/dbora817/rbs01.dbf 1775875
/opt/oracle/oradata/dbora817/temp01.dbf 1775875
/opt/oracle/oradata/dbora817/users01.dbf 1775875
/opt/oracle/oradata/dbora817/indx01.dbf 1775875
/opt/oracle/oradata/dbora817/drsys01.dbf 1775875
/opt/oracle/oradata/dbora817/perfstat.dbf 1775875
這些個結束SCN都是跟啓動SCN是一樣的,這樣,當數據庫open的時候就可以不用recover了。
B.把數據庫打開open
SQL> alter database open;
Database altered.
系統檢查點scn 變爲:1775876,比原來增加了1。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1775876
控制文件中的數據文件檢查點scn和數據文件的文件頭中的啓動scn也都被修改成爲1775876,各自增加了1。
然後察看
控制文件中的數據文件終止scn,發現都是NULL.
SQL> select name,last_change# from v$datafile;
NAME LAST_CHANGE#
------------------------------------- ------------------
/opt/oracle/oradata/dbora817/system01.dbf
/opt/oracle/oradata/dbora817/tools01.dbf
/opt/oracle/oradata/dbora817/rbs01.dbf
/opt/oracle/oradata/dbora817/temp01.dbf
/opt/oracle/oradata/dbora817/users01.dbf
/opt/oracle/oradata/dbora817/indx01.dbf
/opt/oracle/oradata/dbora817/drsys01.dbf
/opt/oracle/oradata/dbora817/perfstat.dbf
C.對系統觸發檢查點
SQL> alter system checkpoint;
System altered.
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1775917
系統檢查點scn 發生變化,增加了1.