undo和redo(應該用不上)
redo--> undo-->datafile
insert一條記錄時, 表跟undo的信息都會放進 redo 中, 在commit 或之前, redo 的信息會放進硬盤上. 故障時, redo 便可恢復那些已經commit 了的數據.
?
redo解釋:
在Oracle數據庫中,執(zhí)行數據修改操作后,并不是馬上寫入數據文件,而是首先生成重做信息,并寫入SGA中的一塊叫LOG_BUFFER的固定區(qū)域,LOG_BUFFER的空間并不是無限大,事實上它非常小,一般設置在3~5MB左右。LOG_BUFFER有一定的觸發(fā)條件,當滿足觸發(fā)條件后,會有相應進程將LOG_BUFFER中的內容寫入一個特定類型的文件,就是傳說中的聯機重做日志文件。
undo--->記錄更改前的一份copy,但你系統(tǒng)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的原因。因為還沒有發(fā)出commit語句,但是oracle的dbwr進程已經將沒有提交的數據寫到數據文件中去了。
undo也是datafile, 可能dirty buffer 沒有寫回到磁盤里面去。
只有先redo apply 成功了,才能保證undo datafile 里面的東西都是正確的,然后才能rollback.
做undo的目的是使系統(tǒng)恢復到系統(tǒng)崩潰前(關機前)的狀態(tài),再進行redo是保證系統(tǒng)的一致性.
不做undo,系統(tǒng)就不會知道之前的狀態(tài),redo就無從談起,
所以instance crash recovery 的時候總是先rollforward, 再rollback
undo
回退段中的數據是以“回退條目”方式存儲。
回退條目=塊信息(在事務中發(fā)生改動的塊的編號)+在事務提交前存儲在塊中的數據
在每一個回退段中oracle都為其維護一張“事務表”
在事務表中記錄著與該回退段中所有回退條目相關的事務編號(事務SCN&回退條目)
一.undo中數據的特點:
1. 是數據修改前的備份,主要是保證用戶的讀一致性
2. 在事務修改數據時產生
3. 至少保存到事務結束
二.undo數據的作用:
1.回滾(rollback)操作
2.實現讀一致性與閃回查詢
3.從失敗的事務中還原數據
4. 非正常停機后的實例恢復
三.undo回滾段的特點:
1. 回滾段是由實例自動創(chuàng)建用于支持事務運行的專用段,同樣是區(qū)和塊組成,回滾頂會按實際需要自動進行增長或收縮,是一段可以給指定事務循環(huán)使用的存儲緩沖區(qū)。
2. 每個事務只會使用一個回滾段,一個回滾段在同一時刻可能會服務于多個事務
3. 當一個事務開始的時候,會指定一個回滾段,在事務進行的過程中,當數據被修改時,原始的數據會被復制到回滾段。
4. 在回滾段中,事務會不斷填充盤區(qū),直到事務結束或所有的空間被用完,如果當前的盤區(qū)不夠用,事務會在段中請求擴展下一個盤區(qū),如果所有已分配的盤區(qū)都被用完,事務會覆蓋最初的盤區(qū)或者在回滾段允許的情況下擴展新的盤區(qū)來使用.
5. 回滾段存在于undo表空間中,在數據庫中可以存在多個undo表空間,但同一時刻只能使用一個undo表空間。
四.回滾段中的數據類型:
回滾段中的數據主要分為以下三種:
1. Uncommitted undo information; 未提交的回滾數據,該數據所關聯的事務并未提交,用于實現讀一致性,所以該數據不能被其它事務的數據所覆蓋
2. Committed undo information;已經提交但未過期的回滾數據,該數據關聯的事務已經提交,但是仍受到undo retention參數保持時間的影響
3. Expired undo information;事務已經提交,而且數據保存時間已經超過undo retention參數指定的時間,屬于已經過期的數據
當回滾段滿了后,會優(yōu)先覆蓋Expired undo information,當過期數據空間用完后,會再覆蓋Committed undo information的區(qū)域,這時undo retention參數所規(guī)定的保持時間會被破壞,Uncommitted undo information的數據是不允許覆蓋的,如果要求提交的數據在undo retention參數規(guī)定的時間內不會被覆蓋,可以在undo表空間上指定RETENTION GUARANTEE,語法如下:
? ? ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;
五.undo數據與redo數據的區(qū)別:
1. undo記錄數據修改之前的操作,redo記錄磁盤數據將要進行的操作.
2. undo用于數據的回滾操作,和實現一致性讀,redo用于前滾數據庫操作
3. undo存儲在回滾段里,redo存儲在重做日志文件里
4. undo用于在多用戶并發(fā)的系統(tǒng)里保證一致性讀,redo用于防止數據丟失
六.與undo有關的相關參數
undo_management = auto 自動的undo表空間管理
undo_tablespace = undotbs1 設置undo表空間的名稱,可以存在多個undo表空間,但同時只能使用一個
undo_retention = 900(秒) 設置快照保存的最少時間,設置后在此時間段內仍有可能會被覆蓋
ALTER TABLESPACE UNDO_TS RETENTION GUARANTEE; 強制所有快照必須保存 undo_retention所規(guī)定的時間。
redo
重做記錄由一組“變更向量”組成。
每個變更變量中記錄了事務對數據庫中某個塊所做的修改。
當用戶提交一條commit語句時,LGWR進程會立刻將一條提交記錄寫入到重做日志文件中,然后再開始寫入與該事務相關的重做信息。
事務提交成功后,Oracle將為該事務生成一個系統(tǒng)變更碼(SCN)。事務的SCN將同時記錄在它的提交記錄和重做記錄中。
commit
提交事務前完成的工作:
·在SGA區(qū)的回退緩存中生成該事務的回退條目。在回退條目中保存有該事務所修改的數據的原始版本。
·在SGA區(qū)的重做日志緩存中生成該事務的重做記錄。重做記錄中記載了該事務對數據塊所進行的修改,并且還記載了對回退段中的數據塊所進行的修改。緩存中的重做記錄有可能在事務提交之前就寫入硬盤中。
·在SGA區(qū)的數據庫緩豐中記錄了事務對數據庫所進行的修改。這些修改也有可能在事務提交之前就寫入硬盤中。
提交事務時完成的工作:
1. 在為該事務指定的回退段中的內部事務表內記錄下這個事務已經被提交,并且生成一個惟一的SCN記錄在內部事務表中,用于惟一標識這個事務。
2. LGWR后進進程將SGA區(qū)重做日志緩存中的重做記錄寫入聯機重做日志文件。在寫入重做日志的同時還將寫入該事務的SCN。
3. Oracle服務進程釋放事務所使用的所有記錄鎖與表鎖。
4. Oracle通知用戶事務提交完成。
5. Oracle將該事務標記為已完成。
rollback
回退事務完成的工作:
1. Oracle通過使用回退段中的回退條目,撤銷事務中所有SQL語句對數據庫所做的修改。
2. Oracle服務進程釋放事務所使用的所有鎖
3. Oracle通知事務回退成功。
4. Oracle將該事務標記為已完成
舉個例子:
insert into a(id) values(1);(redo)
這條記錄是需要回滾的。
回滾的語句是delete from a where id = 1;(undo)
試想想看。如果沒有做insert into a(id) values(1);(redo)
那么delete from a where id = 1;(undo)這句話就沒有意義了。
現在看下正確的恢復:
先insert into a(id) values(1);(redo)
然后delete from a where id = 1;(undo)
系統(tǒng)就回到了原先的狀態(tài),沒有這條記錄了
undo表空間與redo日志文件在oracle中的作用非常重要,undo回滾段的作用與特點,同時簡單介紹undo與redo的區(qū)別和各自己的作用。
一、undo中數據的特點:
1. 是數據修改前的備份,主要是保證用戶的讀一致性(為了實現這種功能,類似Redo,Oracle用Undo來記錄前備份信息,insert、update、delete的相關信息記錄在Undo表空間的回滾段內;記錄的信息量,insert最少只需添加記錄的rowid、update其次記錄所修改的舊值,delete最多記錄所刪除記錄的整行數據;如一事務的修改還未提交,另一事務所查詢的數值會由Undo信息提供)
2. 在事務修改數據時產生
3. 至少保存到事務結束
二、undo數據的作用:
1. 回滾(rollback)操作
2. 實現讀一致性與閃回查詢
3. 從失敗的事務中還原數據
4. 非正常停機后的實例恢復
三、undo回滾段的特點:
1. 回滾段是由實例自動創(chuàng)建用于支持事務運行的專用段,同樣是區(qū)和塊組成,回滾頂會按實際需要自動進行增長或收縮,是一段可以給指定事務循環(huán)使用的存儲緩沖區(qū)
2. 每個事務只會使用一個回滾段,一個回滾段在同一時刻可能會服務于多個事務
3. 當一個事務開始的時候,會指定一個回滾段,在事務進行的過程中,當數據被修改時,原始的數據會被復制到回滾段
4. 在回滾段中,事務會不斷填充盤區(qū),直到事務結束或所有的空間被用完,如果當前的盤區(qū)不夠用,事務會在段中請求擴展下一個盤區(qū),如果所有已分配的盤區(qū)都被用完,事務會覆蓋最初的盤區(qū)或者在回滾段允許的情況下擴展新的盤區(qū)來使用
5. 回滾段存在于undo表空間中,在數據庫中可以存在多個undo表空間,但同一時刻只能使用一個undo表空間
四、回滾段中的數據類型:
回滾段中的數據主要分為以下三種:
1. Uncommitted undo information; 未提交的回滾數據,該數據所關聯的事務并未提交,用于實現讀一致性,所以該數據不能被其它事務的數據所覆蓋
2. Committed undo information;已經提交但未過期的回滾數據,該數據關聯的事務已經提交,但是仍受到undo retention參數保持時間的影響
3. Expired undo information;事務已經提交,而且數據保存時間已經超過undo retention參數指定的時間,屬于已經過期的數據
當回滾段滿了后,會優(yōu)先覆蓋Expired undo information,當過期數據空間用完后,會再覆蓋Committed undo information的區(qū)域,這時undo retention參數所規(guī)定的保持時間會被破壞,Uncommitted undo information的數據是不允許覆蓋的,如果要求提交的數據在undo retention參數規(guī)定的時間內不會被覆蓋,可以在undo表空間上指定RETENTION GUARANTEE,語法如下:
ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE
五、undo數據與redo數據的區(qū)別:
1. undo記錄數據修改之前的操作(記錄在回滾段中),redo記錄磁盤數據將要進行的操作
2. undo用于數據的回滾操作,和實現一致性讀,redo用于前滾數據庫操作
3. undo存儲在回滾段里,redo存儲在重做日志文件里
4. undo用于在多用戶并發(fā)的系統(tǒng)里保證一致性讀,redo用于防止數據丟失
六、與undo有關的相關參數
undo_management = auto 自動的undo表空間管理
undo_tablespace = undotbs1 設置undo表空間的名稱,可以存在多個undo表空間,但同時只能使用一個
undo_retention = 900(秒) 設置快照保存的最少時間,設置后在此時間段內仍有可能會被覆蓋
ALTER TABLESPACE UNDO_TS RETENTION GUARANTEE; 強制所有快照必須保存undo_retention所規(guī)定的時間