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