【體繫結構】有關Oracle SCN知識點的整理 1 BLOG文檔結構圖 2 前言部分 2.1 導讀和註意事項 各位技術愛好者,看完本文後,你可以掌握如下的技能,也可以學到一些其它你所不知道的知識,~O(∩_∩)O~: ① Oracle中的SCN是什麼?(重點) ② 如何查詢SCN?(重點) ③ S... ...
【體繫結構】有關Oracle SCN知識點的整理
1 BLOG文檔結構圖
2 前言部分
2.1 導讀和註意事項
各位技術愛好者,看完本文後,你可以掌握如下的技能,也可以學到一些其它你所不知道的知識,~O(∩_∩)O~:
① Oracle中的SCN是什麼?(重點)
② 如何查詢SCN?(重點)
③ SCN有哪些分類?(重點)
④ SCN和系統恢復的關係?(重點)
④ 實例恢復和介質恢復的區別是什麼?RAC中的實例恢復是什麼樣的?(重點)
⑥ SCN和時間的轉換
⑦ SMON_SCN_TIME系統表的認識
⑧ 不完全恢復的一些分類及其寫法
Tips:
① 本文在itpub(http://blog.itpub.net/26736162)、博客園(http://www.cnblogs.com/lhrbest)和微信公眾號(xiaomaimiaolhr)上有同步更新。
② 文章中用到的所有代碼、相關軟體、相關資料及本文的pdf版本都請前往小麥苗的360雲盤下載,我的360雲盤地址見:http://blog.itpub.net/26736162/viewspace-1624453/。
③ 若網頁文章代碼格式有錯亂,請嘗試以下辦法:①使用360瀏覽器,②去博客園地址閱讀③下載pdf格式的文檔來閱讀。
④ 在本篇BLOG中,代碼輸出部分一般放在一行一列的表格中。其中,需要特別關註的地方我都用灰色背景和粉紅色字體來表示,比如在下邊的例子中,thread 1的最大歸檔日誌號為33,thread 2的最大歸檔日誌號為43是需要特別關註的地方;而命令一般使用黃色背景和紅色字體標註;對代碼或代碼輸出部分的註釋一般採用藍色字體表示。
List of Archived Logs in backup set 11 Thrd Seq Low SCN Low Time Next SCN Next Time ---- ------- ---------- ------------------- ---------- --------- 1 32 1621589 2015-05-29 11:09:52 1625242 2015-05-29 11:15:48 1 33 1625242 2015-05-29 11:15:48 1625293 2015-05-29 11:15:58 2 42 1613951 2015-05-29 10:41:18 1625245 2015-05-29 11:15:49 2 43 1625245 2015-05-29 11:15:49 1625253 2015-05-29 11:15:53 [ZHLHRDB1:root]:/>lsvg -o T_XLHRD_APP1_vg rootvg [ZHLHRDB1:root]:/> 00:27:22 SQL> alter tablespace idxtbs read write; ====》2097152*512/1024/1024/1024=1G |
本文如有錯誤或不完善的地方請大家多多指正,ITPUB留言或QQ皆可,您的批評指正是我寫作的最大動力。
2.2 本文簡介
由於寫書遇到了SCN的概念,所以就找了點資料,整理了一下有關SCN的一些知識。順便複習了一下SCN和資料庫恢復的關係。
3 Oracle SCN
3.1 簡介
SCN(System Change Number,系統改變號)是一個由系統內部維護的序列號。當系統需要更新的時候自動增加,它是系統中維持數據的一致性和順序恢復的重要標誌,是資料庫非常重要的一種數據結構。SCN的最大值是0xffff.ffffffff。在資料庫中SCN作為一種時鐘機制來標記資料庫動作,比如當事務的發生,資料庫會用一個SCN來標記它。同時這個SCN在資料庫全局也是唯一的,它隨時間的增長而增長除非重建資料庫。
在資料庫中,SCN可以說是無處不在,數據文件頭,控制文件,數據塊頭,日誌文件等等都標記著SCN。也正是這樣,資料庫的一致性維護和SCN密切相關。不管是數據的備份,恢復都是離不開SCN的。
3.2 官方文檔
A system change number (SCN) is a logical, internal time stamp used by Oracle Database. SCNs order events that occur within the database, which is necessary to satisfy the ACID properties of a transaction. Oracle Database uses SCNs to mark the SCN before which all changes are known to be on disk so that recovery avoids applying unnecessary redo. The database also uses SCNs to mark the point at which no redo exists for a set of data so that recovery can stop.
SCNs occur in a monotonically increasing sequence. Oracle Database can use an SCN like a clock because an observed SCN indicates a logical point in time and repeated observations return equal or greater values. If one event has a lower SCN than another event, then it occurred at an earlier time with respect to the database. Several events may share the same SCN, which means that they occurred at the same time with respect to the database.
Every transaction has an SCN. For example, if a transaction updates a row, then the database records the SCN at which this update occurred. Other modifications in this transaction have the same SCN. When a transaction commits, the database records an SCN for this commit.
Oracle Database increments SCNs in the system global area (SGA). When a transaction modifies data, the database writes a new SCN to the undo data segment assigned to the transaction. The log writer process then writes the commit record of the transaction immediately to the online redo log. The commit record has the unique SCN of the transaction. Oracle Database also uses SCNs as part of its instance recovery and media recovery mechanisms.
怎麼理解這個“SCN(系統變更號)是供Oracle資料庫使用的一個邏輯的、內部的時間戳”呢?要理解這個先需要理解Oracle中的事務(Transaction)和數據一致性(Data Consistency)的概念。
先說說數據一致性的概念。數據一致性指的是數據的可用性。比如說管理一個財務的系統,需要從A賬戶將100元轉入到B賬戶,正常的操作是從A賬戶減去100元,然後給B賬戶加上100元,如果這兩步操作都正常完成了,那我們可以說完成轉賬操作之後的數據是一致可用的;但是如果在操作的過程中出了問題,A賬戶的100元給減掉了,但是B賬戶卻沒有加上100元,這樣的情況下產生的結果數據就有問題了,因為部分操作的失敗導致了數據的不一致而不可用,在實際中肯定是要避免這種讓數據不一致的情況發生的。在Oracle資料庫中,保證數據一致性的方法就是事務。
事務是一個邏輯的、原子性的作業單元,通常由一個或者是多個SQL組成,一個事務裡面的所有SQL操作要麼全部失敗回滾(Rollback),要麼就是全部成功提交(Commit)。就像上面轉賬的例子,為保證數據的一致性,就需要將轉賬的兩步操作放在一個事務裡面,這樣不管哪個操作失敗了,都需要將所有已進行的操作回滾,以保證數據的可用性。進行事務管理是資料庫區別於別的文件系統的一個最主要的特征,在資料庫中事務最主要的作用就是保證了數據的一致性,每次事務的提交都是將資料庫從一種一致性的狀態帶入到另外一種一致性的狀態中,SCN就是用來對資料庫的每個一致狀態進行標記的,每當資料庫進入到一個新的一致的狀態,SCN就會加1,也就是每個提交操作之後,SCN都會增加。也許你會想為什麼不直接記錄事務提交時候的時間戳呢?這裡面主要是涉及了兩個問題,一個是時間戳記錄的精度有限,再一個就是在分散式系統中記錄時間戳會存在系統時鐘同步的問題,詳細的討論可以查看Ordering Events in Oracle。
SCN在資料庫中是一個單一的不斷的隨著資料庫一致性狀態的改變而自增的序列。正如一個時間戳代表著時間裡面的某一個固定的時刻點一樣,每一個SCN值也代表著資料庫在運行當中的一個一致性的點,大的SCN值所對應的事務總是比小SCN值的事務發生的更晚。因此把SCN說成是Oracle資料庫的邏輯時間戳是很恰當的。
3.3 SCN的分類
嚴格來說SCN是沒有分類的,之所以會有不同類型的SCN並不是說這些SCN的概念不一樣,而是說不同分類的SCN代表的意義不一樣,不管什麼時候SCN所指代的都是資料庫的某個一致性的狀態。就像我們給一天中的某個時間點定義上班時間、另外的某個時間點定義成下班時間一樣,資料庫Checkpoint發生點的SCN被稱為Checkpoint SCN,僅此而已。
SCN可以分為4類,系統檢查點SCN(System Checkpoint SCN)、文件檢查點SCN(Datafile Checkpoint SCN)、開始SCN(Start SCN)和結束SCN(Stop SCN),參考如下表格:
3.4 查詢4種SCN常用的SQL語句
col status for a10 select GROUP# ,SEQUENCE#,STATUS,FIRST_CHANGE#,FIRST_TIME from v$log;
SELECT A.FILE#, A.NAME, (SELECT CHECKPOINT_CHANGE# FROM V$DATABASE) SYSTEM_CKPT_SCN, A.CHECKPOINT_CHANGE# DF_CKPT_SCN, A.LAST_CHANGE# END_SCN, B.CHECKPOINT_CHANGE# START_SCN, B.RECOVER, A.STATUS FROM V$DATAFILE A, V$DATAFILE_HEADER B WHERE A.FILE# = B.FILE#; SELECT FILE#,ONLINE_STATUS,CHANGE#,ERROR FROM V$RECOVER_FILE; |
3.4.1 文件檢查點SCN (Datafile Checkpoint SCN)
SYS@lhrdb> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 9026292 2 9026292 3 9026292 4 9026292 5 9026292 6 9026292 7 9026292
7 rows selected.
SYS@lhrdb> alter tablespace users read only;
Tablespace altered.
SYS@lhrdb> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 9026292 2 9026292 3 9026292 4 9028165 5 9026292 6 9026292 7 9026292
7 rows selected.
SYS@lhrdb> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE# ------------------ 9026292 |
可以看到4號文件也就是users表空間所屬的文件scn值和其他文件不一致,且比系統檢查點的scn要大。
3.4.2 Stop SCN
Stop scn記錄在數據文件頭上。當資料庫處在打開狀態時,stop scn被設成最大值0xffff.ffffffff。在資料庫正常關閉過程中,stop scn被設置成當前系統的最大scn值。在資料庫打開過程中,Oracle會比較各文件的stop scn和checkpoint scn,如果值不一致,表明資料庫先前沒有正常關閉,需要做恢復。