Oracle Undo Redo(轉)

Oracle Undo Redo(轉)

轉貼:

http://www.cuug.com/xueyuanzhuanqu/jishuwenzhang/201108/jishuwenzhang-245.html

http://paul0407.blogspot.tw/2008/01/oracle-redoundorollback-segment.html

http://blog.csdn.net/robinson_0612/article/details/5731158

Oracle Undo Redo

Redo

redo 記錄 transaction logs,分為 online 和 archived。以恢復為目的。
比如,機器停電,那麼在重起之後需要 online redo logs 去恢復系統到失敗點。
比如,磁盤壞了,需要用 archived redo logs 和 online redo logs 區恢復數據。
比如,truncate 一個表或其他的操作,想恢復到之前的狀態,同樣也需要。

 

Redo就是重作,當我們使用DML指令(Update、Delete、Insert)對資料進行修改後,Oracle會將我們對資料修改的操作及資料本身寫入Redo Log Buffer,Oracle會找適當的時機(*註1)將Redo Log Buffer內的東西寫入Redo Log Files,由於Redo Log Files是循環寫入的,所以在異動頻繁的狀態下會很快被蓋掉,如果想要將這些異動的記錄保留下來,就請開啟Oracle Archiving Mode,這樣Oracle作Log Switch時,就會將Redo Log Files內容另存一份成為Archive Log Files


Undo
redo 是為了重新實現你的操作,而 undo 相反,是為了撤銷你做的操作,比如一個 transaction 執行失敗了或你自己後悔了,則需要用 rollback 命令回退到操作之前。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 和 commit 正好相反,rollback 的時間和 transaction 的大小有直接關係。因為 rollback 必須物理上恢復數據。commit 之所以快,是因為 oracle 在 commit 之前已經作了很多工作(產生 undo,修改 block,redo,latch 分配),rollback 慢也是基於相同的原因。
  •  undo 表空間 用於存放 undo 數據。當執行DML操作時,Oracle 會將這些操作的舊數據寫入 undo 段。管理 undo 數據不僅可以使用回滾段,還可以使用 undo 表空間。
  • undo 數據的作用:當用戶執行 DML 操作修改數據時,undo 數據被存放在 undo 段,而新數據則被存放到數據段中,如果事務操作存在問題,就需要回退事務,以取消事物變化。
    例如:執行完 “UPDATE emp SET sal=1000 WHERE empno=7788” 後,發現應該修改僱員7963的工資,而不是7788.此時應該執行 rollback 語句。
  • 讀一致性
    用戶檢索數據時,oracle 總是使用戶只能看到被提交過的數據,這是由 Oracle 自動提供的。當用戶修改數據,但是沒有提交時,另外一個用戶使用 select 語句查找該值時,該值就是從 undo 表空間中取得的。
  • 事務恢復
    事務恢復是例程恢復的一部分,它是由 Oracle Server 自動完成的。如果在數據庫運行過程中出線歷程失敗,那麼當啟動OracleServer時,後台進程 SMON 會自動執行例程恢復。執行例程恢復時,Oracle會重做所有未應用的記錄。然後打開數據庫,回退未提交事務。
  • 倒敘查詢
    倒敘查詢用於取得某一特定時間點的數據庫數據。
  • undo_management
    使用初始化參數用於指定 undo 數據的管理方式。如果使用自動管理模式,必須設置該參數為 auto,此時採用 undo 表空間管理 undo數據;如果使用手工管理模式,必須設置該值為 manual,此時採用回滾段管理 undo 數據。
  • undo tablespace
    用於指定例程所要使用的 undo 表空間。使用自動 undo 管理模式時,通過配置該參數可以指定例程所要使用的 undo 表空間。
    使用 RAC 結構時,必須為每個例程配置一個獨立的 undo 表空間。
  • undo_retention
    該參數用於控制 undo 數據的最大保留時間,其默認值為900秒,該值時倒敘查詢可以查看到的最早時間點。
  • undo 表空間上不能建立任何數據對象。

 

Undo就是取消之前作的,8i以前(含8i)的Rollback Segment,在9i改叫Undo Segment;當我們進行交易時,Oracle會利用Undo Segment來存放異動前後的資料,在交易未Commit前,其他使用者可以在這裡查詢舊資料,如果交易失敗或取消,Oracle就可以很快的將由回復原先的資料,在9i提供了Flashback Query可以讓我們查詢交易Commit以前的資料(能查多久以前的資料?看Undo Tablespace有多大、UNDO_RETENTION設多少),到了10g,我們甚至可以回復已經Commit的交易(利用Flashback Query中的Undo SQL指令)。

 

Undo(9i之後稱) = rollback(9i之前稱)
差異差在 9i 之後的 Undo 有 ASM (系統自動管理UNDO)
早期的 rollback 空間是要自已設定,不足時就會完蛋,
後期交由Oracle管理。
之所以他要你保留是因為在早期,有很多人的Code會下指令
指定rollback之後下SQL,當有比較大的SQL時就用比較大的
rollback空間,如果你不延用,程式很有可能需要大改,
如果你的SQL並未指定rollback,這就沒差了。