什么是REDO
REDO記錄transaction logs,分為online和archived。以恢復(fù)為目的。
比如,機(jī)器停電,那么在重起之后需要online redo logs去恢復(fù)系統(tǒng)到失敗點(diǎn)。
比如,磁盤(pán)壞了,需要用archived redo logs和online redo logs區(qū)恢復(fù)數(shù)據(jù)。
比如,truncate一個(gè)表或其他的操作,想恢復(fù)到之前的狀態(tài),同樣也需要。
什么是UNDO
REDO是為了重新實(shí)現(xiàn)你的操作,而UNDO相反,是為了撤銷(xiāo)你做的操作,比如你得一個(gè)TRANSACTION執(zhí)行失敗了或你自己后悔了,則需要用ROLLBACK命令回退到操作之前?;貪L是在邏輯層面實(shí)現(xiàn)而不是物理層面,因?yàn)樵谝粋€(gè)多用戶(hù)系統(tǒng)中,數(shù)據(jù)結(jié)構(gòu),blocks等都在時(shí)時(shí)變化,比如我們INSERT一個(gè)數(shù)據(jù),表的空間不夠,擴(kuò)展了一個(gè)新的EXTENT,我們的數(shù)據(jù)保存在這新的EXTENT里,其它用戶(hù)隨后也在這EXTENT里插入了數(shù)據(jù),而此時(shí)我想ROLLBACK,那么顯然物理上講這EXTENT撤銷(xiāo)是不可能的,因?yàn)檫@么做會(huì)影響其他用戶(hù)的操作。所以,ROLLBACK是邏輯上回滾,比如對(duì)INSERT來(lái)說(shuō),那么ROLLBACK就是DELETE了。
COMMIT 以前,常想當(dāng)然地認(rèn)為,一個(gè)大的TRANSACTION(比如大批量地INSERT數(shù)據(jù))的COMMIT會(huì)花費(fèi)時(shí)間比短的TRANSACTION長(zhǎng)。而事實(shí)上是沒(méi)有什么區(qū)別的,
因?yàn)镺RACLE在COMMIT之前已經(jīng)把該寫(xiě)的東西寫(xiě)到DISK中了,
我們COMMIT只是
1,產(chǎn)生一個(gè)SCN給我們TRANSACTION,SCN簡(jiǎn)單理解就是給TRANSACTION排隊(duì),以便恢復(fù)和保持一致性。
2,REDO寫(xiě)REDO到DISK中(LGWR,這就是log file sync),記錄SCN在ONLINE REDO LOG,當(dāng)這一步發(fā)生時(shí),我們可以說(shuō)事實(shí)上已經(jīng)提交了,這個(gè)TRANSACTION已經(jīng)結(jié)束(在V$TRANSACTION里消失了)
3,SESSION所擁有的LOCK(V$LOCK)被釋放。
4,BlockCleanout(這個(gè)問(wèn)題是產(chǎn)生ORA-01555: snapshot too old的根本原因) ROLLBACKROLLBACK和COMMIT正好相反,ROLLBACK的時(shí)間和TRANSACTION的大小有直接關(guān)系。因?yàn)镽OLLBACK必須物理上恢復(fù)數(shù)據(jù)。COMMIT之所以快,是因?yàn)镺RACLE在COMMIT之前已經(jīng)作了很多工作(產(chǎn)生UNDO,修改BLOCK,REDO,LATCH分配),ROLLBACK慢也是基于相同的原因。
1. UNDO表空間用于存放UNDO數(shù)據(jù)。當(dāng)執(zhí)行DML操作時(shí),Oracle會(huì)將這些操作的舊數(shù)據(jù)寫(xiě)入U(xiǎn)NDO段。管理UNDO數(shù)據(jù)不僅可以使用回滾段,還可以使用UNDO表空間。
2. UNDO數(shù)據(jù)的作用:當(dāng)用戶(hù)執(zhí)行DML操作修改數(shù)據(jù)時(shí),UNDO數(shù)據(jù)被存放在UNDO段,而新數(shù)據(jù)則被存放到數(shù)據(jù)段中,如果事務(wù)操作存在問(wèn)題,就需要回退事務(wù),以取消事物變化。
例如:執(zhí)行完UPDATE emp SET sal=1000 WHERE empno=7788后,發(fā)現(xiàn)應(yīng)該修改雇員7963的工資,而不是7788.此時(shí)應(yīng)該執(zhí)行ROLLBACK語(yǔ)句。
3.讀一致性
用戶(hù)檢索數(shù)據(jù)時(shí),ORACLE總是使用戶(hù)只能看到被提交過(guò)的數(shù)據(jù),這是由Oracle自動(dòng)提供的。當(dāng)用戶(hù)修改數(shù)據(jù),但是沒(méi)有提交時(shí),另外一個(gè)用戶(hù)使用select語(yǔ)句查找該值時(shí),該值就是從undo表空間中取得的。
4.事務(wù)恢復(fù)
事務(wù)恢復(fù)是例程恢復(fù)的一部分,它是由Oracle Server自動(dòng)完成的。如果在數(shù)據(jù)庫(kù)運(yùn)行過(guò)程中出線歷程失敗,那么當(dāng)啟動(dòng)OracleServer時(shí),后臺(tái)進(jìn)程SMON會(huì)自動(dòng)執(zhí)行例程恢復(fù)。執(zhí)行例程恢復(fù)時(shí),Oracle會(huì)重做所有未應(yīng)用的記錄。然后打開(kāi)數(shù)據(jù)庫(kù),回退未提交事務(wù)。
5.倒敘查詢(xún)
倒敘查詢(xún)用于取得某一特定時(shí)間點(diǎn)的數(shù)據(jù)庫(kù)數(shù)據(jù)。
6.UNDO_MANAGEMENT
使用初始化參數(shù)用于指定UNDO數(shù)據(jù)的管理方式。如果使用自動(dòng)管理模式,必須設(shè)置該參數(shù)為AUTO,此時(shí)采用UNDO表空間管理UNDO數(shù)據(jù);如果使用手工管理模式,必須設(shè)置該值為MANUAl,此時(shí)采用回滾段管理UNDO數(shù)據(jù)。
7.UNDO_TABLESPACE
用于指定例程所要使用的UNDO表空間。使用自動(dòng)UNDO管理模式時(shí),通過(guò)配置該參數(shù)可以指定例程所要使用的UNDO表空間。
使用RAC結(jié)構(gòu)時(shí),必須為每個(gè)例程配置一個(gè)獨(dú)立的UNDO表空間。
8.UNDO_RETENTION
該參數(shù)用于控制UNDO數(shù)據(jù)的最大保留時(shí)間,其默認(rèn)值為900秒,該值時(shí)倒敘查詢(xún)可以查看到的最早時(shí)間點(diǎn)。
9.UNDO表空間上不能建立任何數(shù)據(jù)對(duì)象。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。