redo日誌 記錄某資料塊被修改後的值,可以用來恢復未寫入data file 的已成功事物更新的資料,redo即重做
undo日誌 記錄某資料被修改前的值,可以在事物失敗時進行rollback;undo即撤銷還原。redo即redo日誌,記錄資料庫變化的日誌(區別我們常見的簡單的文字日誌,redo日誌裡面記錄的都是資料啊,表資料啊等等壓縮處理,但也很大)。
只要你修改了資料塊那麼就會記錄redo資訊,當然nologging除外了。
修改的資料塊包括:表所在資料塊(表資料塊),索引所在資料塊(索引資料塊),以及undo段所在資料塊(undo資料塊)!!
undo即undo段,是指資料庫為了保持讀一致性,儲存歷史資料在乙個位置。
為什麼要保持讀一致性?
比如有兩個使用者訪問資料庫,當然併發羅。a是更改,b是查詢。
–a更改還沒有提交,b查詢的話,資料肯定為歷史資料,這個歷史資料就是**於undo段,
–a更改未提交,需要回滾rollback,回滾rollback的資料也來至於undo段。
結論:為了併發時讀一致性成功,那麼dml操作,肯定先寫undo段。
–方向相對性:前滾,是指從「以前正常點」往前,一直到崩潰點
回滾,是指從「崩潰點」往後,一直到資料一致性
(因為前滾操作後,由於事務未提交的資料也寫入了「表資料塊」,所以要用undo資料塊進行覆蓋
–詳細解釋:
前滾:當例項崩潰時,可以使用redo從以前正常的點前滾到崩潰點。(前滾從一致性檢查點,「即當時檢查過所有的scn是全部一致的時間點」,一直往前滾到崩潰的時間點)。
當資料庫回到一致性檢查點時,相當於之後什麼都沒有發生過,資料全被清空了。(穿越了!o(∩_∩)o~)
資料庫只好根據redo模擬人的操作,使用redo裡的資訊重做(use redo log to redo),構造undo塊,表塊,索引塊等。
回滾:構造的表資料塊中,有已修改的髒資料但未提交,就需要利用前滾中構造的undo資料塊裡的資訊來undo撤銷還原,覆蓋回滾rollback羅(保持一致性啊,每種塊裡的scn號都一樣,那麼資料庫就可以開啟了)。
因為,資料在沒有commit前,是隨時從記憶體中寫入到表資料塊的,屬於髒資料。 資料庫崩潰後即使使用redo流程進行redo操作,但是髒資料還在,髒資料怎麼處理,就只能靠undo流程,使用undo資料塊的舊資料覆蓋了。
但是不管是髒的還是舊的,都在redo日誌中複製了乙份。
注意:undo是一種「資料檔案datafile」,具有表空間,當然具有塊block;
redo是一種「檔案file」,沒有表空間。
資料庫在dml事務時,先建立undo
讀一致性與一致性(scn相同)的區別
undo與rollback的區別:在undo(撤銷還原流程)中會使用rollback(回滾)這個動作
資料庫思考1 ?
1.我現在隱約感到其實資料庫中的元組或行,在資料庫內部壓根就沒有,我認為他類似於 把每乙個列都有乙個陣列或動態陣列來儲存,乙個元組有n個列,即意味著 n個陣列,不同的是這幾個陣列關聯到同乙個表上,或為同一表名附加n個指標,每乙個指標指向乙個陣列,還或者是 把乙個表看成乙個結構體。有一點是可以確定的,...
資料庫聯合查詢的思考
巴士飛揚 技術blog 昨天晚上和討論了乙個關於資料庫聯合查詢的效率的問題.說實話,以前我一直沒怎麼考慮過這個問題,在寫sql時,都沒怎麼考慮,似乎一切都成了習慣,或者已經懶散貫了,但是,和我聊起來了,我也就好好考慮起這個問題了,平時不考慮時不知道,真正好好計較一下,才發現還有很多門道.假設我們有三...
安裝oracle資料庫及匯入匯出資料庫總結
1.安裝oracle資料庫時運用安裝程式時選擇 以管理員身份執行 及 以相容模式執行 2.以管理員身份登入sqlplus 進入cmd,在命令列介面輸入sqlplus sysdba pwd as sysdba 3.建立使用者並授權 create user test identified by pass...