您好,登錄后才能下訂單哦!
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所規定的時間。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。