關於oracle SCN 的討論

楊奇龍發表於2010-06-09

 

1、SCN存在redo log檔案,control檔案、資料檔案;
2、oracle正常執行時,control檔案的SCN是個很大的數,與redo log檔案、資料檔案的SCN不同,正常關閉時,做完checkpoint後,三者的SCN值相同;
日誌檔案中scn有起始和結束2個(高低),在current log中高scn同樣為 無窮大

3、當一個事務commit成功時,redo log檔案中的SCN+1,當該事務所做的修改寫入資料檔案後,資料檔案的SCN+1;

commit的時候加一,其他很多時候也會加1,只要資料庫發生了變化都會增加。 資料寫入資料檔案scn不是加1而是ckpt 更新,檢查點發生的時候才修改資料檔案頭的 檢查點計數和更新scn

 

4、所以,當資料庫發現SCN不一致,應該是
redo log檔案中的SCN>=資料檔案中的SCN

5、疑問:
是不是如果一個事務比較大,在事務提交前就發生redo log entries、data buffer的寫入,此時斷電,則資料檔案、redo log檔案的SCN沒有+1,且相同,但控制檔案SCN不同,資料庫startup時發生回滾。
資料檔案是由ckpt程式更新檔案頭的,scn不是加1,而是更新為檢查點發生那時的scn,回滾是根據回滾段頭的事務表狀態來進行的

資料寫入資料檔案scn不是加1而是ckpt 更新,檢查點發生的時候才修改資料檔案頭的 檢查點計數和更新scn

 

是不是應該這麼說?:
當ckpt 更新時發生資料寫入,同時修改資料檔案頭的 檢查點計數和更新scn 。當出現其他情況下的資料寫入時(如無空閒緩衝等),不發生ckpt ,但SCN會增加。

這個時候修改的是資料塊但不是資料檔案頭,只有檢查點發生的時候才更新資料檔案頭,也就是說只有 ckpt 程式更新資料檔案頭(oracle8以前如果沒有ckpt程式就是lgwr更新),dbwr只寫資料塊


commit的時候加一,其他很多時候也會加1,只要資料庫發生了變化都會增加。
很多時候,能否舉一些例子

dml一發生即使沒有提交也會增加scn, job程式一樣產生scn,只要對資料庫中檔案發生任何的改變都有可能產生scn,SCN: system change number, not system commit number .也就是 系統發生變化 所產生的一個時間點標誌。不是提交的標誌,只是因為提交也是系統的變化之一而已

CKPT發生時REDO LOG紀錄對應SCN和CHECK POINT SEQUENCE#並立即由LGWR將REDO LOG BUFFER中的內容全部寫入REDO LOGFILE;同時DBWR將BUFFER CACHE內容寫入DATEFILE。
待LGWR和DBWR完成工作,CKPT將LOG SEQUENCE#、CHECK POINT SEQUENCE#和SCN寫入DATAFILE和CONTROLFILE檔案頭。

檢查點的發生,跟寫日誌檔案是沒有必然聯絡的
檢查點通知 DBWR 寫資料檔案,寫完後ckpt更新控制檔案 和資料檔案頭

當DBWR 寫 資料塊的時候若發現 資料塊的 相關 RDBA (位於日誌檔案的位置) 的 log block 還沒有被寫入日誌檔案,則在dbwr寫塊之前必須通知llgwr把log buffer 中日誌寫入日誌檔案

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

相關文章