個(gè)人經(jīng)驗(yàn)總結(jié):Oracle數(shù)據(jù)庫(kù)SCN號(hào)詳解
系統(tǒng)檢查點(diǎn)scn(v$database(checkpoint_change#))
數(shù)據(jù)文件檢查點(diǎn)(v$datafile(checkpoint_change#))
數(shù)據(jù)文件終止scn(v$datafile(last_change#))
數(shù)據(jù)文件中存放的檢查點(diǎn)
啟動(dòng)scn (v$datafile_header(checkpoint_change#)
1、系統(tǒng)檢查點(diǎn)scn
當(dāng)一個(gè)檢查點(diǎn)動(dòng)作完成之后,Oracle就把系統(tǒng)檢查點(diǎn)的SCN存儲(chǔ)到控制文件中。
select checkpoint_change# from v$database
2、數(shù)據(jù)文件檢查點(diǎn)scn
當(dāng)一個(gè)檢查點(diǎn)動(dòng)作完成之后,Oracle就把每個(gè)數(shù)據(jù)文件的scn單獨(dú)存放在控制文件
中。
select name,checkpoint_change# from v$datafile
3、啟動(dòng)scn
Oracle把這個(gè)檢查點(diǎn)的scn存儲(chǔ)在每個(gè)數(shù)據(jù)文件的文件頭中,這個(gè)值稱為啟動(dòng)scn,
因?yàn)樗糜谠跀?shù)據(jù)庫(kù)實(shí)例啟動(dòng)時(shí),檢查是否需要執(zhí)行數(shù)據(jù)庫(kù)恢復(fù)。
select name,checkpoint_change# from v$datafile_header
4、終止scn
每個(gè)數(shù)據(jù)文件的終止scn都存儲(chǔ)在控制文件中。
select name,last_change# from v$datafile
在正常的數(shù)據(jù)庫(kù)操作過(guò)程中,所有正處于聯(lián)機(jī)讀寫模式下的數(shù)據(jù)文件的終止scn都為null.
5、在數(shù)據(jù)庫(kù)運(yùn)行期間的scn值
在數(shù)據(jù)庫(kù)打開(kāi)并運(yùn)行之后,控制文件中的系統(tǒng)檢查點(diǎn)、控制文件中的數(shù)據(jù)文件檢查點(diǎn)scn
和每個(gè)數(shù)據(jù)文件頭中的啟動(dòng)scn都是相同的。控制文件中的每個(gè)數(shù)據(jù)文件的終止scn都為null.
在安全關(guān)閉數(shù)據(jù)庫(kù)的過(guò)程中,系統(tǒng)會(huì)執(zhí)行一個(gè)檢查點(diǎn)動(dòng)作,這時(shí)所有數(shù)據(jù)文件的終止scn
都會(huì)設(shè)置成數(shù)據(jù)文件頭中的那個(gè)啟動(dòng)scn的值。在數(shù)據(jù)庫(kù)重新啟動(dòng)的時(shí)候,
Oracle將文件頭中的那個(gè)啟動(dòng)scn與數(shù)據(jù)庫(kù)文件檢查點(diǎn)scn進(jìn)行比較,
如果這兩個(gè)值相互匹配,oracle接下來(lái)還要比較數(shù)據(jù)文件頭中的啟動(dòng)scn和控制文件
中數(shù)據(jù)文件的終止scn。如果這兩個(gè)值也一致,就意味著所有數(shù)據(jù)塊多已經(jīng)提交,所有
對(duì)數(shù)據(jù)庫(kù)的修改都沒(méi)有在關(guān)閉數(shù)據(jù)庫(kù)的過(guò)程中丟失,因此這次啟動(dòng)數(shù)據(jù)庫(kù)的過(guò)程
也不需要任何恢復(fù)操作,此時(shí)數(shù)據(jù)庫(kù)就可以打開(kāi)了。當(dāng)所有的數(shù)據(jù)庫(kù)都打開(kāi)之后,
存儲(chǔ)在控制文件中的數(shù)據(jù)文件終止scn的值再次被更改為null,
這表示數(shù)據(jù)文件已經(jīng)打開(kāi)并能夠正常使用了。
