一、簡介
scn,system change number 在某個時間點定義數據庫已提交版本的時間戳標記,Oracle為每個已提交事務分配一個唯一的scn,scn值是對數據庫進行更改的邏輯時間點。scn是一個6字節的數字,分為兩部分,scn_base和scn_wrap,scn_base是一個四字節的數字,scn_wrap是一個2字節的數字。scn_base到達最大值時,scn_wrap增加1,scn_base將被重置為0,一直持續到scn_wrap達到最大值。scn分為以下幾種:
二、check point scn
1、start scn(datafile_header)
當檢查點發生或者實力關閉時,所有緩存數據需要全部寫入到數據文件中,此時數據庫文件中的各個start scn更新到一致。Oracle啟動時先檢查是否需要media recovery,若數據文件中各個start scn不一致,出現某個start scn較小,說明該文件較舊(被替換成老文件或者未及時更新),此時需要手動進行redo介質恢復。
select checkpoint_change# from v$datafile_header;
2、stop scn (又稱end scn,control file)
實例正常關閉時,將會觸發checkpoint,同時執行完全檢查點,並用該檢查點時的scn號更新四個scn,這時所有數據文件的stop scn都設置為數據文件頭的start scn (除了offline 和read only的數據文件)
3、datafile scn (control file)
用來跟start scn 對比,判斷start scn 是否時最新的,Oracle 在更新每個數據文件的start scn之前會先更新控制文件中的datafile scn ,因此控制文件中的datafile scn總會保持最新。
select file#,checkpoint_change# from v$datafile;
4、system checkpoint scn(control file )
用來判斷控制文件是否是最新的,與start scn對比,若system checkpoint scn 較舊,則需對控制文件進行介質恢復
異常1:start scn不一致------某個數據文件舊,介質恢復
異常2:system scn=datafile scn 控制文件舊,介質恢復
異常3:system scn=datafile scn > start scn 數據文件舊,介質恢復
異常4:stop scn為空(啟動過程中)需進行實例恢復
select checkpoint_change# from v$database;
數據庫重啟時,Oracle將數據文件頭中的start scn和datafile scn比較,如果兩者匹配,Oracle接下來比較start scn 和stop scn,如果匹配,數據庫不需要實例恢復,直接打開;所有數據文件打開后,online 且 read write的數據文件stop scn再次被設置為null,表示數據文件已經打開並且能夠正常使用了。有些表空間時read only,這時,system checkpoint scn會不斷增長,而start scn和datafile scn停止更新,直到表空間設為可讀寫,這時,system checkpoint scn會大於start scn和datafile scn。
數據庫非正常關閉(實例崩潰),stop scn不會被設置,依然為null,數據庫啟動到mount時可以查詢出來。重啟時,smon進程會執行實例恢復,進行前滾,打開數據庫、回滾。
數據文件介質故障,datafile scn及system checkpoint scn 比start scn大。介質故障時,數據文件被以前的備份代替,datafile scn肯定比start scn大,Oracle此時進行介質恢復。
控制文件介質故障,system checkpoint scn 及datafile scn 比start scn小,在數據庫恢復時,control file可能不是最新的,把一個較早的控制文件還原為當前的控制文件,然后執行恢復操作,這時control file 中的system checkpoint scn和datafile scn 可能比start scn小。這時,恢復數據庫用:recover database using backup controlfile 或其他。
備份時的實例崩潰,當執行begin backup 時,實例崩潰:control file中的datafile scn和start scn相同,但是每個可讀寫的在線數據文件之間的檢查點scn不同,那就要求介質恢復。
日志切換或者checkpoint,當日志切換或發生checkpoint時,從Low SCN到Next SCN之間的所有redo記錄的數據就被DBWn進程寫入數據文件中,而CKPT進程則將所有數據文件(無論redo log中的數據是否影響到該數據文件)的文件頭上記錄的Start SCN(通過視圖v$datafile_header的字段checkpoint_change#可以查詢)更新為Next SCN,同時將控制文件中的System Checkpoint SCN(通過視圖v$database的字段checkpoint_change#可以查詢)、每個數據文件對應的Datafile Checkpoint(通過視圖v$datafile的字段checkpoint_change#可以查詢)也更新為Next SCN。但是,如果該數據文件所在的表空間被設置為read-only時,數據文件的Start SCN和控制文件中Datafile Checkpoint SCN都不會被更新。
三、system current scn
Sql>select current_scn from v$database;
Sql>select scn_to_timestamp(4788376) from dual;
Sql>select timestamp_to_scn(sysdate) from dual; (scn與自然時間的轉換,若一個自然時間對應多個scn,則轉換時取最小scn)
四、redolog scn (archive log)
redo log中的high scn和low scn
Oracle的Redo log會順序紀錄數據庫的各個變化。一組redo log文件寫滿后,會自動切換到下一組redo log文件。則上一組redo log的high scn就是下一組redo log的low scn。在current log中high scn為無窮大。
可通過查詢v$log_history查看 low scn和 high scn。
a.Low scn(開始寫一組日志時,會在該日志中記錄當前SCN)
b.Last redo scn(日志文件被更新時,會記錄當前scn反映日志更新進度)
c. Thread closed scn(未切換日志組時關閉數據庫時,記錄當前SCN)
d. nexto scn (切換日志組時,在當前日志文件中記錄,並作為下一組日志文件的Low scn)
五、block scn
在數據塊中記錄塊被修改的scn,用來保證一致性讀(consistent read),在一項查詢事務進行過程中(假設查詢比較長),若在此過程中對數據塊進行了修改(不管提交與否),都不會影響在數據修改之前發起的查詢事務。即服務進程會去回滾段上讀取block scn小於 發起查詢時刻scn的數據內容。