redo和undo的區(qū)別

redo--> undo-->datafile
insert一條記錄時(shí), 表跟undo的信息都會放進(jìn) redo 中, 在commit 或之前, redo 的信息會放進(jìn)硬盤上. 故障時(shí), redo 便可恢復(fù)那些已經(jīng)commit 了的數(shù)據(jù).

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、八宿網(wǎng)絡(luò)推廣、成都微信小程序、八宿網(wǎng)絡(luò)營銷、八宿企業(yè)策劃、八宿品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供八宿建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:bm7419.com

redo->每次操作都先記錄到redo日志中,當(dāng)出現(xiàn)實(shí)例故障(像斷電),導(dǎo)致數(shù)據(jù)未能更新到數(shù)據(jù)文件,則數(shù)據(jù)庫重啟時(shí)須redo,重新把數(shù)據(jù)更新到數(shù)據(jù)文件
undo->記錄更改前的一份copy,但你系統(tǒng)rollback時(shí),把這份copy重新覆蓋到原來的數(shù)據(jù)

redo->記錄所有操作,用于恢復(fù)(redo records all the database transaction used for recovery)
undo->記錄所有的前印象,用于回滾(undo is used to store uncommited data infor used for rollback)

redo->已遞交的事務(wù),實(shí)例恢復(fù)時(shí)要寫到數(shù)據(jù)文件去的
undo->未遞交的事務(wù).

redo的原因是:每次commit時(shí),將數(shù)據(jù)的修改立即寫到online redo中,但是并不一定同時(shí)將該數(shù)據(jù)的修改寫到數(shù)據(jù)文件中。因?yàn)樵摂?shù)據(jù)已經(jīng)提交,但是只存在聯(lián)機(jī)日志文件中,所以在恢復(fù)時(shí)需要將數(shù)據(jù)從聯(lián)機(jī)日志文件中找出來,重新應(yīng)用一下,使已經(jīng)更改數(shù)據(jù)在數(shù)據(jù)文件中也改過來!

undo的原因是:在oracle正常運(yùn)行時(shí),為了提高效率,假如用戶還沒有commit,但是空閑內(nèi)存不多時(shí),會由DBWR進(jìn)程將臟塊寫入到數(shù)據(jù)文件中,以便騰出寶貴的內(nèi)存供其它進(jìn)程使用。這就是需要UNDO的原因。因?yàn)檫€沒有發(fā)出commit語句,但是oracle的dbwr進(jìn)程已經(jīng)將沒有提交的數(shù)據(jù)寫到數(shù)據(jù)文件中去了。

undo 也是也是datafile, 可能dirty buffer 沒有寫回到磁盤里面去。
 只有先redo apply 成功了,才能保證undo datafile 里面的東西都是正確的,然后才能rollback

做undo的目的是使系統(tǒng)恢復(fù)到系統(tǒng)崩潰前(關(guān)機(jī)前)的狀態(tài),再進(jìn)行redo是保證系統(tǒng)的一致性.
不做undo,系統(tǒng)就不會知道之前的狀態(tài),redo就無從談起

 所以instance crash recovery 的時(shí)候總是先rollforward, 再rollback

 undo
回退段中的數(shù)據(jù)是以“回退條目”方式存儲。
 回退條目=塊信息(在事務(wù)中發(fā)生改動(dòng)的塊的編號)+在事務(wù)提交前存儲在塊中的數(shù)據(jù)

 在每一個(gè)回退段中oracle都為其維護(hù)一張“事務(wù)表”
在事務(wù)表中記錄著與該回退段中所有回退條目相關(guān)的事務(wù)編號(事務(wù)SCN&回退條目)

redo
重做記錄由一組“變更向量”組成。
 每個(gè)變更變量中記錄了事務(wù)對數(shù)據(jù)庫中某個(gè)塊所做的修改。
 當(dāng)用戶提交一條commit語句時(shí),LGWR進(jìn)程會立刻將一條提交記錄寫入到重做日志文件中,然后再開始寫入與該事務(wù)相關(guān)的重做信息。

#事務(wù)提交成功后,Oracle將為該事備生成一個(gè)系統(tǒng)變更碼(SCN)。事務(wù)的SCN將同時(shí)記錄在它的提交記錄和重做記錄中。

commit
提交事務(wù)前完成的工作:
·在SGA區(qū)的回退緩存中生成該事務(wù)的回退條目。在回退條目中保存有該事務(wù)所修改的數(shù)據(jù)的原始版本。
·在SGA區(qū)的重做日志緩存中生成該事務(wù)的重做記錄。重做記錄中記載了該事務(wù)對數(shù)據(jù)塊所進(jìn)行的修改,并且還記載了對回退段中的數(shù)據(jù)塊所進(jìn)行的修改。緩存中的重做記錄有可能在事務(wù)提交之前就寫入硬盤中。
·在SGA區(qū)的數(shù)據(jù)庫緩豐中記錄了事務(wù)對數(shù)據(jù)庫所進(jìn)行的修改。這些修改也有可能在事務(wù)提交之前就寫入硬盤中。

 提交事務(wù)時(shí)完成的工作:
·在為該事務(wù)指定的回退段中的內(nèi)部事務(wù)表內(nèi)記錄下這個(gè)事務(wù)已經(jīng)被提交,并且生成一個(gè)惟一的SCN記錄在內(nèi)部事務(wù)表中,用于惟一標(biāo)識這個(gè)事務(wù)。
·LGWR后進(jìn)進(jìn)程將SGA區(qū)重做日志緩存中的重做記錄寫入聯(lián)機(jī)重做日志文件。在寫入重做日志的同時(shí)還將寫入該事務(wù)的SCN。
·Oracle服務(wù)進(jìn)程釋放事務(wù)所使用的所有記錄鎖與表鎖。
·Oracle通知用戶事務(wù)提交完成。
·Oracle將該事務(wù)標(biāo)記為已完成。

rollback
回退事務(wù)完成的工作:
·Oracle通過使用回退段中的回退條目,撤銷事務(wù)中所有SQL語句對數(shù)據(jù)庫所做的修改。
·Oracle服務(wù)進(jìn)程釋放事務(wù)所使用的所有鎖
·Oracle通知事務(wù)回退成功。
·Oracle將該事務(wù)標(biāo)記為已完成

 舉個(gè)例子:
insert into a(id) values(1);(redo)
這條記錄是需要回滾的。
 回滾的語句是delete from a where id = 1;(undo)

試想想看。如果沒有做insert into a(id) values(1);(redo)
那么delete from a where id = 1;(undo)這句話就沒有意義了。

 現(xiàn)在看下正確的恢復(fù):
先insert into a(id) values(1);(redo)
然后delete from a where id = 1;(undo)
系統(tǒng)就回到了原先的狀態(tài),沒有這條記錄了

分享名稱:redo和undo的區(qū)別
文章起源:http://bm7419.com/article24/gihoje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、面包屑導(dǎo)航微信公眾號、域名注冊、定制網(wǎng)站、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)