Oracle-例項恢復
例項恢復(crash recover)
定義
當資料庫突然崩潰,而沒有來得及將buffer cache中的髒資料刷寫入資料檔案中,例項崩潰的同時正在執行的事務被突然中斷,事務處於中間狀態,這樣導致資料庫是不一致的狀態。
當企圖開啟一個處於不一致狀態的資料庫時,smon程序自動會進行例項恢復。SCN號作為不一致狀態的評判標準依據。
乾淨關閉資料庫或使用alter system checkpoint
命令時,都會將SCN的值寫入到4個位置上。兩兩比較,若任意一個不相等都會進行例項恢復。
system change number(SCN)記錄位置
- 控制檔案
- system checkpoint SCN
- datafile checkpoint SCN
- stop SCN
- 資料檔案頭
查詢SCN號
--system checkpoint SCN 查詢 select checkpoint_change# from v$database; --datafile checkpoint SCN查詢 select name,checkpoint_change# from v$datafile; --stop SCN查詢 select name,last_change# from v$datafile; -- datafile header SCN select name,checkpoint_change# from v$datafile_header;
檢查點(checkpoint)
檢查點是資料庫的一個事件,用於減少崩潰恢復時間。
由後臺程序觸發,觸發時ckpt程序通知dbwn程序將資料緩衝區的髒資料寫入到資料檔案。ckpt程序同時負責更新資料檔案的頭部資訊及控制檔案上的檢查點資訊
觸發檢查點條件
例項恢復發生的時間
在open階段觸發例項恢復。
alter database open;
此時,檢查控制檔案,資料檔案,判斷是否需要進行例項恢復。
例項恢復的過程
前滾->檢查->回滾
前滾(Rolling forward)
應用redo資料(資料塊修改)直到關閉前為止,重演已修改的資料,保證資料不丟失。
SMON 例項恢復時,會從控制檔案中找到每3秒觸發的增量檢查點,檢查點佇列的第一個髒資料塊檢查點所對應的RBA地址,於是,smon程序到聯機檔案中找到該檢查點RBA地址,然後從該位置開始往下應用,應用所有的redo 條目到ON DISK RBA(檢查點佇列的最後一個RBA) 就是聯機日誌檔案的最後一條redo。從而buffer cache 裡又恢復了例項崩潰那個時間的狀態。這個過程叫前滾
開啟資料庫
前滾完畢後,smon程序立即開啟資料庫。
回滾(Rolling back)
將undo段中所有未提交的資料回滾,保持資料一致。回滾是在開啟資料庫之後進行的。
例項恢復所需要的時間
例項恢復所需的時間指的是將資料檔案由其最後一個檢查點返回到控制檔案中記錄的最新SCN所需的時間。可以通過設定MTTR(Mean Time To Recovery)目標 (以秒為單位)並通過重做日誌組的大小可控制這個時間。
FAST_START_MTTR_TARGET