ORACLE UNDO和REDO

什麼是REDO
  REDO記錄transaction logs,分爲onlinearchived。以恢復爲目的。
  比如,機器停電,那麼在重起之後需要online redo logs去恢復系統到失敗點。
  比如,磁盤壞了,需要用archived redo logsonline redo logs區恢復數據。
  比如,truncate一個表或其他的操作,想恢復到之前的狀態,同樣也需要。
什麼是UNDO
  REDO 是爲了重新實現你的操作,而UNDO相反,是爲了撤銷你做的操作,比如你得一個TRANSACTION執行失敗了或你自己後悔了,則需要用 ROLLBACK命令回退到操作之前。回滾是在邏輯層面實現而不是物理層面,因爲在一個多用戶系統中,數據結構,blocks等都在時時變化,比如我們 INSERT一個數據,表的空間不夠,擴展了一個新的EXTENT,我們的數據保存在這新的EXTENT裏,其它用戶隨後也在這EXTENT裏插入了數據,而此時我想ROLLBACK,那麼顯然物理上講這EXTENT撤銷是不可能的,因爲這麼做會影響其他用戶的操作。所以,ROLLBACK是邏輯上回滾,比如對INSERT來說,那麼ROLLBACK就是DELETE了。
  COMMIT 以前,常想當然地認爲,一個大的TRANSACTION(比如大批量地INSERT數據)COMMIT會花費時間比短的TRANSACTION長。而事實上是沒有什麼區別的,
  因爲ORACLECOMMIT之前已經把該寫的東西寫到DISK中了,
  我們COMMIT只是
  1,產生一個SCN給我們TRANSACTIONSCN簡單理解就是給TRANSACTION排隊,以便恢復和保持一致性。
  2REDOREDODISK(LGWR,這就是log file sync),記錄SCNONLINE REDO LOG,當這一步發生時,我們可以說事實上已經提交了,這個TRANSACTION已經結束(V$TRANSACTION裏消失了)
  3SESSION所擁有的LOCK(V$LOCK)被釋放。
  4Block Cleanout(這個問題是產生ORA-01555: snapshot too old的根本原因) ROLLBACK ROLLBACKCOMMIT正好相反,ROLLBACK的時間和TRANSACTION的大小有直接關係。因爲ROLLBACK必須物理上恢復數據。 COMMIT之所以快,是因爲ORACLECOMMIT之前已經作了很多工作(產生UNDO,修改BLOCKREDOLATCH分配) 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所規定的時間。

發佈了6 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章