ORACLE scn 機制
SCN號概述
SCN是當Oracle資料庫更新後,由DBMS自動維護去累積遞增的一個數字。Oracle資料庫中一共有4種SCN分別為
系統檢查點SCN: 系統檢查點SCN位於控制檔案中,當檢查點程式啟動時(ckpt),Oracle就把系統檢查點的SCN儲存到控制檔案中。該SCN是全域性範圍的,當發生檔案級別的SCN時,例如將表空間置於只讀狀態,則不會更新系統檢查點SCN。
查詢系統檢查點SCN的命令如下
SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
590694
資料檔案scn:當ckpt程式啟動時,包括全域性範圍的(比如日誌切換)以及檔案級別的檢查點(將表空間置為只讀、begin backup或將某個資料檔案設定為offline等),這時會在控制檔案中記錄的scn。
查詢資料檔案SCN的命令如下
SQL> alter tablespace users read only;
Tablespace altered.
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 592277
2 592277
3 592277
4 592291
5 592277
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
592277
可以看到4號檔案也就是users表空間所屬的檔案scn值和其他檔案不一致,且比系統檢查點的scn要大。
結束scn:每個資料檔案都有一個結束scn,在資料庫的正常執行中,只要資料檔案線上且是可讀寫的,結束scn為null。否則則存在具體的scn值。結束scn也記錄在控制檔案中。
SQL>select TABLESPACE_NAME,STATUS from dba_tablespaces
TABLESPACE_NAME STATUS
----------------- ---------------------------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMP ONLINE
USERS READ ONLY
EXAMPLE ONLINE
SQL> select file#,LAST_CHANGE# from v$datafile;
FILE# LAST_CHANGE#
---------- ------------
1
2
3
4 592291
5
可以看到除了users表空間的結束scn不為空,其他資料檔案的結束scn為空。
將資料庫至於mount狀態,由於該狀態下所有的資料檔案都不可寫,故mount狀態下所有的資料檔案都具有結束scn。
SQL> shutdown immediate;
SQL> startup mount;
SQL> select file#,last_change# from v$datafile;
FILE# LAST_CHANGE#
---------- ------------
1 592608
2 592608
3 592608
4 592291
5 592608
資料檔案頭scn:不同於上述的SCN資料檔案開始scn記錄在每個資料檔案中。當發生系統及檔案級別的檢查點後,不僅將這時的SCN號記錄在控制檔案中,同樣也記錄在資料檔案中。
查詢資料檔案頭SCN的命令如下
SQL> select file#,CHECKPOINT_CHANGE# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 592608
2 592608
3 592608
4 592291
5 592608
SCN的機制
資料庫執行時的SCN
我們先看下oracle事務中的資料變化是如何寫入資料檔案的:
1、 事務開始;
2、 在buffer cache中找到需要的資料塊,如果沒有找到,則從資料檔案中載入buffer cache中;
3、 事務修改buffer cache的資料塊,該資料被標識為“髒資料”,並被寫入log buffer中;
4、 事務提交,LGWR程式將log buffer中的“髒資料”寫入redo log file中;
5、 當發生checkpoint,CKPT程式更新所有資料檔案的檔案頭中的資訊,DBWr程式則負責將Buffer Cache中的髒資料寫入到資料檔案中。
Redo log中的high scn和low scn
RECID SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ------------- ------------
1 1 446075 474154
2 2 474154 497385
3 3 497385 516087
4 4 516087 540659
5 5 540659 564897
6 6 564897 564903
7 7 564903 565320
8 8 565320 565704
9 9 565704 565715
10 10 565715 567343
11 11 567343 587705
2 where vf.group#=v.group#
3* and v.status='CURRENT'
MEMBER STATUS FIRST_CHANGE#
------------------------------------------------------------ -------------- -------------
/u01/app/oradata/orcl/redo02.log CURRENT 587705
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string /home/oracle/admin/c001/udump
開啟轉儲出來的檔案,可以看到
DUMP OF REDO FROM FILE '/u01/app/oradata/orcl/redo02.log'
Opcodes *.*
RBAs: 0x000000.00000000.0000 thru 0xffffffff.ffffffff.ffff
SCNs: scn: 0x0000.00000000 thru scn: 0xffff.ffffffff
Times: creation thru eternity
FILE HEADER:
Compatibility Vsn = 169869568=0xa200100
Db ID=1269936864=0x4bb1b2e0, Db Name='ORCL'
Activation ID=1269912032=0x4bb151e0
Control Seq=696=0x2b8, File size=102400=0x19000
File Number=2, Blksiz=512, File Type=2 LOG
descrip:"Thread 0001, Seq# 0000000012, SCN 0x00000008f7b9-0xffffffffffff"
thread: 1 nab: 0x34f6 seq: 0x0000000c hws: 0x9 eot: 1 dis: 0
resetlogs count: 0x2c3c676f scn: 0x0000.0006ce7b (446075)
resetlogs terminal rcv count: 0x0 scn: 0x0000.00000000
prev resetlogs count: 0x2184ef74 scn: 0x0000.00000001 (1)
prev resetlogs terminal rcv count: 0x0 scn: 0x0000.00000000
Low scn: 0x0000.0008f7b9 (587705) 04/20/2011 09:35:56
Next scn: 0xffff.ffffffff 01/01/1988 00:00:00
Enabled scn: 0x0000.0006ce7b (446075) 02/03/2011 18:29:03
Thread closed scn: 0x0000.00090ae0 (592608) 04/20/2011 15:29:05
Disk cksum: 0x30ee Calc cksum: 0x30ee
Terminal recovery stop scn: 0x0000.00000000
Terminal recovery 01/01/1988 00:00:00
Most recent redo scn: 0x0000.00000000
Largest LWN: 1920 blocks
End-of-redo stream : No
Unprotected mode
Miscellaneous flags: 0x0
Thread internal enable indicator: thr: 0, seq: 0 scn: 0x0000.00000000
redo log中當前系統的SCN記錄當前最新的資料庫scn值可透過如下命令檢視
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
594373
如果需要進行例項恢復,則需要恢復的記錄為587705至594373中redo log中的記錄。
日誌切換或者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都不會被更新。
心跳
在Oracle中有一個事件叫Heartbeat,這個詞在很多地方被提及,並且有著不同的含義(比如RAC中),我們這裡要討論的是CKPT的Heartbeat機制。
Oracle透過CKPT程式每3秒將Heartbeat寫入控制檔案,以減少故障時的恢復時間
資料庫正常關閉啟動
資料庫正常關閉時,系統會執行一個完全檢查點動作,並用該檢查點時的SCN號更新上述4個SCN號,這時所有資料檔案的終止SCN號會設定為資料檔案頭的那個啟動SCN(除了離線和只讀的資料檔案)
資料庫重新啟動時,Oracle將資料檔案頭中的啟動SCN與資料檔案檢查點SCN比較,如果這 兩個值匹配,Oracle接下來再比較資料檔案頭中的SCN和控制檔案中資料檔案的終止SCN,如果這個值也匹配,就意味著所有資料塊已經提交,因此資料 庫不需要進行恢復,此時資料庫直接開啟。當所有的資料檔案都開啟之後,線上且可讀寫的資料檔案終止SCN再次被設定為NULL,表示資料檔案已經開啟並能 夠正常使用了。有些表空間是隻讀的,這時控制檔案中的系統檢查點SCN號會不斷增長,而資料檔案SCN號和檔案頭中的啟動SCN(會停止更新直到表空間又 設定為可讀寫),顯然這時系統檢查點SCN號會大於資料檔案SCN和檔案頭啟動SCN。
資料庫非正常關閉
資料庫非正常關閉 ( 或稱為例項崩潰 ) 時,終止 SCN 不會被設定,依然為 NULL ,這可以透過把資料庫啟動至 mount 狀態查詢出來。 這樣重新啟動時,SMON程式 會執行例項恢復工作,即先執行前滾、回滾操作,再把資料庫開啟。
資料檔案介質故障
出現介質故障時,資料檔案檢查點SCN及系統檢查點SCN比檔案頭啟動SCN大。系統發生介質故障時,資料檔案被以前的備份代替,控制檔案中的資料檔案檢查點SCN肯定比檔案頭中的啟動SCN要大,這樣Oracle就知道要對這個檔案進行介質恢復
控制檔案介質故障
系統檢查點SCN及資料檔案SCN比資料檔案頭啟動SCN小:
在資料庫恢復時,控制檔案可能不是最新的,即把一個較早的控制檔案還原為當前的控制檔案,然後再執行恢復操作,這時控制檔案中的系統檢查點SCN和資料文 件SCN可能比檔案頭的啟動SCN小。這時恢復資料庫要用下面命令:recover database using Backup Controlfile或其他的恢復語句。
備份時的例項崩潰
當執行begin backup時例項崩潰:控制檔案中的資料檔案檢查點SCN號和資料檔案頭部檢查點SCN號相同,但是每個可讀寫的線上資料檔案之間檢查點SCN號不同, 那麼要求介質恢復,例如發出begin backup命令後就會出現這種情況,需要透過end backup命令好才可以開啟資料庫。
參考至:《教你如何成為10g OCP》韓思捷著
http://blog.csdn.net/daimin1983/archive/2008/12/09/3484173.aspx
http://blog.csdn.net/liweiah/archive/2009/07/13/4345656.aspx
http://lanying1982.blog.163.com/blog/static/230677482009015112027385/
原創文章,轉載請註明出處、作者
如有錯誤,歡迎指正
郵箱:czmcj@163.com
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/500314/viewspace-1063646/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle SCN機制解析Oracle
- Oracle SCN機制解析(zt)Oracle
- ZT Oracle SCN機制解析Oracle
- 轉:Oracle SCN機制解析Oracle
- Oracle SCN機制解析刨細Oracle
- 轉載Oracle SCN機制解析Oracle
- Oracle SCN機制解析 (SCN, checkpoint檢查點) - finalOracle
- Oracle SCN機制詳細解讀Oracle
- SCN的機制
- Oracle SCN機制———在備份與恢復中Oracle
- 檢查點機制與scn
- 【恩墨學院】深入剖析 - Oracle SCN機制詳細解讀Oracle
- Oracle:SCNOracle
- Oracle scnOracle
- 【SCN】Oracle SCN 詳細介紹Oracle
- 探索Oracle SCNOracle
- oracle的SCNOracle
- 【SCN】Oracle檢查scn值指令碼Oracle指令碼
- 【SCN】Oracle推薦scn命令參考Oracle
- Oracle timestamp_to_scn and scn_to_timestampOracle
- Oracle鎖機制Oracle
- oracle 鎖機制Oracle
- ORACLE -詳解SCNOracle
- Oracle SCN詳解Oracle
- Oracle Scn 定義Oracle
- ORACLE SCN 查詢Oracle
- Oracle中的SCNOracle
- ORACLE golden gate 機制OracleGo
- oracle鎖機制研究Oracle
- oracle的scn及sequenceOracle
- 查詢Oracle的SCNOracle
- oracle資料庫SCNOracle資料庫
- 對ORACLE SCN的理解Oracle
- SCN與oracle啟動Oracle
- Oracle HowTo:How to get Oracle SCN?Oracle
- mySql\oracle分頁機制MySqlOracle
- Oracle回收站機制Oracle
- ORACLE鎖機制-轉載Oracle