標籤:redo 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所規定的時間。
undo與redo的區別