溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle SCN機(jī)制詳細(xì)解讀

發(fā)布時間:2020-08-17 15:54:26 來源:ITPUB博客 閱讀:148 作者:不一樣的天空w 欄目:關(guān)系型數(shù)據(jù)庫

深入剖析 - Oracle SCN機(jī)制詳細(xì)解讀

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),是在某個時間點(diǎn)定義數(shù)據(jù)庫已提交版本的時間戳標(biāo)記。 Oracle為每個已提交的事務(wù)分配一個唯一的SCN。 SCN的值是對數(shù)據(jù)庫進(jìn)行更改的邏輯時間點(diǎn)。 Oracle使用此編號記錄對數(shù)據(jù)庫所做的更改。 在數(shù)據(jù)庫中,SCN也可以說是無處不在,數(shù)據(jù)文件頭,控制文件,數(shù)據(jù)塊頭,日志文件等等都標(biāo)記著SCN。也正是這樣,數(shù)據(jù)庫的一致性維護(hù)和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進(jìn)程將log buffer中的“臟數(shù)據(jù)”的日志條目寫入redo log file中;

第五步:當(dāng)發(fā)生checkpoint,CKPT進(jìn)程更新所有數(shù)據(jù)文件的文件頭中的信息,DBWn進(jìn)程則負(fù)責(zé)將Buffer Cache中的臟數(shù)據(jù)

寫入到數(shù)據(jù)文件中。

經(jīng)過上述5個步驟,事務(wù)中的數(shù)據(jù)變化最終被寫入到數(shù)據(jù)文件中。但是,一旦在上述中間環(huán)節(jié)數(shù)據(jù)庫意外宕機(jī)了,在重新啟 動時

如何知道哪些數(shù)據(jù)已經(jīng)寫入數(shù)據(jù)文件、哪些沒有寫呢?(同樣,在DG、streams中也存在

類似疑問:redolog中哪些是上一次同步已經(jīng)復(fù)制過的數(shù)據(jù)、哪些沒有)

SCN機(jī)制就能比較完善的解決上述問題。 SCN是一個數(shù)字,確切的說是一個只會增加、不會減少的數(shù)字。正是它這種只會增

加的特性確保了 Oracle知道哪些應(yīng)該被恢復(fù)、哪些應(yīng)該被復(fù)制。

首先這里我們先介紹四個SCN概念。

1、系統(tǒng)檢查點(diǎn)scn (System Checkpoint SCN)

當(dāng)一個checkpoint檢查點(diǎn)動作完成后,Oracle就把系統(tǒng)檢查點(diǎn)的SCN存儲到 控制文件中。

select checkpoint_change# from v$database;

2,數(shù)據(jù)文件檢查點(diǎn)scn (Datafile Checkpoint SCN)

當(dāng)一個checkpoint動作完成后,Oracle就把每個數(shù)據(jù)文件的Datafile Checkpoint SCN 單獨(dú)存放在控制文件中。

select name,checkpoint_change# from v$datafile;

3,啟動scn (Start SCN)

Oracle把這個檢查點(diǎn)的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是需要利用以前的備份來進(jìn)行恢復(fù)的,而INSTANCE RECOVERY是不需要的。

2).media recovery通常發(fā)生在數(shù)據(jù)庫的數(shù)據(jù)文件之類發(fā)生損壞,需要利用以前的備份來進(jìn)行的恢復(fù),需要人工處理。

3).instance recovery則是發(fā)生在實例不正常關(guān)閉情況下的恢復(fù),是INSTANCE自己來的,不需要人工干預(yù)的。

6、在數(shù)據(jù)庫運(yùn)行期間的scn值

1).在數(shù)據(jù)庫打開并運(yùn)行之后,控制文件中的 系統(tǒng)檢查點(diǎn)、控制文件中的 數(shù)據(jù)文件檢查點(diǎn)scn和每個數(shù)據(jù)文件頭中的 啟動scn都是相同的??刂莆募械拿總€數(shù)據(jù)文件的 終止scn都為null.

2).在安全關(guān)閉數(shù)據(jù)庫的過程中,系統(tǒng)會執(zhí)行一個檢查點(diǎn)動作,這時所有數(shù)據(jù)文件的 終止scn都會設(shè)置成數(shù)據(jù)文件頭中的那個 啟動scn的值。

3).在數(shù)據(jù)庫重新啟動的時候,Oracle將文件頭中的那個 啟動scn數(shù)據(jù)文件檢查點(diǎn)scn進(jìn)行比較,如果這兩個值相互匹配,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ù)文件檢查點(diǎn)scn(Datafile Checkpoint SCN)

select checkpoint_change# from v$datafile;

啟動scn(Start SCN)

select checkpoint_change# from v$datafile_header;

如果查詢結(jié)果 數(shù)據(jù)文件檢查點(diǎn)scn >= 啟動scn,則不需要使用using backup controlfile;

如果查詢結(jié)果 數(shù)據(jù)文件檢查點(diǎn)scn < 啟動scn,則需要使用using backup controlfile;

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI