《Oracle------redo》
重做日志文件(redo log file)對(duì)數(shù)據(jù)庫(kù)來(lái)說(shuō)至關(guān)重要,他們是數(shù)據(jù)庫(kù)的事務(wù)日志;
Oracle數(shù)據(jù)庫(kù)維護(hù)著兩類重做日志文件:在線重做日志文件(redo)和 歸檔重做日志文件(archive log),(歸檔重做日志文件實(shí)際上就是已填滿的“舊”在線重做日志文件的副本)
這兩類重做日志文件都是用于恢復(fù)的:
①:如果數(shù)據(jù)庫(kù)所在主機(jī)掉電,導(dǎo)致實(shí)例失敗,Oracle會(huì)使用在線重做日志將系統(tǒng)恢復(fù)到恰好在掉電之前的那個(gè)提交點(diǎn);
②:如果磁盤驅(qū)動(dòng)器出現(xiàn)故障(這是介質(zhì)失?。?,Oracle會(huì)使用歸檔重做日志以及在線重做日志,以及之前的一個(gè)備份,將原在此驅(qū)動(dòng)器上的數(shù)據(jù)恢復(fù)到某個(gè)時(shí)間點(diǎn);
每個(gè)Oracle數(shù)據(jù)庫(kù)都至少有兩個(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)完成歸檔也可能沒(méi)有歸檔,在Crash恢復(fù)時(shí)會(huì)被用到;
inactive:非活動(dòng)日志,在實(shí)例恢復(fù)時(shí)不再需要,但是在介質(zhì)恢復(fù)時(shí)可能會(huì)用到,此狀態(tài)的日志也可能沒(méi)有被歸檔。
unused:該日志從未被寫入,這類日志可能是剛被添加到數(shù)據(jù)庫(kù)或者在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是邏輯上回滾,比如對(duì)INSERT來(lái)說(shuō),那么ROLLBACK就是DELETE了。
注意:redo是用于在失敗時(shí)恢復(fù)事務(wù),undo則用來(lái)取消一條語(yǔ)句或一組語(yǔ)句的作用。與redo不同,undo是存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi)部一組特殊的段中,稱為undo段
1、insert:
第一條insert into t 語(yǔ)句會(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語(yǔ)句還放在重做日志緩沖區(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的開(kāi)銷主要來(lái)自兩方面:
第一:客戶端與數(shù)據(jù)庫(kù)直接往返通信量將會(huì)顯著增大
第二:每次提交,都必須等待redo寫至磁盤(在這種情況下,就會(huì)出現(xiàn)log file sync的等待事件)
執(zhí)行commit時(shí),剩下的工作:
1、為事務(wù)生成一個(gè)SCN號(hào)
2、LGWR將所有未寫入磁盤的重做日志條目寫至磁盤,并把SCN記錄到在線重做日志文件中;
3、v$lock中會(huì)記錄著我們的回話鎖,這些鎖都將被釋放,而排隊(duì)等待這些鎖的會(huì)話都會(huì)被喚醒,從而可以繼續(xù)完成他們的工作;
4、如果事務(wù)修改的某些塊還在緩沖區(qū)緩存中,Oracle就會(huì)以一種快速的模式訪問(wèn)并清理;
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日志:要求我們?cè)谑聞?wù)提交和日志記錄刷新以前將所有修改過(guò)的塊保留在緩沖區(qū),可能增加事務(wù)需要的平均緩沖區(qū)數(shù)
《臨時(shí)表和redo、undo》
在12C之前:
臨時(shí)表的數(shù)據(jù)塊不會(huì)生成redo,因此,臨時(shí)表的操作不是可恢復(fù)的。不過(guò)臨時(shí)表會(huì)生成undo,而且這個(gè)undo會(huì)計(jì)入日志,因此,臨時(shí)表也會(huì)生成一些redo;臨時(shí)表可以有約束,也可以這么說(shuō):正常表有的一切臨時(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起,我們可以通過(guò)設(shè)置temp_undo_enabled來(lái)將臨時(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ò)誤的查詢無(wú)法繼續(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í)間最長(zhǎng)的事務(wù)所需的時(shí)間),我們可以通過(guò)v$undostat 來(lái)確定長(zhǎng)時(shí)查詢的持續(xù)時(shí)間,另外,請(qǐng)?jiān)诖疟P上預(yù)留足夠的空間,因?yàn)闉榱舜_保undo_retention,undo段可能也會(huì)有所增長(zhǎng);
2、使用手動(dòng)undo管理時(shí)加大或增加更多的undo段,(不建議采用這種方法,強(qiáng)烈建議采用自動(dòng)undo管理方式)
3、減少查詢的運(yùn)行時(shí)間(調(diào)優(yōu))。調(diào)優(yōu)sql語(yǔ)句、
4、收集相關(guān)對(duì)象的統(tǒng)計(jì)信息。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章名稱:Oracle——redo+undo總結(jié)-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://chinadenli.net/article46/cejihg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、云服務(wù)器、關(guān)鍵詞優(yōu)化、外貿(mào)建站、動(dòng)態(tài)網(wǎng)站、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容