1. 系統(tǒng)SCN號(hào)
查詢系統(tǒng)SCN號(hào)的方法:
select dbms_flashback.get_system_change_number from dual
commit后系統(tǒng)SCN號(hào)會(huì)增長(zhǎng),但是即使沒有commit操作,因?yàn)橛性S多后臺(tái)進(jìn)程在運(yùn)行,所以系統(tǒng)SCN號(hào)也會(huì)增長(zhǎng)。
2. 檢查點(diǎn)SCN
有4種檢查點(diǎn)SCN,其中除了文件頭中的啟動(dòng)SCN外,其他三種保存在控制文件中。可以通過:alter system set events ‘immediate trace name controlf level 10’導(dǎo)出控制文件到udump目錄的跟蹤文件,來查看控制文件的內(nèi)容。
1) 系統(tǒng)檢查點(diǎn)SCN(區(qū)別于上面的系統(tǒng)SCN,chekpoint發(fā)出后這些SCN號(hào)才受影響,如發(fā)出:alter system checkpoint),當(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號(hào)單獨(dú)存放在控制文件中,查詢方法:
Select checkpoint_change# from v$datafile
3) 文件頭中的啟動(dòng)SCN
Oracle把這個(gè)檢查點(diǎn)的SCN號(hào)存儲(chǔ)在每一個(gè)數(shù)據(jù)文件的文件頭中。主要用于數(shù)據(jù)庫實(shí)例啟動(dòng)時(shí),檢查是否需要執(zhí)行數(shù)據(jù)庫恢復(fù)。查詢方法:
Select name,chekpoint_change# from v$datafile_header
4) 終止SCN
每個(gè)數(shù)據(jù)文件的SCN號(hào)都存儲(chǔ)在控制文件中,查詢方法:
Select name,last_change# from v$datafile
在正常的數(shù)據(jù)庫操作過程中,所有處于聯(lián)機(jī)讀寫模式下的數(shù)據(jù)文件的終止SCN都為NULL。
3. 幾個(gè)檢查點(diǎn)SCN號(hào)的關(guān)系
1) 幾個(gè)檢查點(diǎn)SCN都相同:在數(shù)據(jù)庫打開并運(yùn)行之后,控制文件中的系統(tǒng)檢查點(diǎn)SCN、控制文件中的數(shù)據(jù)文件檢查點(diǎn)SCN及每個(gè)數(shù)據(jù)文件頭中的啟動(dòng)SCN都是相同的,控制文件中的每個(gè)數(shù)據(jù)文件的終止SCN都是NULL。
2) 數(shù)據(jù)庫正常關(guān)閉時(shí),系統(tǒng)會(huì)執(zhí)行一個(gè)檢查點(diǎn)動(dòng)作,這時(shí)所有數(shù)據(jù)文件的 終止SCN號(hào)會(huì)設(shè)置為數(shù)據(jù)文件頭的那個(gè)啟動(dòng)SCN。數(shù)據(jù)庫重新啟動(dòng)時(shí),Oracle將數(shù)據(jù)文件頭中的啟動(dòng)SCN與數(shù)據(jù)文件檢查點(diǎn)SCN比較,如果這兩個(gè)值匹配,Oracle接下來再比較數(shù)據(jù)文件頭中的SCN和控制文件中數(shù)據(jù)文件的終止SCN,如果這個(gè)值也匹配,就意味著所有數(shù)據(jù)塊已經(jīng)提交,因此數(shù)據(jù)庫不需要進(jìn)行恢復(fù),此時(shí)數(shù)據(jù)庫直接打開。當(dāng)所有的數(shù)據(jù)文件都打開之后,終止SCN再次被設(shè)置為NULL,表示數(shù)據(jù)文件已經(jīng)打開并能夠正常使用了。
3) 數(shù)據(jù)庫非正常關(guān)閉(或稱為實(shí)例崩潰)時(shí),終止SCN不會(huì)被設(shè)置,依然為NULL,這可以通過把數(shù)據(jù)庫啟動(dòng)至mount狀態(tài)查詢出來。這樣Oracle通過這個(gè)信息就可以知道實(shí)例上次運(yùn)行時(shí)崩潰了,檢查點(diǎn)沒有執(zhí)行。這樣重新啟動(dòng)時(shí),Oracle會(huì)執(zhí)行實(shí)例恢復(fù)工作,即先執(zhí)行前滾、回滾操作,再把數(shù)據(jù)庫打開。
4) 數(shù)據(jù)文件檢查點(diǎn)SCN及系統(tǒng)檢查點(diǎn)SCN比文件頭啟動(dòng)SCN大:這時(shí)的情況是:系統(tǒng)發(fā)生介質(zhì)故障,數(shù)據(jù)文件被以前的備份代替,控制文件中的數(shù)據(jù)文件檢查點(diǎn)SCN肯定比文件頭中的啟動(dòng)SCN要大,這樣Oracle就知道要對(duì)這個(gè)文件進(jìn)行介質(zhì)恢復(fù)。這時(shí)要通過下面語句恢復(fù)數(shù)據(jù)庫:
recover database ……
5) 系統(tǒng)檢查點(diǎn)SCN比數(shù)據(jù)文件SCN及文件頭啟動(dòng)SCN大:
有些表空間是只讀的,這時(shí)控制文件中的系統(tǒng)檢查點(diǎn)SCN號(hào)會(huì)不斷增長(zhǎng),而數(shù)據(jù)文件SCN號(hào)和文件頭中的啟動(dòng)SCN號(hào)會(huì)停止更新(直到表空間又設(shè)置為可讀寫),顯然這時(shí)系統(tǒng)檢查點(diǎn)SCN號(hào)會(huì)大于數(shù)據(jù)文件SCN和文件頭啟動(dòng)SCN。
6) 系統(tǒng)檢查點(diǎn)SCN及數(shù)據(jù)文件SCN比文件頭啟動(dòng)SCN小:
在數(shù)據(jù)庫恢復(fù)時(shí),控制文件可能不是最新的,即把一個(gè)較早的控制文件還原為當(dāng)前的控制文件,然后再執(zhí)行恢復(fù)操作,這時(shí)控制文件中的系統(tǒng)檢查點(diǎn)SCN和數(shù)據(jù)文件SCN可能比文件頭的啟動(dòng)SCN小。這時(shí)恢復(fù)數(shù)據(jù)庫要用下面命令:
recover database using Backup Controlfile或其他的恢復(fù)語句
查詢系統(tǒng)SCN號(hào)的方法:
select dbms_flashback.get_system_change_number from dual
commit后系統(tǒng)SCN號(hào)會(huì)增長(zhǎng),但是即使沒有commit操作,因?yàn)橛性S多后臺(tái)進(jìn)程在運(yùn)行,所以系統(tǒng)SCN號(hào)也會(huì)增長(zhǎng)。
2. 檢查點(diǎn)SCN
有4種檢查點(diǎn)SCN,其中除了文件頭中的啟動(dòng)SCN外,其他三種保存在控制文件中。可以通過:alter system set events ‘immediate trace name controlf level 10’導(dǎo)出控制文件到udump目錄的跟蹤文件,來查看控制文件的內(nèi)容。
1) 系統(tǒng)檢查點(diǎn)SCN(區(qū)別于上面的系統(tǒng)SCN,chekpoint發(fā)出后這些SCN號(hào)才受影響,如發(fā)出:alter system checkpoint),當(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號(hào)單獨(dú)存放在控制文件中,查詢方法:
Select checkpoint_change# from v$datafile
3) 文件頭中的啟動(dòng)SCN
Oracle把這個(gè)檢查點(diǎn)的SCN號(hào)存儲(chǔ)在每一個(gè)數(shù)據(jù)文件的文件頭中。主要用于數(shù)據(jù)庫實(shí)例啟動(dòng)時(shí),檢查是否需要執(zhí)行數(shù)據(jù)庫恢復(fù)。查詢方法:
Select name,chekpoint_change# from v$datafile_header
4) 終止SCN
每個(gè)數(shù)據(jù)文件的SCN號(hào)都存儲(chǔ)在控制文件中,查詢方法:
Select name,last_change# from v$datafile
在正常的數(shù)據(jù)庫操作過程中,所有處于聯(lián)機(jī)讀寫模式下的數(shù)據(jù)文件的終止SCN都為NULL。
3. 幾個(gè)檢查點(diǎn)SCN號(hào)的關(guān)系
1) 幾個(gè)檢查點(diǎn)SCN都相同:在數(shù)據(jù)庫打開并運(yùn)行之后,控制文件中的系統(tǒng)檢查點(diǎn)SCN、控制文件中的數(shù)據(jù)文件檢查點(diǎn)SCN及每個(gè)數(shù)據(jù)文件頭中的啟動(dòng)SCN都是相同的,控制文件中的每個(gè)數(shù)據(jù)文件的終止SCN都是NULL。
2) 數(shù)據(jù)庫正常關(guān)閉時(shí),系統(tǒng)會(huì)執(zhí)行一個(gè)檢查點(diǎn)動(dòng)作,這時(shí)所有數(shù)據(jù)文件的 終止SCN號(hào)會(huì)設(shè)置為數(shù)據(jù)文件頭的那個(gè)啟動(dòng)SCN。數(shù)據(jù)庫重新啟動(dòng)時(shí),Oracle將數(shù)據(jù)文件頭中的啟動(dòng)SCN與數(shù)據(jù)文件檢查點(diǎn)SCN比較,如果這兩個(gè)值匹配,Oracle接下來再比較數(shù)據(jù)文件頭中的SCN和控制文件中數(shù)據(jù)文件的終止SCN,如果這個(gè)值也匹配,就意味著所有數(shù)據(jù)塊已經(jīng)提交,因此數(shù)據(jù)庫不需要進(jìn)行恢復(fù),此時(shí)數(shù)據(jù)庫直接打開。當(dāng)所有的數(shù)據(jù)文件都打開之后,終止SCN再次被設(shè)置為NULL,表示數(shù)據(jù)文件已經(jīng)打開并能夠正常使用了。
3) 數(shù)據(jù)庫非正常關(guān)閉(或稱為實(shí)例崩潰)時(shí),終止SCN不會(huì)被設(shè)置,依然為NULL,這可以通過把數(shù)據(jù)庫啟動(dòng)至mount狀態(tài)查詢出來。這樣Oracle通過這個(gè)信息就可以知道實(shí)例上次運(yùn)行時(shí)崩潰了,檢查點(diǎn)沒有執(zhí)行。這樣重新啟動(dòng)時(shí),Oracle會(huì)執(zhí)行實(shí)例恢復(fù)工作,即先執(zhí)行前滾、回滾操作,再把數(shù)據(jù)庫打開。
4) 數(shù)據(jù)文件檢查點(diǎn)SCN及系統(tǒng)檢查點(diǎn)SCN比文件頭啟動(dòng)SCN大:這時(shí)的情況是:系統(tǒng)發(fā)生介質(zhì)故障,數(shù)據(jù)文件被以前的備份代替,控制文件中的數(shù)據(jù)文件檢查點(diǎn)SCN肯定比文件頭中的啟動(dòng)SCN要大,這樣Oracle就知道要對(duì)這個(gè)文件進(jìn)行介質(zhì)恢復(fù)。這時(shí)要通過下面語句恢復(fù)數(shù)據(jù)庫:
recover database ……
5) 系統(tǒng)檢查點(diǎn)SCN比數(shù)據(jù)文件SCN及文件頭啟動(dòng)SCN大:
有些表空間是只讀的,這時(shí)控制文件中的系統(tǒng)檢查點(diǎn)SCN號(hào)會(huì)不斷增長(zhǎng),而數(shù)據(jù)文件SCN號(hào)和文件頭中的啟動(dòng)SCN號(hào)會(huì)停止更新(直到表空間又設(shè)置為可讀寫),顯然這時(shí)系統(tǒng)檢查點(diǎn)SCN號(hào)會(huì)大于數(shù)據(jù)文件SCN和文件頭啟動(dòng)SCN。
6) 系統(tǒng)檢查點(diǎn)SCN及數(shù)據(jù)文件SCN比文件頭啟動(dòng)SCN小:
在數(shù)據(jù)庫恢復(fù)時(shí),控制文件可能不是最新的,即把一個(gè)較早的控制文件還原為當(dāng)前的控制文件,然后再執(zhí)行恢復(fù)操作,這時(shí)控制文件中的系統(tǒng)檢查點(diǎn)SCN和數(shù)據(jù)文件SCN可能比文件頭的啟動(dòng)SCN小。這時(shí)恢復(fù)數(shù)據(jù)庫要用下面命令:
recover database using Backup Controlfile或其他的恢復(fù)語句
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
