redo和undo區別討論

英文解釋:

名詞:兩種流程,redo重做流程,undo撤銷還原流程;或則是redo日誌與undo段的簡稱

動詞:redo即重做,undo即撤銷還原。

翻譯有時候爲了簡單,常把動詞和名稱混用。不同場景不同的使用。

1.redo記錄了什麼:

redo即redo日誌,記錄數據庫變化的日誌(區別我們常見的簡單的文本日誌,redo日誌裏面記錄的都是數據啊,表數據啊等等壓縮處理,但也很大)。

只要你修改了數據塊那麼就會記錄redo信息,當然nologging除外了。

修改的數據塊包括:表所在數據塊(表數據塊),索引所在數據塊(索引數據塊),以及undo段所在數據塊(undo數據塊)!!

2.undo記錄了什麼:

undo即undo段,是指數據庫爲了保持讀一致性,存儲歷史數據在一個位置。

爲什麼要保持讀一致性?

比如有兩個用戶訪問數據庫,當然併發羅。A是更改,B是查詢。

--A更改還沒有提交,B查詢的話,數據肯定爲歷史數據,這個歷史數據就是來源於UNDO段,

--A更改未提交,需要回滾rollback,回滾rollback的數據也來至於UNDO段。

結論:爲了併發時讀一致性成功,那麼DML操作,肯定先寫UNDO段。

3.前滾與回滾:

--方向相對性:前滾,是指從“以前正常點”往前,一直到崩潰點

回滾,是指從“崩潰點”往後,一直到數據一致性

(因爲前滾操作後,由於事務未提交的數據也寫入了“表數據塊”,所以要用Undo數據塊進行覆蓋

--詳細解釋:

前滾:

當實例崩潰時,可以使用redo從以前正常的點前滾到崩潰點。(前滾從一致性檢查點,“即當時檢查過所有的SCN是全部一致的時間點”,一直往前滾到崩潰的時間點)。

當數據庫回到一致性檢查點時,相當於之後什麼都沒有發生過,數據全被清空了。(穿越了!O(∩_∩)O~)

數據庫只好根據redo模擬人的操作,使用redo裏的信息重做(use redo log to redo),構造undo塊,表塊,索引塊等。

回滾:

構造的表數據塊中,有已修改的髒數據但未提交,就需要利用前滾中構造的undo數據塊裏的信息來undo撤銷還原,覆蓋回滾rollback羅(保持一致性啊,每種塊裏的scn號都一樣,那麼數據庫就可以打開了)。

4.undo與redo(流程)的聯繫:

因爲,數據在沒有commit前,是隨時從內存中寫入到表數據塊的,屬於髒數據。 數據庫崩潰後即使使用redo流程進行redo操作,但是髒數據還在,髒數據怎麼處理,就只能靠undo流程,使用undo數據塊的舊數據覆蓋了。

但是不管是髒的還是舊的,都在redo日誌中複製了一份。

注意:1.undo是一種“數據文件datafile”,具有表空間,當然具有塊block;

2.redo是一種“文件file”,沒有表空間。

3.數據庫在DML事務時,先創建undo

4.讀一致性與一致性(scn相同)的區別

5.undo與rollback的區別:在undo(撤銷還原流程)中會使用rollback(回滾)這個動作



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