oracle中SCN機(jī)制的示例分析

小編給大家分享一下oracle中SCN機(jī)制的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)是專(zhuān)業(yè)的望城網(wǎng)站建設(shè)公司,望城接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行望城網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

SCN(System Change Number)作為oracle中的一個(gè)重要機(jī)制,在數(shù)據(jù)恢復(fù)、Data Guard、Streams復(fù)制、RAC節(jié)點(diǎn)間的同步等各個(gè)功能中起著重要作用。理解SCN的運(yùn)作機(jī)制,可以幫助你更加深入地了解上述功能。

在理解SCN之前,我們先看下oracle事務(wù)中的數(shù)據(jù)變化是如何寫(xiě)入數(shù)據(jù)文件的:

1、事務(wù)開(kāi)始;

2、在buffer cache中找到需要的數(shù)據(jù)塊,如果沒(méi)有找到,則從數(shù)據(jù)文件中載入buffer cache中;

3、事務(wù)修改buffer cache的數(shù)據(jù)塊,該數(shù)據(jù)被標(biāo)識(shí)為“臟數(shù)據(jù)”,并被寫(xiě)入log buffer中;

4、事務(wù)提交,LGWR進(jìn)程將log buffer中的“臟數(shù)據(jù)”寫(xiě)入redo log file中;

5、當(dāng)發(fā)生checkpoint,CKPT進(jìn)程更新所有數(shù)據(jù)文件的文件頭中的信息,DBWn進(jìn)程則負(fù)責(zé)將Buffer Cache中的臟數(shù)據(jù)寫(xiě)入到數(shù)據(jù)文件中。

經(jīng)過(guò)上述5個(gè)步驟,事務(wù)中的數(shù)據(jù)變化最終被寫(xiě)入到數(shù)據(jù)文件中。但是,一旦在上述中間環(huán)節(jié)時(shí),數(shù)據(jù)庫(kù)意外宕機(jī)了,在重新啟動(dòng)時(shí)如何知道哪些數(shù)據(jù)已經(jīng)寫(xiě)入數(shù)據(jù)文件、哪些沒(méi)有寫(xiě)呢(同樣,在DG、streams中也存在類(lèi)似疑問(wèn):redo log中哪些是上一次同步已經(jīng)復(fù)制過(guò)的數(shù)據(jù)、哪些沒(méi)有)?SCN機(jī)制就能比較完善的解決上述問(wèn)題。

SCN是一個(gè)數(shù)字,確切的說(shuō)是一個(gè)只會(huì)增加、不會(huì)減少的數(shù)字。正是它這種只會(huì)增加的特性確保了Oracle知道哪些應(yīng)該被恢復(fù)、哪些應(yīng)該被復(fù)制。

總共有4中SCN:系統(tǒng)檢查點(diǎn)(System Checkpoint)SCN、數(shù)據(jù)文件檢查點(diǎn)(Datafile Checkpoint)SCN、結(jié)束SCN(Stop SCN)、開(kāi)始SCN(Start SCN)。其中其面3中SCN存在于控制文件中,最后一種則存在于數(shù)據(jù)文件的文件頭中。

在控制文件中,System Checkpoint SCN是針對(duì)整個(gè)數(shù)據(jù)庫(kù)全局的,因而之存在一個(gè),而Datafile Checkpoint SCN和Stop SCN是針對(duì)每個(gè)數(shù)據(jù)文件的,因而一個(gè)數(shù)據(jù)文件就對(duì)應(yīng)在控制文件中存在一份Datafile Checkpoint SCN和Stop SCN。在數(shù)據(jù)庫(kù)正常運(yùn)行期間,Stop SCN(通過(guò)視圖v$datafile的字段last_change#可以查詢(xún))是一個(gè)無(wú)窮大的數(shù)字或者說(shuō)是NULL。

在一個(gè)事務(wù)提交后(上述第四個(gè)步驟),會(huì)在redo log中存在一條redo記錄,同時(shí),系統(tǒng)為其提供一個(gè)最新的SCN(通過(guò)函數(shù)dbms_flashback.get_system_change_number可以知道當(dāng)前的最新SCN),記錄在該條記錄中。如果該條記錄是在redo log被清空(日志滿(mǎn)做切換時(shí)或發(fā)生checkpoint時(shí),所有變化日志已經(jīng)被寫(xiě)入數(shù)據(jù)文件中),則其SCN被記錄為redo log的low SCN。以后在日志再次被清空前寫(xiě)入的redo記錄中SCN則成為Next SCN。

當(dāng)日志切換或發(fā)生checkpoint(上述第五個(gè)步驟)時(shí),從Low SCN到Next SCN之間的所有redo記錄的數(shù)據(jù)就被DBWn進(jìn)程寫(xiě)入數(shù)據(jù)文件中,而CKPT進(jìn)程則將所有數(shù)據(jù)文件(無(wú)論redo log中的數(shù)據(jù)是否影響到該數(shù)據(jù)文件)的文件頭上記錄的Start SCN(通過(guò)視圖v$datafile_header的字段checkpoint_change#可以查詢(xún))更新為Next SCN,同時(shí)將控制文件中的System Checkpoint SCN(通過(guò)視圖v$database的字段checkpoint_change#可以查詢(xún))、每個(gè)數(shù)據(jù)文件對(duì)應(yīng)的Datafile Checkpoint(通過(guò)視圖v$datafile的字段checkpoint_change#可以查詢(xún))也更新為Next SCN。但是,如果該數(shù)據(jù)文件所在的表空間被設(shè)置為read-only時(shí),數(shù)據(jù)文件的Start SCN和控制文件中Datafile Checkpoint SCN都不會(huì)被更新。

那系統(tǒng)是如何產(chǎn)生一個(gè)最新的SCN的?實(shí)際上,這個(gè)數(shù)字是由當(dāng)時(shí)的timestamp轉(zhuǎn)換過(guò)來(lái)的。每當(dāng)需要產(chǎn)生一個(gè)最新的SCN到redo記錄時(shí),系統(tǒng)獲取當(dāng)時(shí)的timestamp,將其轉(zhuǎn)換為數(shù)字作為SCN。我們可以通過(guò)函數(shù)SCN_TO_TIMESTAMP(10g以后)將其轉(zhuǎn)換回timestamp:

SQL> select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual;
 
GET_SYSTEM_CHANGE_NUMBER
------------------------
SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER)
---------------------------------------------------------------------------
    2877076756
17-AUG-07 02.15.26.000000000 PM

也可以用函數(shù)timestamp_to_scn將一個(gè)timestamp轉(zhuǎn)換為SCN:

SQL> select timestamp_to_scn(SYSTIMESTAMP) as scn from dual;
 
  SCN
----------
2877078439

最后,SCN除了作為反映事務(wù)數(shù)據(jù)變化并保持同步外,它還起到系統(tǒng)的“心跳”作用——每隔3秒左右系統(tǒng)會(huì)刷新一次系統(tǒng)SCN。

下面,在簡(jiǎn)單介紹一下SCN如何在數(shù)據(jù)庫(kù)恢復(fù)中起作用。

數(shù)據(jù)庫(kù)在正常關(guān)閉(shutdown immediate/normal)時(shí),會(huì)先做一次checkpoint,將log file中的數(shù)據(jù)寫(xiě)入數(shù)據(jù)文件中,將控制文件、數(shù)據(jù)文件中的SCN(包括控制文件中的Stop SCN)都更新為最新的SCN。

數(shù)據(jù)庫(kù)異常/意外關(guān)閉不會(huì)或者只更新部分Stop SCN。

當(dāng)數(shù)據(jù)庫(kù)啟動(dòng)時(shí),Oracle先檢查控制文件中的每個(gè)Datafile Checkpoint SCN和數(shù)據(jù)文件中的Start SCN是否相同,再檢查每個(gè)Datafile Checkpoint SCN和Stop SCN是否相同。如果發(fā)現(xiàn)有不同,就從Redo Log中找到丟失的SCN,重新寫(xiě)入數(shù)據(jù)文件中進(jìn)行恢復(fù)。具體的數(shù)據(jù)恢復(fù)過(guò)程這里就不再贅述。

SCN作為Oracle中的一個(gè)重要機(jī)制,在多個(gè)重要功能中起著“控制器”的作用。了解SCN的產(chǎn)生和實(shí)現(xiàn)方式,幫助DBA理解和處理恢復(fù)、DG、Streams復(fù)制的問(wèn)題。

最后提一句,利用SCN機(jī)制,在Oracle10g、11g中又增加了一些很實(shí)用的功能——數(shù)據(jù)庫(kù)閃回、數(shù)據(jù)庫(kù)負(fù)載重現(xiàn)等。

以上是“oracle中SCN機(jī)制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享題目:oracle中SCN機(jī)制的示例分析
標(biāo)題來(lái)源:http://bm7419.com/article4/geepoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、自適應(yīng)網(wǎng)站、網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站建設(shè)、、用戶(hù)體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)