UNDO 表空間管理 1、對(duì)于DML語(yǔ)句來(lái)說(shuō),只要修改了數(shù)據(jù)塊,Oracle數(shù)據(jù)庫(kù)就會(huì)將修改前的數(shù)據(jù)塊保留下來(lái),保存在undo segment里面,
UNDO 表空間管理
1、對(duì)于DML語(yǔ)句來(lái)說(shuō),只要修改了數(shù)據(jù)塊,Oracle數(shù)據(jù)庫(kù)就會(huì)將修改前的數(shù)據(jù)塊保留下來(lái),保存在undo segment里面,而undo segment則保存在undo表空間中
2、undo的管理
自動(dòng)undo管理(Oracle9i開(kāi)始)AUM
手工undo管理MUM
9i以后,就建議使用AUM,因此就不再討論MUM
一條DML語(yǔ)句的執(zhí)行流程update t set coll=‘A’ where coll=‘B’
1、在shared pool里面進(jìn)行解析,從而生成執(zhí)行計(jì)劃
2、根據(jù)執(zhí)行計(jì)劃,得出coll=‘B’的記錄存放在10號(hào)數(shù)據(jù)文件的54號(hào)數(shù)據(jù)塊里面
3、服務(wù)器進(jìn)程首先在buffer cache尋找一個(gè)可用的undo數(shù)據(jù)塊(如果一個(gè)事物已經(jīng)提交,那么這個(gè)事務(wù)曾經(jīng)使用過(guò)的undo數(shù)據(jù)塊就可以被使用),如果沒(méi)有發(fā)現(xiàn),則到undo表空間里找到一個(gè)可用的undo數(shù)據(jù)塊,,并調(diào)入到buffer cache。假設(shè)獲得的undo數(shù)據(jù)塊號(hào)為24號(hào),位于11號(hào)undo數(shù)據(jù)文件里
4、將改變前的值,也就是B放入24號(hào)undo數(shù)據(jù)塊(buffer cache中)
5、由于undo數(shù)據(jù)塊發(fā)生了變化(只要是數(shù)據(jù)塊發(fā)生變化,那么就產(chǎn)生重做記錄),于是產(chǎn)生重做記錄,假設(shè)重做記錄號(hào)是120
6、在buffer cache里面找到54號(hào)數(shù)據(jù)塊,如果沒(méi)有,則從10號(hào)數(shù)據(jù)文件調(diào)入
7、將改變后的值,也就是A放入54號(hào)數(shù)據(jù)塊
8、由于數(shù)據(jù)塊發(fā)生了變化,于是產(chǎn)生重做記錄,假設(shè)重做記錄號(hào)是121
9、控制權(quán)返回給用戶,如果使用SQLPLUS,那么表現(xiàn)為光標(biāo)返回
10、用戶發(fā)出commit命令,觸發(fā)LGWR,將120、121這兩個(gè)重做記錄寫(xiě)入聯(lián)機(jī)重做日志文件中,將54號(hào)、24號(hào)兩個(gè)數(shù)據(jù)塊頭部所記錄的事務(wù)狀態(tài)標(biāo)記設(shè)置為已提交,控制權(quán)返回給用戶,如果使用SQLPLUS,那么表現(xiàn)為光標(biāo)返回
11、這個(gè)時(shí)侯,54號(hào)和24號(hào)數(shù)據(jù)塊并不一定被DBWr寫(xiě)入數(shù)據(jù)文件,只有在臟數(shù)據(jù)塊的數(shù)量達(dá)到一定程度的時(shí)候才會(huì)被寫(xiě)入
事務(wù)提交以后,該事務(wù)所使用的undo數(shù)據(jù)塊就可以被覆蓋,上面的例子中,第10步用戶提交以后,24號(hào)undo數(shù)據(jù)塊就可以被覆蓋
Undo的作用
1、提供讀一執(zhí)性
2、回滾事務(wù)
3、實(shí)例恢復(fù)
讀一致性
一個(gè)場(chǎng)景描述
讀一致性是相對(duì)臟讀而言的,表T中有10000條記錄,獲取所有的記錄需要15分鐘的時(shí)間,當(dāng)前時(shí)間為9點(diǎn)整,用戶發(fā)出一條select * from T命令,該語(yǔ)句在9:15完成。當(dāng)用戶執(zhí)行該語(yǔ)句到9:10分的時(shí)候,另外一個(gè)用戶發(fā)出了一條刪除命令,將最后一條記錄刪除,并且進(jìn)行了提交。
到9點(diǎn)15分的時(shí)候,用戶返回了多少條記錄。
如果是9999條,那么就是臟讀、如果是10000條,那么就是讀一致性。
Oracle不會(huì)出現(xiàn)臟讀,提供讀一致性,而且沒(méi)有阻塞DML操作
Oracle如何實(shí)現(xiàn)讀一致性呢?
1、用戶在9點(diǎn)發(fā)出select語(yǔ)句的時(shí)候,服務(wù)器進(jìn)程會(huì)記錄9點(diǎn)那個(gè)時(shí)刻的SCN號(hào)(SCN號(hào)是以時(shí)間(timestamp)作為參數(shù)的一個(gè)函數(shù)返回值,調(diào)用函數(shù)(默認(rèn)以timestamp為參數(shù))隨時(shí)可以返回這個(gè)時(shí)刻的SCN號(hào),可以使用函數(shù)在SCN和timestamp之間進(jìn)行轉(zhuǎn)換),假設(shè)該SCN號(hào)是SCN9:00,那么SCN9:00一定大于等于記錄在所有數(shù)據(jù)塊頭部的ITL槽中的SCN號(hào)(如果有多個(gè)ITL槽,SCN最大的那個(gè))
2、服務(wù)器進(jìn)程掃描T表的時(shí)候,會(huì)把掃描的數(shù)據(jù)塊頭部的ITL槽中的SCN號(hào)與SCN9:00進(jìn)行比較,哪個(gè)更大。如果數(shù)據(jù)塊頭部的SCN小于SCN9:00,那么說(shuō)明這個(gè)數(shù)據(jù)塊在9:00以后沒(méi)有更改過(guò),可以直接讀取,如果數(shù)據(jù)塊頭部的SCN號(hào)大于SCN9:00,則說(shuō)明該數(shù)據(jù)塊在9:00以后更改過(guò),已經(jīng)不是9:00那個(gè)時(shí)刻的數(shù)據(jù)了于是要借助undo塊
3、9點(diǎn)10分,用戶更改了T表的最后一條記錄并提交(無(wú)論是否提交,只要是更改了T表,用戶就會(huì)去讀undo數(shù)據(jù)塊),假設(shè)被更改的是N號(hào)數(shù)據(jù)塊,那么N號(hào)數(shù)據(jù)塊頭部的ITL槽中記錄的SCN被修改為SCN9:10,當(dāng)服務(wù)器進(jìn)程掃描到這個(gè)數(shù)據(jù)塊的時(shí)候,發(fā)現(xiàn)ITL槽中的SCN9:10大于SCN9:00,說(shuō)明該數(shù)據(jù)塊在9:00以后被更新了,于是服務(wù)器進(jìn)程到N號(hào)塊的頭部,找到SCN9:10所在ITL槽,由于ITL槽記錄了對(duì)應(yīng)的undo塊的地址,于是服務(wù)器進(jìn)程找到undo數(shù)據(jù)塊,結(jié)合undo數(shù)據(jù)塊給用戶提供讀一致性。
更多Oracle相關(guān)信息見(jiàn)Oracle 專題頁(yè)面 ?tid=12
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com