国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Oracle 之undo log探究

IT那活兒 / 1296人閱讀
Oracle 之undo log探究
點(diǎn)擊上方“IT那活兒”公眾號(hào),關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了!!!

什么是undo log

Undo log用來記錄數(shù)據(jù)修改的前映像。Undo log位于undo segments中,每個(gè)實(shí)例有多個(gè)undo segments,第一個(gè)undo segment位于system表空間中,其余的undo segment 位于undo表空間中。

Undo log的作用

Undo log有如下三大作用:
  • 用于事務(wù)回滾操作

    當(dāng)事務(wù)需要回滾時(shí),需要從undo log中獲取數(shù)據(jù)修改的前映像,以便于將數(shù)據(jù)恢復(fù)到修改前的狀態(tài)。

  • 提供一致性讀

    當(dāng)一個(gè)事務(wù)需要讀取的數(shù)據(jù)正在被另一個(gè)事務(wù)修改時(shí),為了避免臟讀,需要利用undo log構(gòu)造出數(shù)據(jù)塊被修改前的一致性的數(shù)據(jù)塊。

  • 用于實(shí)例恢復(fù)

    當(dāng)實(shí)例崩潰重啟后,需要通過undo log將未提交的事務(wù)回滾,使實(shí)例恢復(fù)到崩潰前的一致性狀態(tài)。

undo log詳細(xì)內(nèi)容

如下通過實(shí)驗(yàn)詳細(xì)分析下DML三種操作insert、update、delete時(shí)undo log記錄的內(nèi)容。
1. update操作
如下圖所示b表中有3條數(shù)據(jù):
對(duì)b表中的一條數(shù)據(jù)執(zhí)行更新操作,不提交事務(wù)。
查詢v$transaction視圖,此視圖記錄了事務(wù)和undo相關(guān)的信息,通過此視圖undo的信息找到記錄上述修改操作的undo塊。
上一步之所以不提交事務(wù)是因?yàn)槭聞?wù)提交后,事務(wù)信息會(huì)從此視圖移除,無法定位undo信息。xid列標(biāo)識(shí)事務(wù)ID,UBAFIL標(biāo)識(shí)undo所在的文件號(hào),UBABLK標(biāo)識(shí)undo塊號(hào)。
dump出對(duì)應(yīng)的undo塊:
打開trace文件,可以看到導(dǎo)出的是6號(hào)文件的897號(hào)塊。
UNDO BLK表明是undo塊,xid是事務(wù)ID,由三部分組成,XIDUSN.XIDSLOT.XIDSQN,與v$transaction視圖中的三個(gè)字段對(duì)應(yīng)。cnt對(duì)應(yīng)UBAREC。
找到cnt: 0x18的記錄條目,里面有ITL信息,以及數(shù)據(jù)修改前的值,col 1表示的是第二列,第一列為col 0,[10]表示此列有10個(gè)字節(jié),53 7a 6c 53 64 76 6d 43 78 72是16進(jìn)制,轉(zhuǎn)換成ascII字符為SzlSdvmCxr,正好是修改前id=3的列A的值。
經(jīng)過上述分析,可以得出結(jié)論,update操作時(shí),undo中記錄的只是更新的字段的舊值,不更新的字段值不會(huì)記錄。
2. delete操作
dump出undo塊,查看trace文件:
undo塊中第7條記錄記錄了此事務(wù)的回滾信息:
記錄了兩列信息,轉(zhuǎn)換成文本后,正好是8 和name8。由此可見當(dāng)執(zhí)行delete語句時(shí),undo中記錄的是刪除的行的所有字段的值。
3. insert操作
執(zhí)行一條insert語句,記住編號(hào)100,表示這行數(shù)據(jù)在數(shù)據(jù)塊中的位置。
dump出undo塊,查看trace文件:
查看undo塊中第2條記錄信息:
  • KDO Op code: DRP --表示操作類型,DRP=delete row piece。
  • bdba: 0x01800417 --對(duì)應(yīng)的數(shù)據(jù)文件和塊,轉(zhuǎn)換成二進(jìn)制,前10位為數(shù)據(jù)文件號(hào),后22位為塊號(hào) ,6 號(hào)數(shù)據(jù)文件,1047號(hào)塊。
  • slot: 100(0x64) --行在數(shù)據(jù)塊中的位置,與上面select出來的row number正好對(duì)應(yīng)。
由此可見,當(dāng)執(zhí)行insert時(shí),undo中只會(huì)記錄回滾時(shí)需要的操作DRP,和數(shù)據(jù)行的位置。
4. 同一個(gè)事務(wù)中對(duì)同一條數(shù)據(jù)多次修改
如果在同一個(gè)事務(wù)里,對(duì)某一行數(shù)據(jù)的某一個(gè)字段值進(jìn)行了多次修改,如將name=a修改為name=b,再改為name=c,最后改成name=d,此時(shí)undo中會(huì)記錄每一次的修改信息呢,還是只記錄最后一次修改的信息呢?
查看undo塊信息。
查看第6條undo記錄。
  • col 1: [ 1] 63 --轉(zhuǎn)換成字符為c。
  • rci 0x05 -- 指向同一個(gè)事務(wù)的上一條undo記錄。
依次轉(zhuǎn)換col 1的值為字符得到 c->b->a->name1,正好與更新的順相反,依次撤銷即可實(shí)現(xiàn)回滾。rci 0x00表示本事務(wù)的第一條記錄。
因此可以得出如下結(jié)論:
在同一事務(wù)里,對(duì)某一個(gè)字段值反復(fù)更新,undo會(huì)記錄每次操作的前鏡像值,即會(huì)記錄中間結(jié)果。
總 結(jié)

update、insert、delete操作時(shí),undo中記錄的信息不一樣。

  • insert時(shí),只記錄了插入數(shù)據(jù)在數(shù)據(jù)塊中的位置。
  • update時(shí),記錄的是修改字段的前鏡像值。
  • delete時(shí),記錄的是整行數(shù)據(jù)。insert記錄的信息最少,update記錄的信息居中,delete記錄的信息最多。
執(zhí)行delete操作需要更多的undo空間記錄回滾信息,回滾時(shí)需要從undo中拷貝更多的數(shù)據(jù)到數(shù)據(jù)塊中。因此,delete操作的代價(jià)最昂貴


本文作者:江金林(上海新炬中北團(tuán)隊(duì))

本文來源:“IT那活兒”公眾號(hào)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/129124.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<