【備份恢復】之scn

 妞兒自學技術以來就沒開過博,今兒跟風開一回,希望會堅持到天長地久。嘻嘻。
 
備份恢復大概是dba日常用的最多的了也算是基本的必備技術,妞兒自從做了第三方oracle數據備份軟件開始,oracle的基本備份技術就開始一點一點的遺忘,所以準備開始複習嘍,跟我親愛的、親愛的博一起成長。
 
oracle通過scn來維護數據的一致性,是備份恢復的主要機制,備份恢復離不開scn, scn思想貫穿始終,嗯嗯,開篇就來scn吧...//
 
oracle內部4個scn,三個實在controlfile裏,一個在datafilel裏,拿我的小環境查下:
系統檢查點scn
SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
                        874834
當一個檢查點動作完成後,oracle就把系統檢查點的scn存儲到控制文件中去。
 
數據文件檢查點scn
SQL> column name format a100
SQL> set pagesize 14
SQL> set linesize 300
SQL> select name,checkpoint_change# from v$datafile;
NAME                                                                                                 CHECKPOINT_CHANGE#
---------------------------------------------------------------------------------------------------- ------------------
+DATA/oracl/datafile/system.256.729079823                                                                        874834
+DATA/oracl/datafile/sysaux.257.729079825                                                                        874834
+DATA/oracl/datafile/undotbs1.258.729079825                                                                      874834
+DATA/oracl/datafile/users.259.729079825                                                                         874834

當一個檢查點動作完成後,oracle也把數據文件檢查點scn單獨記錄到控制文件中。
 
終止scn
SQL> select name,last_change# from v$datafile;

NAME                                                                                                                                                                                                 LAST_CHANGE#
---------------------------------------------------------------------------------------------------- ------------
+DATA/oracl/datafile/system.256.729079823
+DATA/oracl/datafile/sysaux.257.729079825
+DATA/oracl/datafile/undotbs1.258.729079825
+DATA/oracl/datafile/users.259.729079825
聯機讀寫模式下面的所有的數據文件的終止SCN爲空或者無限大。
 
數據文件中的啓動scn
SQL> select name,checkpoint_change# from v$datafile_header;
NAME                                                                                                 CHECKPOINT_CHANGE#
---------------------------------------------------------------------------------------------------- ------------------
+DATA/oracl/datafile/system.256.729079823                                                                        874834
+DATA/oracl/datafile/sysaux.257.729079825                                                                        874834
+DATA/oracl/datafile/undotbs1.258.729079825                                                                      874834
+DATA/oracl/datafile/users.259.729079825                                                                         874834

數據文件的檢查點信息寫入到每一個數據文件的頭部。
再說說4個scn之間的關係吧:
數據庫正常運行期間,控制文件中的系統檢查點scn、數據文件檢查點scn、數據文件頭部的啓動scn都相同,此時只有控制文件中的終止scn爲null狀態。
數據庫正常關閉期間,系統執行一個checkpoint,將所有位於控制文件中的數據文件終止scn置成與數據文件頭部的啓動scn一致,數據庫安全關閉之後,四個scn應該是相同的。
--PS:通常通過查看這四個scn狀態來判斷數據庫是否正常關閉。
數據庫啓動的過程:
1、數據文件頭部的啓動SCN與控制文件中數據文件檢查點SCN比較,如果相同,繼續。若不同需介質恢復。
2、數據文件頭部的啓動SCN與控制文件中數據文件終止SCN比較,如果相同,那麼表示正常關機,不需要恢復。若不相同此時將需要實例恢復。
3、數據庫打開,控制文件中數據文件終止SCN被設置爲NULL數據庫被打開,並且正常使用。此時所有數據塊都已提交,所有數據庫的修改都沒有在數據庫關閉的過程中丟失。
數據庫正常關閉:
SQL> shutdown immediate;         -------將終止scn置爲與啓動scn一致
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area    238530560 bytes
Fixed Size                                    1335724 bytes
Variable Size                         159387220 bytes
Database Buffers                     75497472 bytes
Redo Buffers                                2310144 bytes
Database mounted.
SQL> select checkpoint_change# from v$database
    2    ;

CHECKPOINT_CHANGE#
------------------
                        880843

SQL> select checkpoint_change# from v$datafile;

CHECKPOINT_CHANGE#
------------------
                        880843
                        880843
                        880843
                        880843
SQL> select last_change# from v$datafile;

LAST_CHANGE#
------------
            880843
            880843
            880843
            880843

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
                        880843
                        880843
                        880843
                        880843
比較數據文件頭部啓動scn與控制文件中數據文件檢查點scn
比較數據文件頭部啓動scn與控制文件中終止scn
SQL> alter database open;

Database altered.

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
                        880846

SQL> select checkpoint_change# from v$datafile;

CHECKPOINT_CHANGE#
------------------
                        880846
                        880846
                        880846
                        880846

SQL> select last_change# from v$datafile;

LAST_CHANGE#       ------------------把所有數據文件終止scn設爲null
------------
 
 

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
                        880846
                        880846
                        880846
                        880846


 
 
 
獲取數據庫scn的兩種方法:
SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                                    880630

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
         880634
可以通過如下腳本來觀察系統scn的變化速率:
set serveroutput on
    declare
    a number;
    begin
        for i in 1..100 loop
            select current_scn into a from v$database;
            dbms_output.put_line(a);
        end loop;
    end;
 
未完待續。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章