關於SCN需要知道的事

zhcunique發表於2021-03-15

ORACLE事務中的資料變化是如何寫入資料檔案的:
1.事務開始;
2.在BUFFER CACHE中尋找需要的資料塊,如果沒有,則從資料檔案讀入資料塊;
3.生成重做項寫入REDO LOG BUFFER(重做日誌緩衝區)中,修改BUFFER CACHE(資料庫高速緩衝區),該區域被標識為“髒緩衝區”;
4.事務提交,LGWR程式將LOG BUFFER中的重做記錄寫入ONLINE REDO LOG
FILE(聯機重做日誌檔案)中;
5.當發生CHECKPOINT,CKPT程式更新所有資料庫檔案頭的資訊,DBWn程式將BUFFER CACHE中的髒資料寫入DATA FILE中。

經過上述5個步驟,事務中的資料變化最終被寫入到資料檔案中。
但是,一旦在上述中間環節時,資料庫意外當機了,那麼在重新啟動時,ORACLE如
何知道哪些資料已經寫入資料檔案,哪些沒有寫呢?
我們知道,SCN機制能比較完善的解決上述問題。
相對我們人類用世紀、年月日、時分秒計時而言,SCN就相當於ORACLE的計時方法。
SCN是一個數字,確切的說是一個只會增加、不會減少的數字。正是它這種只會增加的特性確保了Oracle知道哪些應該被恢復、哪些應該被複制。
總共有4中SCN:
系統檢查點(System Checkpoint)SCN、資料檔案檢查點(Datafile Checkpoint)
SCN、結束SCN(Stop SCN)、開始SCN(Start SCN)。

系統最新SCN
SQL> select current_scn from v$database;

該SCN一直在發生變化,是系統最新的SCN號。當checkpoin(檢查點)完成後,ORACLE將System Checkpoint SCN號(系統檢查點SCN)存放在控制檔案中。

SQL> select checkpoint_change# from v$database;

該SCN沒有發生變化,並且小於系統最新的SCN號。


Datafile Checkpoint SCN(資料檔案檢查點SCN)

當checkpoint完成後,ORACLE將Datafile Checkpoint SCN 號存放在控制檔案中。
我們可以透過下面SQL語句查詢所有資料檔案的Datafile Checkpoinnt SCN號。
SQL> select name,checkpoint_change# from v$datafile;


Start SCN號(開始SCN)
ORACLE將Start SCN號存放在資料檔案頭中。
這個SCN用於檢查資料庫啟動過程是否需要做media recovery(介質恢復).
我們可以透過以下SQL語句查詢:
SQL> select name,checkpoint_change# from v$datafile_header;


Stop SCN號(結束SCN)
ORACLE將Stop SCN 號存放在控制檔案中。
這個SCN號用於檢查資料庫啟動過程是否需要做instance recovery(例項恢復)。
我們可以透過以下SQL語句查詢:
SQL> select name,last_change# from v$datafile;


四種SCN中,3種SCN存在於控制檔案中,Start SCN則存在於資料檔案的檔案頭中。在控制檔案中,System Checkpoint SCN是針對整個資料庫全域性的,因而只存在一個,而Datafile Checkpoint SCN和Stop SCN是針對每個資料檔案的,因而一個資料檔案就對應在控制檔案中存在一份Datafile Checkpoint SCN和Stop SCN。


記錄日誌時,自動記錄最新的SCN到日誌中。因此,每一條日誌都包含了一個時間。
當DBWn程式啟動時,將依照日誌記錄寫入一段資料。這一段日誌記錄的時間段必定有一個最早時間和一個最新(遲)時間。最早的時間我們稱為LOW SCN(即上次清空日誌後的第一條記錄),最新時間我們稱為NEXT SCN(即下次日誌清空前的最近一條記錄)。
這裡, 由CKPT程式將 NEXT SCN的值同步更 新 到 START SCN、SYSTEM CHECKPOINT SCN 和DATAFILE CHECKPOINT SCN中。以確保所有檔案的一致性。


SCN號與資料庫啟動
1)檢查是否需要介質恢復
在資料庫啟動過程中,當System Checkpoint SCN、Datafile Checkpoint SCN和
Start SCN號都相同時,資料庫可以正常啟動,不需要做media recovery。三者當中有一個不同時,則需要做media recovery.
2)檢查是否需要例項恢復
如果在啟動的過程中,End SCN 號為NULL,則需要做instance recovery.
ORACLE在啟動過程中首先檢查是否需要media recovery,然後再檢查是否需要
instance recovery.


SCN號與資料庫關閉
如果資料庫的正常關閉的話,將會觸發一個checkpoint,同時將資料檔案的END SCN
號設定為相應資料檔案的Start SCN號。
當資料庫啟動時,發現它們是一致的,則不需要做instance recovery。在資料庫正常啟動後,ORACLE會將END SCN 號設定為NULL.
如果資料庫異常關閉的話,則END SCN號將為NULL.


為什麼需要System SCN號與Datafile號
為什麼ORACLE會在控制檔案中記錄System checkpoint SCN 號的同時,還需要為每個資料檔案記錄Datafile Checkpoint SCN 號?
1)對只讀表空間,其資料檔案的Datafile Checkpoint SCN、Start SCN和END SCN號均相同。這三個SCN在表空間處於只讀期間都將被凍結。
2)如果控制檔案不是當前的控制檔案,則System checkpoint會小於Start SCN或END SCN號。記錄這些SCN號,可以區分控制檔案是否是當前的控制檔案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69994536/viewspace-2762907/,如需轉載,請註明出處,否則將追究法律責任。

相關文章