讨论oracle的反腐,关于oracle SCN 的讨论
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 中日志寫入日志文件
總結
以上是生活随笔為你收集整理的讨论oracle的反腐,关于oracle SCN 的讨论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 香港签证多少钱啊?
- 下一篇: 情人愁遥夜的下一句是什么啊?