UNDO REDO 區別

wzhalal發表於2013-07-04
首先看一下undo與redo的字面意思:
  undo:撤銷,也就是取消之前的操作。
  redo:重做,重新執行一遍之前的操作。
什麼是REDO
  REDO記錄transaction logs,分為online和archived。以恢復為目的。
  比如,機器停電,那麼在重起之後需要online redo logs去恢復系統到失敗點。
  比如,磁碟壞了,需要用archived redo logs和online redo logs去恢復資料。
  比如,truncate一個表或其他的操作,想恢復到之前的狀態,同樣也需要。
什麼是UNDO
  REDO 是為了重新實現你的操作,而UNDO相反,是為了撤銷你做的操作,比如你得一個TRANSACTION執行失敗了或你自己後悔了,則需要用 ROLLBACK命令回退到操作之前。回滾是在邏輯層面實現而不是物理層面,因為在一個多使用者系統中,資料結構,blocks等都在時時變化,比如我們 INSERT一個資料,表的空間不夠,擴充套件了一個新的EXTENT,我們的資料儲存在這新的EXTENT裡,其它使用者隨後也在這EXTENT裡插入了資料,而此時我想ROLLBACK,那麼顯然物理上講這EXTENT撤銷是不可能的,因為這麼做會影響其他使用者的操作。所以,ROLLBACK是邏輯上回滾,比如對INSERT來說,那麼ROLLBACK就是DELETE了。
  COMMIT 以前,常想當然地認為,一個大的TRANSACTION(比如大批量地INSERT資料)的COMMIT會花費時間比短的TRANSACTION長。而事實上是沒有什麼區別的,
  因為ORACLE在COMMIT之前已經把該寫的東西寫到DISK中了,
  我們COMMIT只是
  1,產生一個SCN給我們TRANSACTION,SCN簡單理解就是給TRANSACTION排隊,以便恢復和保持一致性。
  2,REDO寫REDO到DISK中(LGWR,這就是log file sync),記錄SCN在ONLINE REDO LOG,當這一步發生時,我們可以說事實上已經提交了,這個TRANSACTION已經結束(在V$TRANSACTION裡消失了)
  3,SESSION所擁有的LOCK(V$LOCK)被釋放。
  4,Block Cleanout(這個問題是產生ORA-01555: snapshot too old的根本原因) ROLLBACK ROLLBACK和COMMIT正好相反,ROLLBACK的時間和TRANSACTION的大小有直接關係。因為ROLLBACK必須物理上恢復資料。 COMMIT之所以快,是因為ORACLE在COMMIT之前已經作了很多工作(產生UNDO,修改BLOCK,REDO,LATCH分配), ROLLBACK慢也是基於相同的原因。
  1. UNDO表空間用於存放UNDO資料。當執行DML操作時,Oracle會將這些操作的舊資料寫入UNDO段。管理UNDO資料不僅可以使用回滾段,還可以使用UNDO表空間。
  2. UNDO資料的作用:當使用者執行DML操作修改資料時,UNDO資料被存放在UNDO段,而新資料則被存放到資料段中,如果事務操作存在問題,就需要回退事務,以取消事物變化。
  例如:執行完UPDATE emp SET sal=1000 WHERE empno=7788後,發現應該修改僱員7963的工資,而不是7788.此時應該執行ROLLBACK語句。
  3.讀一致性
  使用者檢索資料時,ORACLE總是使使用者只能看到被提交過的資料,這是由Oracle自動提供的。當使用者修改資料,但是沒有提交時,另外一個使用者使用select語句查詢該值時,該值就是從undo表空間中取得的。
  4.事務恢復
  事務恢復是例程恢復的一部分,它是由Oracle Server自動完成的。如果在資料庫執行過程中出線例程失敗,那麼當啟動Oracle Server時,後臺程式SMON會自動執行例程恢復。執行例程恢復時,Oracle會重做所有未應用的記錄。然後開啟資料庫,回退未提交事務。
  5.倒敘查詢
  倒敘查詢用於取得某一特定時間點的資料庫資料。
  6.UNDO_MANAGEMENT
  使用初始化引數用於指定UNDO資料的管理方式。如果使用自動管理模式,必須設定該引數為AUTO,此時採用UNDO表空間管理UNDO資料;如果使用手工管理模式,必須設定該值為MANUAl,此時採用回滾段管理UNDO資料。
  7.UNDO_TABLESPACE
  用於指定例程所要使用的UNDO表空間。使用自動UNDO管理模式時,通過配置該引數可以指定例程所要使用的UNDO表空間。
  使用RAC結構時,必須為每個例程配置一個獨立的UNDO表空間。
  8.UNDO_RETENTION
  該引數用於控制UNDO資料的最大保留時間,其預設值為900秒,該值時倒序查詢可以檢視到的最早時間點。
  9.UNDO表空間上不能建立任何資料物件。
 
一.undo中資料的特點:
1。是資料修改前的備份,主要是保證使用者的讀一致性
2. 在事務修改資料時產生
3。至少儲存到事務結束
二。undo資料的作用:
1.回滾(rollback)操作
2.實現讀一致性與閃回查詢
3.從失敗的事務中還原資料
4. 非正常停機後的例項恢復
三.undo回滾段的特點:
1.回滾段是由例項自動建立用於支援事務執行的專用段,同樣是區和塊組成,回滾頂會按實際需要自動進行增長或收縮,是一段可以給指定事務迴圈使用的儲存緩衝區。
2.每個事務只會使用一個回滾段,一個回滾段在同一時刻可能會服務於多個事務
3.當一個事務開始的時候,會指定一個回滾段,在事務進行的過程中,當資料被修改時,原始的資料會被複制到回滾段。
4。在回滾段中,事務會不斷填充盤區,直到事務結束或所有的空間被用完,如果當前的盤區不夠用,事務會在段中請求擴充套件下一個盤區,如果所有已分配的盤區都被用完,事務會覆蓋最初的盤區或者在回滾段允許的情況下擴充套件新的盤區來使用.
5。回滾段存在於undo表空間中,在資料庫中可以存在多個undo表空間,但同一時刻只能使用一個undo表空間。
四.回滾段中的資料型別:
回滾段中的資料主要分為以下三種:
1.Uncommitted undo information; 未提交的回滾資料,該資料所關聯的事務並未提交,用於實現讀一致性,所以該資料不能被其它事務的資料所覆蓋
2.Committed undo information;已經提交但未過期的回滾資料,該資料關聯的事務已經提交,但是仍受到undo retention引數保持時間的影響
3.Expired undo information;事務已經提交,而且資料儲存時間已經超過undo retention引數指定的時間,屬於已經過期的資料
當回滾段滿了後,會優先覆蓋Expired undo information,當過期資料空間用完後,會再覆蓋Committed undo information的區域,這時undo retention引數所規定的保持時間會被破壞,Uncommitted undo information的資料是不允許覆蓋的,如果要求提交的資料在undo retention引數規定的時間內不會被覆蓋,可以在undo表空間上指定RETENTION GUARANTEE,語法如下:
ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;
五。undo資料與redo資料的區別:
1.undo記錄資料修改之前的操作,redo記錄磁碟資料將要進行的操作.
2.undo用於資料的回滾操作,和實現一致性讀,redo用於前滾資料庫操作
3.undo儲存在回滾段裡,redo儲存在重做日誌檔案裡
4.undo用於在多使用者併發的系統裡保證一致性讀,redo用於防止資料丟失
六.與undo有關的相關引數
undo_management = auto 自動的undo表空間管理
undo_tablespace = undotbs1 設定undo表空間的名稱,可以存在多個undo表空間,但同時只能使用一個
undo_retention = 900(秒) 設定快照儲存的最少時間,設定後在此時間段內仍有可能會被覆蓋
ALTER TABLESPACE UNDO_TS RETENTION GUARANTEE; 強制所有快照必須儲存 undo_retention所規定的時間。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28894640/viewspace-765521/,如需轉載,請註明出處,否則將追究法律責任。

相關文章