undo與redo的區別

undo:撤銷,也就是取消之前的操作。

 redo:重做,重新執行一遍之前的操作。

什麼是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了。




一.undo中數據的特點:

1。是數據修改前的備份,主要是保證用戶的讀一致性

2. 在事務修改數據時產生

3。至少保存到事務結束


二。undo數據的作用:

1.回滾(rollback)操作

2.實現讀一致性與閃回查詢

3.從失敗的事務中還原數據

4. 非正常停機後的實例恢復


三.undo回滾段的特點:

1.回滾段是由實例自動創建用於支持事務運行的專用段,同樣是區和塊組成,回滾頂會按實際需要自動進行增長或收縮,是一段可以


給指定事務循環使用的存儲緩衝區。

2.每個事務只會使用一個回滾段,一個回滾段在同一時刻可能會服務於多個事務

3.當一個事務開始的時候,會指定一個回滾段,在事務進行的過程中,當數據被修改時,原始的數據會被複制到回滾段。

4。在回滾段中,事務會不斷填充盤區,直到事務結束或所有的空間被用完,如果當前的盤區不夠用,事務會在段中請求擴展下一個盤


區,如果所有已分配的盤區都被用完,事務會覆蓋最初的盤區或者在回滾段允許的情況下擴展新的盤區來使用.

5。回滾段存在於undo表空間中,在數據庫中可以存在多個undo表空間,但同一時刻只能使用一個undo表空間。



四.回滾段中的數據類型:

回滾段中的數據主要分爲以下三種:

1.Uncommitted undo information; 未提交的回滾數據,該數據所關聯的事務並未提交,用於實現讀一致性,所以該數據不能被其它


事務的數據所覆蓋

2.Committed undo information;已經提交但未過期的回滾數據,該數據關聯的事務已經提交,但是仍受到undo retention參數保持時


間的影響

3.Expired undo information;事務已經提交,而且數據保存時間已經超過undo retention參數指定的時間,屬於已經過期的數據

當回滾段滿了後,會優先覆蓋Expired undo information,當過期數據空間用完後,會再覆蓋Committed undo information的區域,


這時undo retention參數所規定的保持時間會被破壞,Uncommitted undo information的數據是不允許覆蓋的,如果要求提交的數據


在undo retention參數規定的時間內不會被覆蓋,可以在undo表空間上指定RETENTION GUARANTEE,語法如下:

ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;



五。undo數據與redo數據的區別:



redo--> undo-->datafile

insert一條記錄時, 表跟undo的信息都會放進 redo 中, 在commit 或之前, redo 的信息會放進硬盤上. 故障時, redo 便可恢復那些


已經commit 了的數據.


redo->每次操作都先記錄到redo日誌中,當出現實例故障(像斷電),導致數據未能更新到數據文件,則數據庫重啓時須redo,重新


把數據更新到數據文件

undo->記錄更改前的一份copy,但你係統rollback時,把這份copy重新覆蓋到原來的數據


redo->記錄所有操作,用於恢復(redo records all the database transaction used for recovery)

undo->記錄所有的前印象,用於回滾(undo is used to store uncommited data infor used for rollback)


redo->已遞交的事務,實例恢復時要寫到數據文件去的

undo->未遞交的事務.


redo的原因是:每次commit時,將數據的修改立即寫到online redo中,但是並不一定同時將該數據的修改寫到數據文件中。因爲該數


據已經提交,但是隻存在聯機日誌文件中,所以在恢復時需要將數據從聯機日誌文件中找出來,重新應用一下,使已經更改數據在數


據文件中也改過來!


undo的原因是:在oracle正常運行時,爲了提高效率,假如用戶還沒有commit,但是空閒內存不多時,會由DBWR進程將髒塊寫入到數據


文件中,以便騰出寶貴的內存供其它進程使用。這就是需要UNDO的原因。因爲還沒有發出commit語句,但是oracle的dbwr進程已經將


沒有提交的數據寫到數據文件中去了。


undo 也是datafile, 可能dirty buffer 沒有寫回到磁盤裏面去。

只有先redo apply 成功了,才能保證undo datafile 裏面的東西都是正確的,然後才能rollback


做undo的目的是使系統恢復到系統崩潰前(關機前)的狀態,再進行redo是保證系統的一致性.

不做undo,系統就不會知道之前的狀態,redo就無從談起



六.與undo有關的相關參數

undo_management = auto 自動的undo表空間管理

undo_tablespace = undotbs1 設置undo表空間的名稱,可以存在多個undo表空間,但同時只能使用一個

undo_retention = 900(秒) 設置快照保存的最少時間,設置後在此時間段內仍有可能會被覆蓋

ALTER TABLESPACE UNDO_TS RETENTION GUARANTEE; 強制所有快照必須保存 undo_retention所規定的時間。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章