1. 程式人生 > >Oracle SCN 詳解

Oracle SCN 詳解

一、簡介

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的資料檔案)

 

資料庫重啟時,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都不會被更新。

 

 

3、datafile scn (control file)

用來跟start scn 對比,判斷start scn 是否時最新的,Oracle 在更新每個資料檔案的start scn之前會先更新控制檔案中的datafile scn ,因此控制檔案中的datafile scn總會保持最新。

 

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為空(啟動過程中)需進行例項恢復

 

三、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的資料內容。

 

 

 

 

 

 

&n