一 為了更清楚的看出2者差別,請看下表:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UNDO ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REDO
Record of | How to undo a change | How to reproduce a change |
Used for | Rollback, Read-Consistency | Rolling forward DB Changes |
Stored in | Undo segments | Redo log files |
Protect Against ?? | Inconsistent reads in multiuser systems ?? | Data loss |
?二 以下我們來通過實例說明undo 和 redo的關系:
1 我們將證明下面事實:
- oracle 中redo包括undo;
-?checkpoint 會導致臟數據寫入datafile;
-?buffers 會被寫入當前的undo 表空間
2 操作步驟:
3 詳細實現:
SQL> show parameter undo_tablespaceNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
- 創建Undo表空間 undotbs2:
SQL> create undo tablespace undotbs2 datafile '/u01/app/oracle/undotbs2.dbf'2 size 100m;Tablespace created.
- 創建表空間 test_undo
SQL> create tablespace test_undo datafile '/u01/app/oracle/test_undo.dbf'2 size 128k;Tablespace created.
SQL> create table test_undo_tab(txt char(1000)) tablespace test_undo;Table created.SQL> insert into test_undo_tab values ('teststring1');1 row created.SQL> insert into test_undo_tab values ('teststring2');1 row created.SQL> commit;
- 運行手工檢查點。將以上改變寫入數據文件:
SQL> alter system checkpoint;System altered.
- 設置undotbs2為當前undo表空間:
SQL> alter system set undo_tablespace=undotbs2;System altered.SQL> show parameter undo_tablespace;NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS2
- 進行日志切換使當前日志不包括字符串teststring
SQL> alter system switch logfile;System altered.
SQL> col member for a30
SQL> select member, l.status from v$log l, v$logfile f2 where l.group# = f.group#3 and l.status = 'CURRENT';MEMBER STATUS
------------------------------ ----------------
/u01/app/oracle/oradata/orcl/r CURRENT
edo02.log
SQL> update test_undo_tab set txt = 'teststring_uncommitted'2 where txt = 'teststring1';1 row updated.
SQL> update test_undo_tab set txt = 'teststring_committed'where txt = 'teststring2';commit;
[oracle@dylan ~]$ strings /u01/app/oracle/oradata/orcl/redo02.log | grep teststring
teststring_uncommitted
teststring1 teststring_committed teststring2
[oracle@dylan ~]$ strings /u01/app/oracle/test_undo.dbf | grep teststring
teststring2 teststring1
SQL> alter system checkpoint;
[oracle@dylan ~$ strings /u01/app/oracle/test_undo.dbf|grep teststringteststring_committed ,
teststring_uncommitted
[oracle@dylan ~]$ strings /u01/app/oracle/undotbs2.dbf | grep teststringteststring2
teststring1
SQL>drop tablespace test_undo including contents and datafiles;alter system set undo_tablespace=undotbs1;drop tablespace undotbs2 including contents and datafiles;
三 進一步探討:
Let’s see what will happen if undo is stored in redo logs only.
假設僅將undo信息存儲于redo logs會怎么樣?
A redo log can be reused once changes protected by it have been written to datafiles (and archivelogs if database is in archivelog mode).
It implies that if I make a change and do not commit it?
- Change is written to a redo log ?假設我改變的數據而沒提交。此時改變將記錄到redo log
- checkpoint takes place ?檢查點發生
- uncommitted change is written to datafile ?后未提交的數據寫入了數據文件
- I decide to rollback the change ?這時我打算回滾
- If redo log has not been overwritten ?假設redo log沒被覆蓋
. search entire redo log for the undo and then rollback ?那么搜素整個redo log進行回滾操作
else (redo log has been overwritten)
. undo information is not available for rollback. ? ?否則將無法回滾,undo信息已丟失!
One might argue that if somehow a redo log is not allowed to be overwritten until it contains active undo, we might be able to manage with undo stored in redo logs only. This solution is not feasible as
- size of redo logs will grow enormously large very soon as thet contain both undo and redo (a user might decide not to end a transaction for months)
- to rollback a change, enormous amount of data in redo logs (both redo and undo) will have to be searched leading to degraded performance
- there will be contention on redo logs as they are being used for both
. writing redo and undo
. reading to rollback a change?
有人或許會爭論:那就不同意redo log 覆蓋undo 信息直到包括新的undo,這樣redo log將變得異常大從而影響系統性能!
Hence, undo information has to be stored separately from redo and is used for rolling back uncommited transactions . The undo stored in undo buffers/undo tablespace is additionally used for
- read consistency ? 讀一致性
- flashback query ? ? ?閃回查詢
- flashback version query ? 閃回版本號查詢
---------------------------------------