溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle——redo+undo總結(jié)

發(fā)布時(shí)間:2020-07-01 03:07:21 來源:網(wǎng)絡(luò) 閱讀:982 作者:一個(gè)笨小孩 欄目:數(shù)據(jù)庫

《Oracle------redo》

重做日志文件(redo log file)對數(shù)據(jù)庫來說至關(guān)重要,他們是數(shù)據(jù)庫的事務(wù)日志;

Oracle數(shù)據(jù)庫維護(hù)著兩類重做日志文件:在線重做日志文件(redo)和 歸檔重做日志文件(archive log),(歸檔重做日志文件實(shí)際上就是已填滿的“舊”在線重做日志文件的副本)

這兩類重做日志文件都是用于恢復(fù)的:

①:如果數(shù)據(jù)庫所在主機(jī)掉電,導(dǎo)致實(shí)例失敗,Oracle會(huì)使用在線重做日志將系統(tǒng)恢復(fù)到恰好在掉電之前的那個(gè)提交點(diǎn);

②:如果磁盤驅(qū)動(dòng)器出現(xiàn)故障(這是介質(zhì)失?。琌racle會(huì)使用歸檔重做日志以及在線重做日志,以及之前的一個(gè)備份,將原在此驅(qū)動(dòng)器上的數(shù)據(jù)恢復(fù)到某個(gè)時(shí)間點(diǎn);


每個(gè)Oracle數(shù)據(jù)庫都至少有兩個(gè)在線重做日志,每個(gè)組中至少有一個(gè)成員(重做日志文件),在線重做日志組會(huì)以循環(huán)的方式使用;


Redo log的日志狀態(tài)分為4種:

current:指的是當(dāng)前日志文件,該日志文件是活動(dòng)的,當(dāng)前正在被使用的,進(jìn)行崩潰恢復(fù)時(shí),Current日志文件是必須的;

ACTIVE:是活動(dòng)的非當(dāng)前日志,可以已經(jīng)完成歸檔也可能沒有歸檔,在Crash恢復(fù)時(shí)會(huì)被用到;

inactive:非活動(dòng)日志,在實(shí)例恢復(fù)時(shí)不再需要,但是在介質(zhì)恢復(fù)時(shí)可能會(huì)用到,此狀態(tài)的日志也可能沒有被歸檔。

unused:該日志從未被寫入,這類日志可能是剛被添加到數(shù)據(jù)庫或者在resetlogs之后被重置。 


《Oracle----undo》

REDO是為了重新實(shí)現(xiàn)你的操作,而UNDO相反,是為了撤銷你做的操作,比如你得一個(gè)TRANSACTION執(zhí)行失敗了或你自己后悔了,則需要用ROLLBACK命令回退到操作之前?;貪L是在邏輯層面實(shí)現(xiàn)而不是物理層面,因?yàn)樵谝粋€(gè)多用戶系統(tǒng)中,數(shù)據(jù)結(jié)構(gòu),blocks等都在時(shí)時(shí)變化,比如我們INSERT一個(gè)數(shù)據(jù),表的空間不夠,擴(kuò)展了一個(gè)新的EXTENT,我們的數(shù)據(jù)保存在這新的EXTENT里,其它用戶隨后也在這EXTENT里插入了數(shù)據(jù),而此時(shí)我想ROLLBACK,那么顯然物理上講這EXTENT撤銷是不可能的,因?yàn)檫@么做會(huì)影響其他用戶的操作。所以,ROLLBACK是邏輯上回滾,比如對INSERT來說,那么ROLLBACK就是DELETE了。 


注意:redo是用于在失敗時(shí)恢復(fù)事務(wù),undo則用來取消一條語句或一組語句的作用。與redo不同,undo是存儲(chǔ)在數(shù)據(jù)庫內(nèi)部一組特殊的段中,稱為undo段


1、insert:

第一條insert into t 語句會(huì)同時(shí)生成redo和undo,它鎖生成的undo信息足以使insert小時(shí),而redo信息則足以讓這個(gè)insert再次發(fā)生;我們可以看到,塊緩沖區(qū)里面存放著修改完的undo塊、索引塊、和表數(shù)據(jù)塊,所有的這些塊都被重做日志緩沖區(qū)中相應(yīng)條目所保護(hù);


2、update

update 生成的undo量更大,比insert要大,這是因?yàn)橛捎趗pdate需要保存數(shù)據(jù)修改前的映像;update語句還放在重做日志緩沖區(qū)中;


3、delete:

delete會(huì)生成undo,塊被修改,并把redo發(fā)送到重做日志緩沖區(qū);


4、commit

當(dāng)事務(wù)提交時(shí),Oracle會(huì)把重做日志緩沖區(qū)刷新輸出到磁盤;


注意:

insert生成的undo最少;(因?yàn)镺racle只是記錄了一個(gè)rowid)

delete生成的undo最多;(因?yàn)镺racle必須把整行的刪除前映像記錄到undo段中)

(索引的維護(hù)也是很高的,比如要更新有索引的列 那么會(huì)生成好幾倍的undo)


commit的開銷主要來自兩方面:

第一:客戶端與數(shù)據(jù)庫直接往返通信量將會(huì)顯著增大

第二:每次提交,都必須等待redo寫至磁盤(在這種情況下,就會(huì)出現(xiàn)log file sync的等待事件)


執(zhí)行commit時(shí),剩下的工作:

1、為事務(wù)生成一個(gè)SCN號

2、LGWR將所有未寫入磁盤的重做日志條目寫至磁盤,并把SCN記錄到在線重做日志文件中;

3、v$lock中會(huì)記錄著我們的回話鎖,這些鎖都將被釋放,而排隊(duì)等待這些鎖的會(huì)話都會(huì)被喚醒,從而可以繼續(xù)完成他們的工作;

4、如果事務(wù)修改的某些塊還在緩沖區(qū)緩存中,Oracle就會(huì)以一種快速的模式訪問并清理;


redo  與 undo 日志的主要區(qū)別:

1、undo日志:在恢復(fù)時(shí)取消未完成事務(wù)的影響,忽略已經(jīng)提交的事務(wù)

2、redo日志:忽略未完成的事務(wù),重做已經(jīng)提交事務(wù)的改變。

3、undo日志:先將修改后的數(shù)據(jù)寫到磁盤——寫commit到磁盤

4、redo日志:先寫commit到磁盤——將修改后的數(shù)據(jù)寫到磁盤

5、undo日志:要求數(shù)據(jù)在事務(wù)結(jié)束后立即寫到磁盤,可能增加磁盤IO數(shù)

6、redo日志:要求我們在事務(wù)提交和日志記錄刷新以前將所有修改過的塊保留在緩沖區(qū),可能增加事務(wù)需要的平均緩沖區(qū)數(shù)


《臨時(shí)表和redo、undo》


在12C之前:

臨時(shí)表的數(shù)據(jù)塊不會(huì)生成redo,因此,臨時(shí)表的操作不是可恢復(fù)的。不過臨時(shí)表會(huì)生成undo,而且這個(gè)undo會(huì)計(jì)入日志,因此,臨時(shí)表也會(huì)生成一些redo;臨時(shí)表可以有約束,也可以這么說:正常表有的一切臨時(shí)表都可以有;


臨時(shí)表的DML操作,有如下特點(diǎn):

1、insert會(huì)生成很少甚至不生成undo  redo

2、臨時(shí)表的update會(huì)生成永久表update大約一半的redo

3、delete在臨時(shí)表上生成的redo與永久表上生成的redo同樣多;

(臨時(shí)表delete會(huì)生成很多redo,所以要避免進(jìn)行delete操作,可以truncate;可以使用臨時(shí)表進(jìn)行insert和select操作)


在12C之后:

從Oracle12C起,我們可以通過設(shè)置temp_undo_enabled來將臨時(shí)表的undo放在臨時(shí)表空間中,由于臨時(shí)表空間的任何數(shù)據(jù)變更都不會(huì)生成redo,所以當(dāng)這個(gè)參數(shù)設(shè)置為TRUE時(shí),任何臨時(shí)表上的DML都會(huì)生產(chǎn)很少甚至不會(huì)產(chǎn)生redo;

(temp_undo_enabled的默認(rèn)值是FALSE,如果將其改為TRUE的話,那臨時(shí)表生成的redo量與12C版本之前是一樣的)


ORA-01555: snapshot too old: -----這個(gè)錯(cuò)誤是非常典型的錯(cuò)誤:(它算的上是一個(gè)安全的錯(cuò)誤,唯一的影響就是收到這個(gè)錯(cuò)誤的查詢無法繼續(xù)處理)

產(chǎn)生這個(gè)錯(cuò)誤的原因:

1、undo段太小,不足以支撐系統(tǒng)上執(zhí)行的工作

2、程序夸commit獲取數(shù)據(jù)

3、塊清除

4、commit提交太頻繁


解決的方法參考:

1、適當(dāng)?shù)脑O(shè)置參數(shù)undo_retention(要大于運(yùn)行時(shí)間最長的事務(wù)所需的時(shí)間),我們可以通過v$undostat 來確定長時(shí)查詢的持續(xù)時(shí)間,另外,請?jiān)诖疟P上預(yù)留足夠的空間,因?yàn)闉榱舜_保undo_retention,undo段可能也會(huì)有所增長;

2、使用手動(dòng)undo管理時(shí)加大或增加更多的undo段,(不建議采用這種方法,強(qiáng)烈建議采用自動(dòng)undo管理方式)

3、減少查詢的運(yùn)行時(shí)間(調(diào)優(yōu))。調(diào)優(yōu)sql語句、

4、收集相關(guān)對象的統(tǒng)計(jì)信息。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI