什麼是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只是
產生一個SCN給我們TRANSACTIONSCN簡單理解就是給TRANSACTION排隊以便恢復和保持一致性
REDO寫REDO到DISK中(LGWR這就是log file sync)記錄SCN在ONLINE REDO LOG當這一步發生時我們可以說事實上已經提交了這個TRANSACTION已經結束(在V$TRANSACTION裡消失了)
SESSION所擁有的LOCK(V$LOCK)被釋放
Block Cleanout(這個問題是產生ORA: snapshot too old的根本原因) ROLLBACK ROLLBACK和COMMIT正好相反ROLLBACK的時間和TRANSACTION的大小有直接關系因為ROLLBACK必須物理上恢復數據 COMMIT之所以快是因為ORACLE在COMMIT之前已經作了很多工作(產生UNDO修改BLOCKREDOLATCH分配) ROLLBACK慢也是基於相同的原因
UNDO表空間用於存放UNDO數據當執行DML操作時Oracle <;會將這些操作的舊數據寫入UNDO段管理UNDO數據不僅可以使用回滾段還可以使用UNDO表空間
UNDO數據的作用當用戶執行DML操作修改數據時UNDO數據被存放在UNDO段而新數據則被存放到數據段中如果事務操作存在問題就需要回退事務以取消事物變化
例如執行完UPDATE emp SET sal= WHERE empno=後發現應該修改雇員的工資而不是此時應該執行ROLLBACK語句
讀一致性
用戶檢索數據時ORACLE總是使用戶只能看到被提交過的數據這是由Oracle自動提供的當用戶修改數據但是沒有提交時另外一個用戶使用select語句查找該值時該值就是從undo表空間中取得的
事務恢復
事務恢復是例程恢復的一部分它是由Oracle Server自動完成的如果在數據庫運行過程中出線歷程失敗那麼當啟動Oracle Server時後台進程SMON會自動執行例程恢復執行例程恢復時Oracle會重做所有未應用的記錄然後打開數據庫回退未提交事務
倒敘查詢
倒敘查詢用於取得某一特定時間點的數據庫數據
UNDO_MANAGEMENT
使用初始化參數用於指定UNDO數據的管理方式如果使用自動管理模式必須設置該參數為AUTO此時采用UNDO表空間管理UNDO數據如果使用手工管理模式必須設置該值為MANUAl此時采用回滾段管理UNDO數據
UNDO_TABLESPACE
用於指定例程所要使用的UNDO表空間使用自動UNDO管理模式時通過配置該參數可以指定例程所要使用的UNDO表空間
使用RAC結構時必須為每個例程配置一個獨立的UNDO表空間
UNDO_RETENTION
該參數用於控制UNDO數據的最大保留時間其默認值為秒該值時倒敘查詢可以查看到的最早時間點
UNDO表空間上不能建立任何數據對象
From:http://tw.wingwit.com/Article/program/Oracle/201311/17025.html