關於SCN需要知道的事
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於CSS Transition,你需要知道的事CSS
- 關於webpack優化,你需要知道的事(上篇)Web優化
- 關於進入遊戲行業你需要知道的事遊戲行業
- 在使用Redux前你需要知道關於React的8件事ReduxReact
- 關於跨域你需要知道的跨域
- 關於Git小白應該知道的事Git
- 關於 TCP 需要了解的事兒TCP
- 關於註解我們需要知道的
- sqlzoo需要知道的那些事SQL
- 關於遠端辦公,每個企業都需要知道的5件事
- 關於Android模組化你需要知道的Android
- [20210409]關於X$KCCDI的scn資訊.txt
- [譯] 關於 Angular 動態元件你需要知道的Angular元件
- 安裝完Linux需要做的關於安全的事Linux
- 關於Java序列化你不知道的事Java
- 你需要知道的關於 Go 包的一切Go
- Flutter 你需要知道的那些事 01Flutter
- 【ASK_ORACLE】關於Oracle索引分裂你需要知道的Oracle索引
- [譯] 關於 `ExpressionChangedAfterItHasBeenCheckedError` 錯誤你所需要知道的事情ExpressError
- 關於GDPR,你需要了解的的5件事
- 關於Service你所需要知道內容(一)
- 關於 v-model 你需要知道的這一切!
- 關於Vue v-model你需要知道的一切Vue
- 關於“逆轉裁判”三部曲,你知道與不知道的事
- 關於檔案傳輸協議,你不知道的事協議
- 你應該知道的關於SEO和Javascript的6個事實JavaScript
- 關於神經網路:你需要知道這些神經網路
- 關於 iOS 上的 PWA 應用,你需要知道些什麼?iOS
- [譯] 關於 Yarn 和 npm 你所需要知道的一切YarnNPM
- 成功部署AIOps需要知道的7件事AI
- 關於Mysql事務,你必須知道的幾個知識點!MySql
- 關於JavaScript物件,你所不知道的事(一)- 先談物件JavaScript物件
- 關於專案採購管理,這些你需要知道
- 需要提醒你關於 golang 中 map 使用的幾點注意事項Golang
- [譯] 關於 Angular 的變化檢測,你需要知道的一切Angular
- 關於CRM系統中的客戶概念,您需要知道這些
- 關於時序資料庫,你必須要知道的那些事兒!資料庫
- 關於JavaScript物件,你所不知道的事(二)- 再說屬性JavaScript物件