Oracle中redo與undo的作用對比講解

2021-12-30 06:43:07 字數 2418 閱讀 9732

一. 什麼是redo(用於重做資料)

redo也就是重做日誌檔案(redo log file),oracle維護著兩類重做日誌檔案:**(online)重做日誌檔案和歸檔(archived)重做日誌檔案。這兩類重做日誌檔案都用於恢復;其主要目的是,萬一例項失敗或介質失敗,它們能夠恢復資料。 由於資料庫緩衝,對磁碟資料的更新不是實時的,但是對redo日誌的更新會在commit之後確切發生。 如果在事務提交之後,磁碟資料更新之前,系統發生故障,比如斷電,系統重啟之後會將那些已經寫入redo,但是沒有更新到磁碟的資料進行重做,這樣系統就恢復到故障點之前了。 redo日誌預設3組,迴圈寫入,第一組(每個組所有成員同時寫入同樣的資訊)滿了,切換到第二個,第二個滿了切換到第三個,當所有組都寫滿之後,日誌程序再次開始寫第乙個,後面的資料覆蓋前面的資料,即為非歸檔模式。 鑑於redo如此重要,需要將已寫滿的日誌歸檔,即複製內容到其他地方,即開啟歸檔日誌模式,但是會影響系統效能。

二. 什麼是undo(用於回滾資料)

從概念上講,undo正好與redo相對。你對資料執行修改時,資料庫會生成undo資訊,這樣萬一你執行的事務或語句由於某種原因失敗了,或者如果你用一條rollback語句請求回滾,就可以利用這些undo資訊將資料放回到修改前的樣子。redo用於在失敗時重放事務(即恢復事務),undo則用於取消一條語句或一組語句的作用。 undo儲存在undo表空間中,且包含在redo日誌中。 當執行dml操作時,舊資料會寫入undo中。 事務回滾,未提交時,rollback,把undo中的舊資料重新寫回資料段中;已提交時,進行閃回(flashback)操作 ,大多都是基於undo資料實現的。讀一致性:使用者檢索資料時,oracle總是使使用者只能看到被提交過的資料(當前事務中的其他語句可以看到未提交的資料),或者特定時間點的資料(select語句時間點)。當某個使用者在此查詢點之後修改了資料,此查詢讀到這個資料時,就是通過在undo中讀取來實現的。 oracle使用scn來實現讀一致性,系統變化號(scn)是乙個資料結構,它定義了乙個給定時刻提交的資料庫版本,scn可以被認為是oracle的邏輯時鐘,每一次提交數值都要增加。

三. 對undo段的乙個誤解

通常對undo有乙個誤解,認為undo用 於資料庫物理地恢復到執行語句或事務之前的樣子,但實際上並非如此。資料庫只是邏輯地恢復到原來的樣子,所有修改都被邏輯地取消,但是資料結構以及資料庫 塊本身在回滾後可能大不相同。(比如乙個插入操作,新分配了一些資料塊。後來事務失敗,插入操作全部回滾,新分配的一些資料塊還是存在的)

原因在於:在所有多使用者系統中,可能會有數

十、數百甚至數千個併發事務。資料庫的主要功能之一就是協調對資料的併發訪問。也 許我們的事務在修改一些塊,而一般來講往往會有許多其他的事務也在修改這些塊。因此,不能簡單地將乙個塊放回到我們的事務開始前的樣子,這樣會撤銷其他人 (其他事務)的工作!

例如,假設我們的事務執行了乙個insert語句,這條語句導致分配乙個新區段(也就是說,導致表的空間增大)。通過執行這個inset,我們將得到乙個新的塊,格式化這個塊以便使用,並在其中放上一些資料。此時,可能出現另外某個事務,它也向這個塊中插入資料。如果要回滾我們的事務,顯然不能取消對這個塊的格式化和空間分配。因此,oracle回滾時,它實際上會做與先前邏輯上相反的工作。對於每個insert,oracle會完成乙個delete。對於每個delete,oracle會執行乙個insert。對於每個update,oracle則會執行乙個「反update「,或者執行另乙個update將修改前的行放回去。

所以有一種異常情況就很容易解釋了,乙個表明明只有1000行左右的資料,一條select * from table 語句可能需要耗時1,2分鐘。這張表應該是經常進行新增刪除操作的表,比如我新增了1000萬行資料,然後又將這些資料刪除。對這個表進行全表掃瞄的時候,仍然會去掃瞄這1000萬行以前所占用的那些資料塊,看看裡面是否包含資料。也就是oracle裡面所說的高水平線(hwm),這些資料塊都增加到了高水平線下面,oracle會掃瞄所有高水平線下的資料塊。

四. redo與undo如何協作保證資料完整與安全性

以乙個例子來說明一下(乙個事務包含一組sql語句):

insert into t(x,y) values(1,1);

update t set x = x+1 where x = 1;

delete from t where x = 2;

1.insert

對於第一條insert into t語句,redo和undo都會生成。所生成的undo資訊足以使insert「消失「。insert into t生成的redo資訊則足以讓這個插入」再次發生「。

這裡快取了一些已修改的undo塊、索引塊和表資料塊。這些塊得到重做日誌緩衝區中相應條目的「保護「。

假想場景一:系統現在崩潰

系統現在崩潰是沒什麼關係的。sga會被清空,但是我們並不需要sga裡的任何內容。重啟動時就好像這個事務從來沒有發生過一樣。沒有將任何已修改的塊重新整理輸出到磁碟,也沒有任何redo重新整理輸出到磁碟。我們不需要這些undo或redo資訊來實現例項失敗恢復。

假想場景二:緩衝區快取現在已滿

oracle修改redo大小

切換到過渡redo alter system switch logfile 檢視是否切換到過渡的redo select group bytes 1024 1024,status from v log 切換到新建的redo alter system switch logfile 檢視是否切換到新建的r...

Oracle之redo分析二

1.為什麼不能分配乙個新日誌檔案 在批量大量匯入資料的時候,我們可能會在伺服器端的alert.log檔案裡面看到這樣一條警告資訊 thread 1 cannot allocate new log,sequence1466 checkpoint not complete current lg 3 se...

Oracle 調整重做日誌 redo 大小

oracle 調整重做日誌 redo 大小 需求描述 oracle 預設3個50m的redo日誌,對於大量tps的系統,會出現頻繁的日誌切換,影響系統效能 解決辦法 新增3個redo日誌,並將日誌大小調整為為1g 遺留問題 修改原有redo日誌時,會出現無法刪除的問題,需要等待日誌切換時,在嘗試。檢...