SCN是當Oracle資料更新後,由DBMS自動維護去累積遞增的一個數字。 當一個交易commit時,LGWR會將log buffer寫入redo log file,同時也會將該筆交易的 SCN同步寫入到redo log file內(wait-until-completed)。因此當你commit transaction時, 在交易成功的訊息返回之前,LGWR必須先完整的完成上述行為之後,否則你是看不到提交成功的回應訊息。
我們可以查詢目前系統最新的SCN
select dbms_Flashback.get_system_change_number from dual;
可以理解的,這裡返回的SCN,也是目前redo log file最新的SCN紀錄。 因為commit後的交易才會有SCN,而一旦commit就會立刻寫入redo log file中。
CHECKPOINT 和 SCN 的關連
checkpoint發生的目的就是要把儲存在buffer內的已提交交易寫回disk,否則一旦發生crash,需要 進行recovery時,你就必須花很多的時間從redo log file內最後的SCN交易開始進行recovery,這樣 在商業應用上是很浪費時間和沒有效率的。
重點在於當commit一個交易時,只會立刻將redo buffer寫入redo log file內,但是並不會馬上將 該update後的block(dirty block)同步寫回disk datafile中,這是為了減少過多disk IO的考量,所以採取batch的方式寫入。
When a checkpoint occurs, Oracle must update the headers of all datafiles to record the details of the checkpoint. This is done by the CKPT process. The CKPT process does not write blocks to disk; DBWn always performs that work.
在shutdown normal or shutdown immediate下,也就是所謂的clean shutdown,checkpoint也會自動觸發,並且把SCN紀錄寫回。 當發生checkpoint時,會把SCN寫到四個地方去。三個地方於control file內,一個在datafile header。
Control file三個地方為
1.System checkpoint SCN ===========> (SYSTEM CHECKPOINT SCN in control file)
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
--------------------
292767
2.Datafile checkpoint SCN ===============> (DATAFILE CHECKPOINT SCN in control file)
SQL> select name,checkpoint_change#
from v$datafile where name like ''%users01%'';
NAME CHECKPOINT_CHANGE#
----------------------------------- --------------------
/u02/oradata/OMFD1/users01.dbf 292767
3.Stop SCN ======================> (STOP SCN in control file)