久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

oracle中SCN機制的示例分析

147次閱讀
沒有評論

共計 2937 個字符,預計需要花費 8 分鐘才能閱讀完成。

丸趣 TV 小編給大家分享一下 oracle 中 SCN 機制的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

SCN(System Change Number)作為 oracle 中的一個重要機制,在數據恢復、Data Guard、Streams 復制、RAC 節點間的同步等各個功能中起著重要作用。理解 SCN 的運作機制,可以幫助你更加深入地了解上述功能。

在理解 SCN 之前,我們先看下 oracle 事務中的數據變化是如何寫入數據文件的:

1、事務開始;

2、在 buffer cache 中找到需要的數據塊,如果沒有找到,則從數據文件中載入 buffer cache 中;

3、事務修改 buffer cache 的數據塊,該數據被標識為“臟數據”,并被寫入 log buffer 中;

4、事務提交,LGWR 進程將 log buffer 中的“臟數據”寫入 redo log file 中;

5、當發生 checkpoint,CKPT 進程更新所有數據文件的文件頭中的信息,DBWn 進程則負責將 Buffer Cache 中的臟數據寫入到數據文件中。

經過上述 5 個步驟,事務中的數據變化最終被寫入到數據文件中。但是,一旦在上述中間環節時,數據庫意外宕機了,在重新啟動時如何知道哪些數據已經寫入數據文件、哪些沒有寫呢(同樣,在 DG、streams 中也存在類似疑問:redo log 中哪些是上一次同步已經復制過的數據、哪些沒有)?SCN 機制就能比較完善的解決上述問題。

SCN 是一個數字,確切的說是一個只會增加、不會減少的數字。正是它這種只會增加的特性確保了 Oracle 知道哪些應該被恢復、哪些應該被復制。

總共有 4 中 SCN:系統檢查點(System Checkpoint)SCN、數據文件檢查點(Datafile Checkpoint)SCN、結束 SCN(Stop SCN)、開始 SCN(Start SCN)。其中其面 3 中 SCN 存在于控制文件中,最后一種則存在于數據文件的文件頭中。

在控制文件中,System Checkpoint SCN 是針對整個數據庫全局的,因而之存在一個,而 Datafile Checkpoint SCN 和 Stop SCN 是針對每個數據文件的,因而一個數據文件就對應在控制文件中存在一份 Datafile Checkpoint SCN 和 Stop SCN。在數據庫正常運行期間,Stop SCN(通過視圖 v$datafile 的字段 last_change# 可以查詢) 是一個無窮大的數字或者說是 NULL。

在一個事務提交后(上述第四個步驟),會在 redo log 中存在一條 redo 記錄,同時,系統為其提供一個最新的 SCN(通過函數 dbms_flashback.get_system_change_number 可以知道當前的最新 SCN),記錄在該條記錄中。如果該條記錄是在 redo log 被清空(日志滿做切換時或發生 checkpoint 時,所有變化日志已經被寫入數據文件中),則其 SCN 被記錄為 redo log 的 low SCN。以后在日志再次被清空前寫入的 redo 記錄中 SCN 則成為 Next SCN。

當日志切換或發生 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 都不會被更新。

那系統是如何產生一個最新的 SCN 的?實際上,這個數字是由當時的 timestamp 轉換過來的。每當需要產生一個最新的 SCN 到 redo 記錄時,系統獲取當時的 timestamp,將其轉換為數字作為 SCN。我們可以通過函數 SCN_TO_TIMESTAMP(10g 以后)將其轉換回 timestamp:

SQL  select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual;
 
GET_SYSTEM_CHANGE_NUMBER
------------------------
SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER)
---------------------------------------------------------------------------
 2877076756
17-AUG-07 02.15.26.000000000 PM

也可以用函數 timestamp_to_scn 將一個 timestamp 轉換為 SCN:

SQL  select timestamp_to_scn(SYSTIMESTAMP) as scn from dual;
 
 SCN
----------
2877078439

最后,SCN 除了作為反映事務數據變化并保持同步外,它還起到系統的“心跳”作用——每隔 3 秒左右系統會刷新一次系統 SCN。

下面,在簡單介紹一下 SCN 如何在數據庫恢復中起作用。

數據庫在正常關閉(shutdown immediate/normal)時,會先做一次 checkpoint,將 log file 中的數據寫入數據文件中,將控制文件、數據文件中的 SCN(包括控制文件中的 Stop SCN)都更新為最新的 SCN。

數據庫異常 / 意外關閉不會或者只更新部分 Stop SCN。

當數據庫啟動時,Oracle 先檢查控制文件中的每個 Datafile Checkpoint SCN 和數據文件中的 Start SCN 是否相同,再檢查每個 Datafile Checkpoint SCN 和 Stop SCN 是否相同。如果發現有不同,就從 Redo Log 中找到丟失的 SCN,重新寫入數據文件中進行恢復。具體的數據恢復過程這里就不再贅述。

SCN 作為 Oracle 中的一個重要機制,在多個重要功能中起著“控制器”的作用。了解 SCN 的產生和實現方式,幫助 DBA 理解和處理恢復、DG、Streams 復制的問題。

最后提一句,利用 SCN 機制,在 Oracle10g、11g 中又增加了一些很實用的功能——數據庫閃回、數據庫負載重現等。

以上是“oracle 中 SCN 機制的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計2937字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 越西县| 固始县| 澎湖县| 宜章县| 福泉市| 沙坪坝区| 闽侯县| 龙泉市| 泾阳县| 南部县| 安达市| 巴塘县| 偏关县| 邵阳市| 塘沽区| 上栗县| 思南县| 突泉县| 西青区| 科技| 大悟县| 道孚县| 定日县| 井陉县| 内丘县| 固安县| 绍兴县| 偃师市| 信宜市| 吉林省| 望奎县| 晋州市| 平安县| 申扎县| 枣阳市| 巨鹿县| 怀集县| 吉木乃县| 佛坪县| 呼和浩特市| 小金县|