深入剖析 - Oracle SCN機制詳細解讀
創(chuàng)新互聯(lián)建站專注于青銅峽企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站定制開發(fā)。青銅峽網(wǎng)站建設(shè)公司,為青銅峽等地區(qū)提供建站服務(wù)。全流程按需策劃設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
https://mp.weixin.qq.com/s?__biz=MjM5MDAxOTk2MQ==&mid=2650276971&idx=1&sn=b5fb89b351d5b5bedd6353ff9c0b2157&chksm=be479c7d8930156bf73bd87f0bac869029f7341b3fdb4ed26a838b4e401c811116669acd5499&mpshare=1&scene=24&srcid=0927zxmXBLuBo3yxm7qsFYOy#rd
http://blog.chinaunix.net/uid-20274021-id-1969571.html
SCN即系統(tǒng)改變號(System Change Number),是在某個時間點定義數(shù)據(jù)庫已提交版本的時間戳標(biāo)記。 Oracle為每個已提交的事務(wù)分配一個唯一的SCN。 SCN的值是對數(shù)據(jù)庫進行更改的邏輯時間點。 Oracle使用此編號記錄對數(shù)據(jù)庫所做的更改。 在數(shù)據(jù)庫中,SCN也可以說是無處不在,數(shù)據(jù)文件頭,控制文件,數(shù)據(jù)塊頭,日志文件等等都標(biāo)記著SCN。也正是這樣,數(shù)據(jù)庫的一致性維護和SCN密切相關(guān)。不管是數(shù)據(jù)的備份,恢復(fù)都是離不開SCN的。
在理解這幾種SCN之前,我們先看下oracle事務(wù)中的數(shù)據(jù)變化是如何寫入數(shù)據(jù)文件的:
第一步:事務(wù)開始;
第二步:在buffer cache中找到需要的數(shù)據(jù)塊,如果沒找到,從數(shù)據(jù)文件中載入buffer cache中;
第三步:事務(wù)修改buffer cache的數(shù)據(jù)塊,該數(shù)據(jù)被標(biāo)識為“臟數(shù)據(jù)”,并被寫入log buffer中;
第四步:事務(wù)提交,LGWR進程將log buffer中的“臟數(shù)據(jù)”的日志條目寫入redo log file中;
第五步:當(dāng)發(fā)生checkpoint,CKPT進程更新所有數(shù)據(jù)文件的文件頭中的信息,DBWn進程則負責(zé)將Buffer Cache中的臟數(shù)據(jù)
寫入到數(shù)據(jù)文件中。
經(jīng)過上述5個步驟,事務(wù)中的數(shù)據(jù)變化最終被寫入到數(shù)據(jù)文件中。但是,一旦在上述中間環(huán)節(jié)數(shù)據(jù)庫意外宕機了,在重新啟 動時
如何知道哪些數(shù)據(jù)已經(jīng)寫入數(shù)據(jù)文件、哪些沒有寫呢?(同樣,在DG、streams中也存在
類似疑問:redolog中哪些是上一次同步已經(jīng)復(fù)制過的數(shù)據(jù)、哪些沒有)
SCN機制就能比較完善的解決上述問題。 SCN是一個數(shù)字,確切的說是一個只會增加、不會減少的數(shù)字。正是它這種只會增
加的特性確保了 Oracle知道哪些應(yīng)該被恢復(fù)、哪些應(yīng)該被復(fù)制。
首先這里我們先介紹四個SCN概念。
1、系統(tǒng)檢查點scn (System Checkpoint SCN)
當(dāng)一個checkpoint檢查點動作完成后,Oracle就把系統(tǒng)檢查點的SCN存儲到 控制文件中。
select checkpoint_change# from v$database;
2,數(shù)據(jù)文件檢查點scn (Datafile Checkpoint SCN)
當(dāng)一個checkpoint動作完成后,Oracle就把每個數(shù)據(jù)文件的Datafile Checkpoint SCN 單獨存放在控制文件中。
select name,checkpoint_change# from v$datafile;
3,啟動scn (Start SCN)
Oracle把這個檢查點的scn 存儲在每個數(shù)據(jù)文件的文件頭中,這個值稱為啟動scn,這個SCN用于用于在數(shù)據(jù)庫實例啟動時,檢查是否需要執(zhí)行數(shù)據(jù)庫恢復(fù)media recovery。
select name,checkpoint_change# from v$datafile_header;
4、終止scn (Stop SCN)
每個數(shù)據(jù)文件的終止scn都 存儲在控制文件中。這個SCN號用于檢查數(shù)據(jù)庫啟動過程是否需要做instance recovery。
select name,last_change# from v$datafile;
5.media recovery和instance recovery
1).media recovery是需要利用以前的備份來進行恢復(fù)的,而INSTANCE RECOVERY是不需要的。
2).media recovery通常發(fā)生在數(shù)據(jù)庫的數(shù)據(jù)文件之類發(fā)生損壞,需要利用以前的備份來進行的恢復(fù),需要人工處理。
3).instance recovery則是發(fā)生在實例不正常關(guān)閉情況下的恢復(fù),是INSTANCE自己來的,不需要人工干預(yù)的。
6、在數(shù)據(jù)庫運行期間的scn值
1).在數(shù)據(jù)庫打開并運行之后,控制文件中的 系統(tǒng)檢查點、控制文件中的 數(shù)據(jù)文件檢查點scn和每個數(shù)據(jù)文件頭中的 啟動scn都是相同的。控制文件中的每個數(shù)據(jù)文件的 終止scn都為null.
2).在安全關(guān)閉數(shù)據(jù)庫的過程中,系統(tǒng)會執(zhí)行一個檢查點動作,這時所有數(shù)據(jù)文件的 終止scn都會設(shè)置成數(shù)據(jù)文件頭中的那個 啟動scn的值。
3).在數(shù)據(jù)庫重新啟動的時候,Oracle將文件頭中的那個 啟動scn與 數(shù)據(jù)文件檢查點scn進行比較,如果這兩個值相互匹配,oracle接下來還要比較數(shù)據(jù)文件頭中的 啟動scn和控制文件中數(shù)據(jù)文件的 終止scn。如果這兩個值也一致,就意味著所有數(shù)據(jù)塊多已經(jīng)提交,所有對數(shù)據(jù)庫的修改都沒有在關(guān)閉數(shù)據(jù)庫的過程中丟失,因此這次啟動數(shù)據(jù)庫的過程也不需要任何恢復(fù)操作,此時數(shù)據(jù)庫就可以打開了。當(dāng)所有的數(shù)據(jù)庫都打開之后,存儲在控制文件中的數(shù)據(jù)文件 終止scn的值再次被更改為null,這表示數(shù)據(jù)文件已經(jīng)打開并能夠正常使用了。
7.SCN與數(shù)據(jù)庫啟動
在數(shù)據(jù)庫啟動過程中,當(dāng) System Checkpoint SCN、Datafile Checkpoint SCN和Start SCN都相同時,數(shù)據(jù)庫可以正常啟動,不需要做media recovery。三者當(dāng)中有一個不同時,則需要做media recovery.如果在啟動的過程中, End SCN為NULL,則需要做instance recovery。Oracle在啟動過程中首先檢查是否需要media recovery,然后再檢查是否需要instance recovery。
8.SCN與數(shù)據(jù)庫關(guān)閉
如果數(shù)據(jù)庫的正常關(guān)閉的話,將 會觸發(fā)一個checkpoint, 同時將數(shù)據(jù)文件的 END SCN設(shè)置為相應(yīng)數(shù)據(jù)文件的 Start SCN。當(dāng)數(shù)據(jù)庫啟動時,發(fā)現(xiàn)它們是一致的,則不需要做instance recovery。在數(shù)據(jù)庫正常啟動后,ORACLE會將END SCN設(shè)置為NULL.如果數(shù)據(jù)庫異常關(guān)閉的話,則END SCN將為NULL。
9.恢復(fù)數(shù)據(jù)庫時什么時候需要using backup controlfile
數(shù)據(jù)文件檢查點scn(Datafile Checkpoint SCN)
select checkpoint_change# from v$datafile;
啟動scn(Start SCN)
select checkpoint_change# from v$datafile_header;
如果查詢結(jié)果 數(shù)據(jù)文件檢查點scn >= 啟動scn,則不需要使用using backup controlfile;
如果查詢結(jié)果 數(shù)據(jù)文件檢查點scn < 啟動scn,則需要使用using backup controlfile;