檢查點SCN在事務發生後以及發生檢查點和歸檔操作後的變化
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 知道哪些應該
被恢復、哪些應該被複制。
在一個事務提交後(上述第四個步驟),會在 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 都不會被更新。
--以下操作是為了驗證上述理論:
begin for i in 1..5 loop
insert into test.t3 values(i);
end loop;
commit;
end;
/
begin for i in 11..101 loop
insert into test.t3 values(i);
end loop;
commit;
end;
/
--下面是用到的語句清單
insert into test.t3 values(109);
select checkpoint_change#,current_scn from v$database;
commit;
insert into test.t3 values(110);
select checkpoint_change#,current_scn from v$database;
commit;
select checkpoint_change# from v$datafile;
select checkpoint_change# from v$datafile_header;
select checkpoint_change#,current_scn from
v$database;
--發生一次歸檔,檢視檢查點SCN的變化
alter system archive log current;
select checkpoint_change#,current_scn from
v$database;
select * from v$log;
--發生一次檢查點,檢視檢查點SCN的變化
alter system checkpoint;
select checkpoint_change# from v$datafile;
select checkpoint_change# from v$datafile_header;
select checkpoint_change#,current_scn from v$database;
select * from v$log;
select sequence#,first_change#,next_change#
from v$log_history;
--下面是上面指令碼的實際操作過程
SYS@PROD>insert into test.t3 values(109);
1 row created.
select checkpoint_change#,current_scn from v$database;
CHECKPOINT_CHANGE# CURRENT_SCN
------------------ -----------
747809 747844
SYS@PROD>commit;
Commit complete.
SYS@PROD>insert into test.t3 values(110);
1 row created.
SYS@PROD>select checkpoint_change#,current_scn from v$database;
CHECKPOINT_CHANGE# CURRENT_SCN
------------------ -----------
747809 747847
SYS@PROD>commit;
Commit complete.
SYS@PROD>select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
747809
747809
747809
747809
747809
747809
747809
747809
747809
9 rows selected.
SYS@PROD>select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
747809
747809
747809
747809
747809
747809
747809
747809
747809
9 rows selected.
--發生歸檔,之後檢視檢查點的變化
SYS@PROD>alter system archive log current;
CHECKPOINT_CHANGE# CURRENT_SCN
------------------ -----------
747809 747850
SYS@PROD>alter system archive log current;
select checkpoint_change#,current_scn from v$database;
System altered.
SYS@PROD>select checkpoint_change#,current_scn from v$database;
CHECKPOINT_CHANGE# CURRENT_SCN
------------------ -----------
747809 747854
--上面的檢查點SCN沒有變化,原因是裝置IO不繁忙,因此要等一會兒才會更新三個檢查點SCN,幽靈一篇文章專門論證這一點
SYS@PROD>select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIV
---------- ---------- ---------- ---------- ---------- ------
STATUS FIRST_CHANGE# FIRST_TIME
-------------------------------- ------------- ------------
1 1 31 104857600 4 NO
CURRENT 747853 31-JAN-14 –此處的747853為之前group3日誌組歸檔時的當時系統SCN,作為group3日誌組的HIGH SCN,也作為該當前日誌的LOW SCN
2 1 29 104857600 4 YES
INACTIVE 747763 31-JAN-14
3 1 30 104857600 4 YES
ACTIVE 747801 31-JAN-14
--發生一次檢查點,檢視檢查點SCN的變化
SYS@PROD>alter system checkpoint;
System altered.
--發起checkpoint後,控制檔案中的Datafile Checkpoint SCN被同步為當時發起checkpoint時的系統SCN
SYS@PROD>select checkpoint_change# from v$datafile;
--證明
CHECKPOINT_CHANGE#
------------------
747855
747855
747855
747855
747855
747855
747855
747855
747855
9 rows selected.
--發起checkpoint後,資料檔案中的Start SCN被同步為當時發起checkpoint時的系統SCN
SYS@PROD>select checkpoint_change# from v$datafile_header;
--發起checkpoint後,控制檔案中的Datafile Checkpoint SCN被同步為當時系統SCN
CHECKPOINT_CHANGE#
------------------
747855
747855
747855
747855
747855
747855
747855
747855
747855
9 rows selected.
--發起checkpoint後,控制檔案中的System Checkpoint SCN被同步為當時發起checkpoint時的系統SCN
SYS@PROD>select checkpoint_change#,current_scn from v$database;
CHECKPOINT_CHANGE# CURRENT_SCN
------------------ -----------
747855 747856
SYS@PROD>select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIV
---------- ---------- ---------- ---------- ---------- ------
STATUS FIRST_CHANGE# FIRST_TIME
-------------------------------- ------------- ------------
1 1 31 104857600 4 NO
CURRENT 747853 31-JAN-14
2 1 29 104857600 4 YES
INACTIVE 747763 31-JAN-14
3 1 30 104857600 4 YES
INACTIVE 747801 31-JAN-14
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26521853/viewspace-1083881/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 那些操作會發生區域性檢查點(Partial checkpoint)!
- Oracle 檢查點涉及的SCNOracle
- 深入淺出-檢查點scn
- 檢查點機制與scn
- 改變ogg抽取程式檢查點檔案中的檢查點
- 全域性檢查點和增量檢查點
- 關於資料檔案頭的檢查點SCN
- 全域性檢查點和增量檢查點(zt)
- Oracle完全檢查點和增量檢查點詳解Oracle
- Oracle SCN機制解析 (SCN, checkpoint檢查點) - finalOracle
- 檢查點和oracle資料庫的恢復(一)SCNOracle資料庫
- 關於資料檔案頭的檢查點SCN知識
- 在RFT中新增檔案檢查點
- 實驗證明由於裝置IO不繁忙,發起歸檔後因此要等一會兒才會更新三個檢查點SCN
- 【體系結構】SCN與checkpoint(檢查點)
- Oracle 檢查點佇列與增量檢查點Oracle佇列
- 【TUNE_ORACLE】Oracle檢查點(二)檢查點效能Oracle
- 【效能優化】增量檢查點優化
- SQLServer的檢查點、redo和undoSQLServer
- 重建控制檔案, 資料檔案檢查點SCN到底來自哪裡?
- 在RFT中新增clipboard檢查點
- Nginx負載均衡中後端節點伺服器健康檢查的操作梳理Nginx負載後端伺服器
- oracle checkpoint檢查點Oracle
- OCP知識點講解 之 檢查點佇列與增量檢查點佇列
- 【SCN】Oracle檢查scn值指令碼Oracle指令碼
- 【TUNE_ORACLE】Oracle檢查點(一)檢查點(Checkpoint)概念介紹Oracle
- oracle ckpt檢查點型別(增量及常規完全檢查點)checkpointOracle型別
- Oracle資料庫啟動過程驗證檢查點SCNOracle資料庫
- 【TUNE_ORACLE】Oracle檢查點(五)建立並利用Statspack定位檢查點故障Oracle
- Oracle SCN健康狀態檢查Oracle
- 增量檢查點(incremental checkpoint)的解疑REM
- MySQL InnoDB檢查點機制MySql
- CUUG ORACLE檢查點講解Oracle
- [zt]Oracle檢查點ckpt (checkpoint)Oracle
- ORACLE增量檢查點,LRBA,BWROracle
- oracle checkpoint檢查點系列一Oracle
- 深入淺出檢查點和例項recovery
- 主從分離的事務操作很容易發生誤操作