Oracle數(shù)據(jù)庫(kù)中為什么會(huì)產(chǎn)生回滾與前退
來(lái)源:易賢網(wǎng) 閱讀:1370 次 日期:2015-08-28 17:26:33
溫馨提示:易賢網(wǎng)小編為您整理了“Oracle數(shù)據(jù)庫(kù)中為什么會(huì)產(chǎn)生回滾與前退”,方便廣大網(wǎng)友查閱!

Oracle概念問(wèn)題,假如數(shù)據(jù)沒(méi)有提交,但是卻被dbwn進(jìn)程寫(xiě)入了數(shù)據(jù)文件,會(huì)怎么樣呢?

案例分析:

首先說(shuō)明的是dbwn寫(xiě)臟數(shù)據(jù)跟commit提交沒(méi)有關(guān)系!

在一個(gè)transaction發(fā)生的過(guò)程中,online redo log首先記錄transaction中修改的數(shù)據(jù)塊相關(guān)信息,修改的數(shù)據(jù)塊會(huì)被緩存在database buffer cache中。由于database buffer cache寫(xiě)滿或者checkpoint等等條件觸發(fā)dbwn進(jìn)程,會(huì)導(dǎo)致這些緩存的數(shù)據(jù)塊寫(xiě)入數(shù)據(jù)文件,但此時(shí)可能該transaction仍然還沒(méi)有提交。所以在數(shù)據(jù)文件中,可能會(huì)有commited 和 uncommited 的數(shù)據(jù)塊。而原有的數(shù)據(jù)塊鏡像會(huì)存放在undo segment。

然而,dbwn寫(xiě)臟數(shù)據(jù)時(shí)不管這個(gè)要寫(xiě)的transaction是否提交,也沒(méi)有必要去管。

這樣就發(fā)生了所謂的已經(jīng)提交的數(shù)據(jù),但是還沒(méi)有寫(xiě)入數(shù)據(jù)文件的現(xiàn)象。

還有一種情況,數(shù)據(jù)沒(méi)有提交,但是已經(jīng)被寫(xiě)入數(shù)據(jù)文件,此時(shí)發(fā)生回退,撤銷沒(méi)有提交的數(shù)據(jù)。

那么,引發(fā)Oracle前滾與回退的根本原因就是什么呢?

根本原因是commit后寫(xiě)redo buffer和觸發(fā)lgwr寫(xiě) redo buffer的區(qū)別。

事務(wù)在執(zhí)行完畢后,隨即會(huì)被寫(xiě)入redo buffer和undo中,同時(shí)在redo buffer和undo中對(duì)該事務(wù)都有一個(gè)是否提交的標(biāo)記。兩者的默認(rèn)狀態(tài)都是active的,即沒(méi)有提交時(shí)刻處于激活狀態(tài)。

commit操作執(zhí)行時(shí)刻把此前的所有事務(wù)操作全部寫(xiě)入redo log file,commit成功后,redo buffer信息全部寫(xiě)入redo file,同時(shí)修改兩者中的事務(wù)提交標(biāo)識(shí)為inactive,表示此前事務(wù)已經(jīng)遞交。

oracle的前滾和回退根據(jù)就是依據(jù)事務(wù)是否提交而進(jìn)行的。

在觸發(fā)lgwr進(jìn)程后,oracle同樣把此前的redo buffer信息寫(xiě)入redo file,但是與commit觸發(fā)寫(xiě)日志不同的是,redo file本身對(duì)lgwr寫(xiě)日志操作不記錄任何信息標(biāo)識(shí),lgwr寫(xiě)到那里就是那里,就算此時(shí)掉電也無(wú)妨,redo file就記錄到掉電時(shí)刻的信息。

lgwr是一個(gè)Oracle后臺(tái)執(zhí)行的進(jìn)程,具體的日志寫(xiě)操作都有oracle去控制,這對(duì)于oracle來(lái)說(shuō)是透明的,因此不用在redo file中寫(xiě)入任何標(biāo)記信息,這也是正常的。

commit操作是唯一一個(gè)可以前臺(tái)操作與oracle后臺(tái)通信的指令,因此當(dāng)加入這個(gè)操作以后,oracle本身必須要了解各個(gè)事務(wù)的讀寫(xiě)狀況,那么怎么了解整個(gè)狀況:在redo以及undo中加入是否遞交的標(biāo)識(shí),對(duì)于已經(jīng)提交的操作,但是還沒(méi)有寫(xiě)入數(shù)據(jù)文件,那么就要前滾,相反,對(duì)于沒(méi)有提交,執(zhí)行回退!

于是,Oracle崩潰恢復(fù)步驟如下:

首先rolling forward 前滾:由于oracle failure,sga中的內(nèi)存信息丟失了,但是online redo log中還是存儲(chǔ)了transaction信息,包括commited or uncommited data??赡苓@些修改信息并沒(méi)有被oracle正確的來(lái)處理,包含兩種情況:已經(jīng)提交的還沒(méi)有寫(xiě)入數(shù)據(jù)文件,或者沒(méi)有提交的卻被寫(xiě)入了數(shù)據(jù)文件。針對(duì)已經(jīng)提交的還沒(méi)有寫(xiě)入數(shù)據(jù)文件就要發(fā)生前滾,在前滾過(guò)程中,smon會(huì)根據(jù)online redo log中的記錄來(lái)完成對(duì)datafile的修改。保證已經(jīng)提交的數(shù)據(jù)已經(jīng)寫(xiě)入數(shù)據(jù)文件。

接下來(lái),前滾結(jié)束后,數(shù)據(jù)庫(kù)正常open,此時(shí)用戶可以正常連接,可以訪問(wèn)已經(jīng)recover的commited data,但是對(duì)于那些屬于unrecoverable transaction的uncommited data,會(huì)被oracle 加鎖,是不可以訪問(wèn)的。

rolling back:假如有進(jìn)程訪問(wèn)這些加鎖的data,此時(shí)smon會(huì)對(duì)這些數(shù)據(jù)塊做rollback回滾,從數(shù)據(jù)文件中撤銷沒(méi)有提交卻被寫(xiě)入數(shù)據(jù)文件的數(shù)據(jù)。

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看數(shù)據(jù)庫(kù)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)