龍神add-走向資料架構師的路
可以重構回滾崩潰時正在進行的事務所需的撤銷資訊。
例如:
使用者jon啟動了一個事務,jon更新某個表的一行,其伺服器則將舊值複製至一個撤銷
段。在資料庫緩衝區快取中完成這些更新之前,伺服器程序將變更寫入日誌緩衝區。
使用者roop也啟動一個事務,兩個使用者都未提交事務,也沒有在磁碟上寫下任何資料。
如果此時例項崩潰,那麼不存在與任一個事務相關的記錄。因此,兩個事務都不會被
恢復。但這並不是一個問題。因為沒有提交,所以不應當恢復這兩個事務。
隨後,使用者jon提交了自己的事務。這個提交操作會觸發LGWR程序將日誌緩衝區中的
內容重新整理到聯機重做日誌檔案,也就是說,此時重做日誌檔案記憶體在jon和roop的事
務對錶和撤銷段的更改以及針對jon的事務的提交記錄。只有在LGWR程序結束
後,"commit complete"訊息才會被返回給jon的使用者程序。但是,資料檔案中仍然不
會寫入任何資料。如果此時例項失敗,那麼前滾階段會重新構造這兩個事務,不過處
理完所有重做後仍然不會得到針對roop的更新操作的提交記錄,這將通知smon程序回
滾roop所作的變更,同時保留jon所作的變更。
如果DBWn程序在例項崩潰前將某些資料塊寫入磁碟,那麼將會出現什麼情況呢?
jon可能頻繁的重新查詢與其相關的資料,而roop對資料進行了未提交的更改,並且
不再檢視這些資料。因此,DBWn程序將確定在磁碟上有限寫入roop所做的變更,然後
再寫入jon所作的變更。DBWn程序總是會在磁碟上先寫入不活躍的資料塊,然後再寫
入活躍的資料塊。此時,資料檔案中儲存了roop沒提交的事務,但是丟失了jon的已
提交事務。
不過即使此時例項崩潰,前滾仍然可以解決這個問題。重做流中始終存在重新構建已
提交變更所需的足夠資訊。因為提交操作在DBWn程序完成寫入之前不會結束。不過,
因為LGWR程序將所有資料塊的所有變更都寫至了日誌檔案,因此日誌檔案中也將存在
重新構建撤銷段所需的足夠資訊,從而能夠回滾roop未提交的事務。
因此,綜上:因LGWR程序總是先於DBWn程序進行寫操作,並且在提交的同時進
行實時的寫操作。因此在重做流中始終存在足夠的資訊,從而能夠重新構建任何已提
交的未被寫入資料檔案的變更以及回滾任何已被寫入資料檔案的未提交變更。
只要沒有物理損壞,重做和回滾這種例項恢復機制就可以使Oracle資料庫絕對不被損
壞。
(注:執行shutdown abort命令不會損壞資料庫..)