redo(重做信息)是 Oracle 在在線(或歸檔)重做日志文件中記錄的信息,用于重做事務;undo(撤銷)是 oracle 在 undo 段中記錄的信息,用于取消或回滾事務。
undo 操作數(shù)據(jù)庫只是邏輯的恢復到原來的樣子,但數(shù)據(jù)結構以及數(shù)據(jù)塊本身在回滾后可以大不相同。這樣做的原因是同時可能會有多個并發(fā)的事務。
盡管 undo 信息存儲在 undo 表空間或 undo 段中,但也會受到 redo 的保護。換句話說,會把 undo 數(shù)據(jù)當成是表數(shù)據(jù)或索引數(shù)據(jù)一樣,對 undo 的修改會生成一些 redo 并記入日志。
-
Oracle 的事務提交是一個非?斓牟僮,不論事務有多大,COMMIT 的響應時間都差不多。因為在提交之前已經(jīng)完成了99.9%工作,例如已經(jīng)發(fā)生了如下操作:
a、已經(jīng)在 SGA 中生成了 undo 塊
b、已經(jīng)在 SGA 中生成了已修改的數(shù)據(jù)塊
c、已經(jīng)在 SGA 中生成了對應前兩項的緩存 redo
d、取決于前三項的大小,以及這些工作花費的時間,前面的某些數(shù)據(jù)可能已經(jīng)刷新輸出到磁盤
e、已經(jīng)得到了所需的全部鎖
執(zhí)行 COMMIT 時,余下的工作只是
a、為事務生成一個 SCN。它是 Oracle 使用的一種簡單的計時機制,用于保證事務的順序,并支持失敗恢復。它還用于保證數(shù)據(jù)庫中的讀一致性和檢查點。
b、LGWR 將所有余下的緩存重做日志條目寫至磁盤,并把 SCN 記錄到在線重做日志文件中。這一小是真正的 COMMIT。之后事務條目為從 V$TRANSACTION 中“刪除”。
c、V$LOCK 中記錄著我們的會話持有鎖,這些鎖都將被釋放,而排隊等待這些鎖的每一個人都會被喚醒,可以繼續(xù)完成他們的工作。
d、如果事務修改的某些塊還在緩沖區(qū)中,則會清除存儲在數(shù)據(jù)庫塊首部與鎖相關的信息。
相反 ROLLBACK 時要做以下工作:
a、撤銷已做的所有修改。從 undo 段讀回數(shù)據(jù),然后實際上逆向執(zhí)行前面所做的操作,并將 undo 條目標記為已用。
b、會話持有的所有鎖都將釋放,如果有人在排隊等待我們持有的鎖,就會被喚醒。
減少重做日志的生成:
a、在 SQL 中設置 NOLOGGING。這并不是說這個對象的所有操作在執(zhí)行時都不生成重做日志,只是說有些特定的操作生成的 redo 會比平常少得多。
b、在索引上設置 NOLOGGING。在段(索引或表)上設置 NOLOGGING 屬性,從而隱式的采用 NOLOGGING 模式來執(zhí)行操作。
c、可以采用 NOLOGGING 模式執(zhí)行以下操作:
1、索引的創(chuàng)建和 ALTER。例如 create index t_idx on t(name) nologging ,alter index t_idx nologging,alter index t_idx rebuild
2、表的批量 INSERT 。表數(shù)據(jù)不生成 redo,但是所有的索引修改會生成 redo。
3、LOB 操作(對大對象的更新不必生成日志)。
4、通過 CREATE TABLE AS SELECT 創(chuàng)建表。
5、各種 ALTER TABLE 操作,如 MOVE 和 SPLIT。
塊清除:即刪除所修改數(shù)據(jù)庫塊上與“鎖定”有關的信息。后面提到 ORA-01555:snapshot too old 會用到這個概念。
數(shù)據(jù)鎖實際上是數(shù)據(jù)的屬性,存儲在塊首部。下次訪問這個塊時,就要將這些事務信息刪除,這個動作會生成 redo,并導致塊變臟,也就是說 SELECT 可能也會生成 redo 并將塊刷新至磁盤。
如果塊在還在緩沖區(qū)中,那么 COMMIT 時會清除,這樣后面的 SELECT 就不必再清理了。只有塊的 UPDATE 才會真正清除殘余的事務信息,由于 UPDATE 時已經(jīng)生成 redo,所以注意不到清除工作。
臨時表不會為它們的塊生成 redo,但會生成 undo,而且這個 undo 為記入日志。
INSERT 會生成很少甚至不生成 undo/redo 活動。因為生成的 undo 很少,Oracle 只需要記錄要刪除的 rowid。
DELETE 在臨時表上生成的 redo 與在正常表上生成的 redo 同樣多,因它的 undo 很大,需要把整行的前映像記錄到 undo 段中。
臨時表的 UPDATE 會生成正常表一半的 redo,對于臨時表來說不必保存“后映像”(redo)。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO //自動 undo 管理
undo_retention integer 900 // undo 保留的時間
undo_tablespace string UNDOTBS1 // undo 存儲表空間
本文出自:億恩科技【1tcdy.com】
服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|