SCN:System Change Number
SCN是Oracle資料庫的一個邏輯的内部時間戳,用以辨別資料庫在某個确切時刻送出的版本。在事務送出或復原時,它被賦予一個惟一的辨別事務的SCN,用來保證資料庫的一緻性。
1
2
3
4
5
6
7
8
<code>SQL> </code><code>select</code> <code>dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) </code><code>from</code> <code>dual;</code>
<code>GET_SYSTEM_CHANGE_NUMBER SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER)</code>
<code>------------------------ -------------------------------------------------------</code>
<code> </code><code>1819076 06-JUL-13 11.40.12.000000000 PM</code>
<code>SQL></code><code>select</code> <code>current_scn </code><code>from</code> <code>v$</code><code>database</code><code>;</code>
<code>CURRENT_SCN</code>
<code>-----------</code>
<code> </code><code>1819065</code>
SCN在資料庫中是無處不在的,常見的控制檔案、資料檔案頭部、日志檔案等都記錄有SCN。
控制檔案中
系統檢查點SCN(System Checkpoint SCN)
<code>SQL> </code><code>select</code> <code>checkpoint_change# </code><code>from</code> <code>v$</code><code>database</code><code>;</code>
<code>CHECKPOINT_CHANGE#</code>
<code>------------------</code>
<code> </code><code>1809219</code>
檔案檢查點SCN(Datafile Checkpoint SCN)
檔案結束SCN(Stop SCN)
<code>SQL> </code><code>select</code> <code>name</code><code>,checkpoint_change#,last_change# </code><code>from</code> <code>v$datafile;</code>
<code>NAME</code> <code>CHECKPOINT_CHANGE# LAST_CHANGE#</code>
<code>--------------------------------------------- ------------------ ------------</code>
<code>+DATA/orcl/datafile/system.256.817343229 1809219</code>
<code>+DATA/orcl/datafile/sysaux.257.817343231 1809219</code>
<code>+DATA/orcl/datafile/undotbs1.258.817343231 1809219</code>
<code>+DATA/orcl/datafile/users.259.817343231 1809219</code>
<code>+DATA/orcl/datafile/example.265.817343543 1809219</code>
資料檔案頭部
開始SCN(Start SCN)
<code>SQL> </code><code>select</code> <code>checkpoint_change# </code><code>from</code> <code>v$datafile_header;</code>
日志檔案中
FIRST SCN:redo log file中第一條日志的SCN
NEXT SCN:redo log file中最後一條日志的SCN(即下一個redo log file的第一條日志的SCN)
通常,隻有目前的重做日志檔案組寫滿後才發生日志切換,但是可以通過設定參數ARCHIVE_LOG_TARGET控制日志切換的時間間隔,在必要時也可以采用手工強制進行日志切換.
一組redo log file寫滿後,會自動切換到下一組redo log file。上一組redo log的High SCN就是下一組redo log的Low SCN,且對于Current日志檔案的High SCN為無窮大(FFFFFFFF)。
<code>SQL> </code><code>select</code> <code>group</code><code>#,</code><code>sequence</code><code>#,status,first_change#,next_change# </code><code>from</code> <code>v$log;</code>
<code> </code><code>GROUP</code><code># </code><code>SEQUENCE</code><code># STATUS FIRST_CHANGE# NEXT_CHANGE#</code>
<code>---------- ---------- ---------------- ------------- ------------------</code>
<code> </code><code>1 34 INACTIVE 1746572 1770739</code>
<code> </code><code>2 35 INACTIVE 1770739 1808596</code>
<code> </code><code>3 36 </code><code>CURRENT</code> <code>1808596 281474976710655</code>
執行個體崩潰恢複:
在open資料庫時,Oracle通過控制檔案進行了以下驗證:
檢查資料檔案頭部所記錄的Start SCN 和控制檔案中所記錄的System Checkpoint SCN 是否一緻,若不同則需要進行媒體恢複
檢查資料檔案頭部所記錄的Start SCN 和控制檔案中記錄的Stop SCN是否也一緻,若不同則需要進行執行個體恢複.
如果兩個都一緻了,說明所有已被修改的資料塊已經寫入到了資料檔案中,才可以正常open,
當資料庫open并正常運作期間,系統SCN、檔案SCN和資料檔案頭部的開始SCN都是一緻的,且(大于或)等于ACTIVE/CURRENT日志檔案的最小FIRST SCN,但檔案結束SCN為NULL(無窮大);
當資料庫正常關閉時,Oracle通過完全檢查點将buffer cache中的所有緩存寫到磁盤上,同時根據關閉資料庫的時間點更新控制檔案中的系統SCN、檔案SCN、結束SCN和資料檔案頭部中的開始SCN,且SCN都是一緻的,且LRBA指針指向on disk RBA,否則需要前滾;
當資料庫非正常關閉(崩潰/掉電)後啟動執行個體時,Oracle将檢測到控制檔案中的系統SCN、檔案SCN和資料檔案頭部的開始SCN都是一緻的,但是結束SCN為NULL,則在需要參與執行個體崩潰恢複的redo log file中根據控制檔案中記錄的LRBA位址(前滾起點)和on disk RBA(前滾終點)位址找出相應的日志項進行執行個體崩潰恢複,最終才可将資料庫open.
執行個體恢複的詳細過程:
前滾階段(前滾靠redo,又叫緩沖區恢複cache recovery,即負責恢複已經在記憶體中但還沒有寫入資料檔案中的内容)
Oracle是按照redo log file的記錄來前滾的(不管有沒有commit),是以前滾完成後,data file中可能會有沒有送出的資料(是以需要後面的回退過程).
另外,由于undo的生成也是要記錄redo log的,是以還會按照redo重新生成後面回退時需要的undo資訊.
資料庫open階段
前滾完畢後,資料庫中所有已被修改的資料塊已經寫入到了資料檔案中才可以正常open
復原階段(復原靠undo,又叫事務恢複transaction recoery,即負責回退執行個體崩潰前沒有送出的事務)
正常關閉資料庫時:
系統SCN、檔案SCN、結束SCN和資料檔案頭部中的開始SCN都是相等的,且(大于或)等于ACTIVE/CURRENT日志檔案中的最小FIRST SCN
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<code>SQL> shutdown immediate</code>
<code>Database</code> <code>closed.</code>
<code>Database</code> <code>dismounted.</code>
<code>ORACLE instance shut down.</code>
<code>SQL> startup mount</code>
<code>ORACLE instance started.</code>
<code>Total System </code><code>Global</code> <code>Area 459304960 bytes</code>
<code>Fixed </code><code>Size</code> <code>2214336 bytes</code>
<code>Variable </code><code>Size</code> <code>289408576 bytes</code>
<code>Database</code> <code>Buffers 159383552 bytes</code>
<code>Redo Buffers 8298496 bytes</code>
<code>Database</code> <code>mounted.</code>
<code>SQL> </code><code>select</code> <code>checkpoint_change# </code><code>from</code> <code>v$</code><code>database</code><code>;</code>
<code> </code><code>1822573</code>
<code>SQL> </code><code>select</code> <code>name</code><code>,checkpoint_change#,last_change# </code><code>from</code> <code>v$datafile;</code>
<code>+DATA/orcl/datafile/system.256.817343229 1822573 1822573</code>
<code>+DATA/orcl/datafile/sysaux.257.817343231 1822573 1822573</code>
<code>+DATA/orcl/datafile/undotbs1.258.817343231 1822573 1822573</code>
<code>+DATA/orcl/datafile/users.259.817343231 1822573 1822573</code>
<code>+DATA/orcl/datafile/example.265.817343543 1822573 1822573</code>
<code>SQL> </code><code>select</code> <code>name</code><code>,checkpoint_change# </code><code>from</code> <code>v$datafile_header;</code>
<code>NAME</code> <code>CHECKPOINT_CHANGE#</code>
<code>--------------------------------------------- ------------------</code>
<code>+DATA/orcl/datafile/system.256.817343229 1822573</code>
<code>+DATA/orcl/datafile/sysaux.257.817343231 1822573</code>
<code>+DATA/orcl/datafile/undotbs1.258.817343231 1822573</code>
<code>+DATA/orcl/datafile/users.259.817343231 1822573</code>
<code>+DATA/orcl/datafile/example.265.817343543 1822573</code>
<code> </code><code>1 37 </code><code>CURRENT</code> <code>1822207 281474976710655</code>
<code> </code><code>3 36 INACTIVE 1808596 1822207</code>
正常open資料庫時:
檔案結束SCN為NULL(無窮大)
<code>SQL> </code><code>alter</code> <code>database</code> <code>open</code><code>;</code>
<code>Database</code> <code>altered.</code>
<code>+DATA/orcl/datafile/system.256.817343229 1822576</code>
<code>+DATA/orcl/datafile/sysaux.257.817343231 1822576</code>
<code>+DATA/orcl/datafile/undotbs1.258.817343231 1822576</code>
<code>+DATA/orcl/datafile/users.259.817343231 1822576</code>
<code>+DATA/orcl/datafile/example.265.817343543 1822576</code>
異常關機(執行個體崩潰)時:
檔案結束SCN仍為NULL(無窮大)
<code>SQL> shutdown abort</code>
啟動執行個體将進行執行個體恢複:
39
40
<code>$ tailf /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log</code>
<code>Sun Jul 07 00:10:07 2013</code>
<code>alter</code> <code>database</code> <code>open</code>
<code>Beginning crash recovery </code><code>of</code> <code>1 threads</code>
<code> </code><code>parallel recovery started </code><code>with</code> <code>3 processes</code>
<code>Started redo scan</code>
<code>Completed redo scan</code>
<code> </code><code>read</code> <code>192 KB redo, 87 data blocks need recovery</code>
<code>Started redo application </code><code>at</code>
<code> </code><code>Thread 1: logseq 37, block 533</code>
<code>Recovery </code><code>of</code> <code>Online Redo Log: Thread 1 </code><code>Group</code> <code>1 Seq 37 Reading mem 0</code>
<code> </code><code>Mem# 0: +DATA/orcl/onlinelog/group_1.261.817343457</code>
<code> </code><code>Mem# 1: +FRA/orcl/onlinelog/group_1.257.817343463</code>
<code>Completed redo application </code><code>of</code> <code>0.15MB</code>
<code>Completed crash recovery </code><code>at</code>
<code> </code><code>Thread 1: logseq 37, block 918, scn 1843004</code>
<code> </code><code>87 data blocks </code><code>read</code><code>, 87 data blocks written, 192 redo k-bytes </code><code>read</code>
<code>Sun Jul 07 00:10:13 2013</code>
<code>Thread 1 advanced </code><code>to</code> <code>log </code><code>sequence</code> <code>38 (thread </code><code>open</code><code>)</code>
<code>Thread 1 opened </code><code>at</code> <code>log </code><code>sequence</code> <code>38</code>
<code> </code><code>Current</code> <code>log# 2 seq# 38 mem# 0: +DATA/orcl/onlinelog/group_2.262.817343467</code>
<code> </code><code>Current</code> <code>log# 2 seq# 38 mem# 1: +FRA/orcl/onlinelog/group_2.258.817343473</code>
<code>Successful </code><code>open</code> <code>of</code> <code>redo thread 1</code>
<code>Sun Jul 07 00:10:14 2013</code>
<code>SMON: enabling cache recovery</code>
<code>Successfully onlined Undo Tablespace 2.</code>
<code>Verifying file header compatibility </code><code>for</code> <code>11g tablespace encryption..</code>
<code>Verifying 11g file header compatibility </code><code>for</code> <code>tablespace encryption completed</code>
<code>SMON: enabling tx recovery</code>
<code>Database</code> <code>Characterset </code><code>is</code> <code>AL32UTF8</code>
<code>No</code> <code>Resource Manager plan active</code>
<code>Sun Jul 07 00:10:17 2013</code>
<code>replication_dependency_tracking turned </code><code>off</code> <code>(</code><code>no</code> <code>async multimaster replication found)</code>
<code>Starting background process QMNC</code>
<code>Sun Jul 07 00:10:21 2013</code>
<code>QMNC started </code><code>with</code> <code>pid=28, OS id=7140</code>
<code>Sun Jul 07 00:10:31 2013</code>
<code>Completed: </code><code>alter</code> <code>database</code> <code>open</code>
<code></code>
本文轉自Vnimos51CTO部落格,原文連結:http://blog.51cto.com/vnimos/1248546,如需轉載請自行聯系原作者