oracle checkpoint

  1. oracle alter日誌的位置:/u01/app/oracle/admin/orcl/bdump 
  2. @@@ 
  3. ALTER SYSTEM SET LOG_checkpointS_TO_ALERT=TRUE
  4. 這設置以後系統的checkpoint將會被記錄alert_$SID.log文件中。 
  5. @@@@ 
  6. 什麼是checkpoint(一個數據庫事件) 
  7. 在數據庫系統中,寫日誌和寫數據文件是數據庫中IO 消耗最大的兩種操作,在這兩種操作 
  8. 中寫數據文件屬於分散寫,寫日誌文件是順序寫,因此爲了保證數據庫的性能,通常數據庫 
  9. 都是保證在提交(commit)完成之前要先保證日誌都被寫入到日誌文件中,而髒數據塊着 
  10. 保存在數據緩存(buffer cache)中再不定期的分批寫入到數據文件中。也就是說日誌寫入 
  11. 和提交操作是同步的,而數據寫入和提交操作是不同步的。這樣就存在一個問題,當一個數 
  12. 據庫崩潰的時候並不能保證緩存裏面的髒數據全部寫入到數據文件中,這樣在實例啓動的時 
  13. 候就要使用日誌文件進行恢復操作,將數據庫恢復到崩潰之前的狀態,保證數據的一致性。 
  14. 檢查點是這個過程中的重要機制,通過它來確定,恢復時哪些重做日誌應該被掃描並應用於 
  15. 恢復。 
  16. 一般所說的checkpoint 是一個數據庫事件(event),checkpoint 事件由checkpoint 進程 
  17. (LGWR/CKPT 進程)發出,當checkpoint 事件發生時DBWn 會將髒塊寫入到磁盤中,同 
  18. 時數據文件和控制文件的文件頭也會被更新以記錄checkpoint 信息。 
  19.  
  20. @@@@ 
  21. 當檢查點發生時(此時的scn被成爲checkpointscn)oracle會通知dbwn進程,把修改過的數據,也就是此checkpoint 
  22. scn 之前的髒數據從buffer cache 寫入磁盤,當寫入完成之後,ckpt進程更新控制文件和數據文件頭,記錄檢查點信息,標識變更。 
  23. 當檢查點(數據庫事件)完成之後 
  24. 查v$datafile 獲得checkpoint scn號,此檢查點之前修改過的數據都已經寫回磁盤。 
  25. SQL> select checkpoint_change# from v$datafile; 
  26.  
  27. CHECKPOINT_CHANGE# 
  28. ------------------ 
  29.         679453 
  30.         679453 
  31.         679453 
  32.         679453 
  33.         679453 
  34.  
  35. @@@ 
  36.  
  37. 當發生checkpoint時,會把SCN寫到四個地方去。 
  38. 三個地方於control file內,一個在datafile header。 
  39. Control file三個地方爲 
  40. 1.System checkpoint SCN ===========> (SYSTEM CHECKPOINT SCN in control file) 
  41. SQL> select checkpoint_change# from v$database
  42. CHECKPOINT_CHANGE# 
  43. -------------------- 
  44. 292767 
  45. 2.Datafile checkpoint SCN ===============> (DATAFILE CHECKPOINT SCN in control file) 
  46. SQL> select name,checkpoint_change# 
  47. from v$datafile where name like '%users01%'
  48. NAME CHECKPOINT_CHANGE# 
  49. ----------------------------------- -------------------- 
  50. /u02/oradata/OMFD1/users01.dbf 292767 
  51. 3.Stop SCN ======================> (STOP SCN in control file) 
  52. SQL> select name,last_change# 
  53. from v$datafile where name like '%users01%'
  54. NAME LAST_CHANGE# 
  55. ----------------------------------- ------------ 
  56. /u02/oradata/OMFD1/users01.dbf 
  57.  
  58. 正常datafile在read-write mode下  last_change#一定是NULL 
  59. 另外一個地方在datafile header內 
  60.  
  61. @@@ 
  62.  
  63.  
  64. 4.Start SCN ================================> (DATAFILE HEADER) 
  65. SQL> select name,checkpoint_change# 
  66. from v$datafile_header where name like '%users01%'
  67. NAME CHECKPOINT_CHANGE# 
  68. ----------------------------------- -------------------- 
  69. /u02/oradata/OMFD1/users01.dbf 292767 
  70.  
  71. SQL> show parameter checkpoint 
  72.  
  73. NAME                     TYPE    VALUE 
  74. ------------------------------------ ----------- ------------------------------ 
  75. log_checkpoint_interval          integer     0 
  76. log_checkpoint_timeout           integer     1800 
  77. log_checkpoints_to_alert         boolean     FALSE(此值最好改爲true) 
  78. SQL> alter system set log_checkpoints_to_alert=true
  79.  
  80. System altered. 
  81.  
  82. 通常情況下:alter system 改內存  alter database/tablespaces  改硬盤 
  83.  
  84.  
  85. @@@@ 
  86. checkpoint和SCN有什麼關係? 
  87. 在Oracle 中SCN 相當於它的時鐘,在現實生活中我們用時鐘來記錄和衡量我們的時間, 
  88. 而Oracle 就是用SCN 來記錄和衡量整個Oracle 系統的更改。 
  89. Oracle 中checkpoint 是在一個特定的“時間點”發生的,衡量這個“時間點”用的就是SCN, 
  90. 因此當一個checkpoint 發生時SCN 會被寫入文件頭中以記錄這個checkpoint。 
  91.  
  92. SQL> select resetlogs_change#,checkpoint_change#,current_scn from v$database
  93.  
  94. RESETLOGS_CHANGE# CHECKPOINT_CHANGE# CURRENT_SCN 
  95. ----------------- ------------------ ----------- 
  96.        525876         669103      670673 
  97.  
  98.  
  99. sys> select resetlogs_change#,checkpoint_change#,current_scn from v$database
  100.  
  101. RESETLOGS_CHANGE# CHECKPOINT_CHANGE# CURRENT_SCN 
  102. ----------------- ------------------ ----------- 
  103.        525876         669103      670673 
  104.        (時間原點)            (當前時間) 
  105. sys> select checkpoint_change# from v$datafile;(數據文件頭部scn) 
  106.  
  107. CHECKPOINT_CHANGE# 
  108. ------------------ 
  109.         669103 
  110.         669103 
  111.         669103 
  112.         669103 
  113.         669103 
  114.  
  115. 表空間級檢查點 
  116.  
  117. 表空間:system(數據庫開啓時必須在線,) ,undotbs(數據庫開啓時必須在線,) 
  118.        其餘的表空間可下線(sysaux,emample(方案對象的表空間),users)  
  119. 數據庫開啓時system,undotbs   不可下線 
  120. SQL> alter tablespace system offline; 
  121. alter tablespace system offline 
  122. ERROR at line 1: 
  123. ORA-01541: system tablespace cannot be brought offline; shut down if necessary 
  124.  
  125.  
  126. SQL> alter tablespace undotbs1  offline; 
  127. alter tablespace undotbs1  offline 
  128. ERROR at line 1: 
  129. ORA-30042: Cannot offline the undo tablespace 
  130.  
  131. A、 
  132. SQL> update employees set salary=24001 where employee_id=100; 
  133.  
  134. 1 row updated. 
  135.  
  136. B、 
  137. SQL> select checkpoint_change#,name from v$datafile; 
  138.  
  139. CHECKPOINT_CHANGE# 
  140. ------------------ 
  141. NAME 
  142. -------------------------------------------------------------------------------- 
  143.         669442 
  144. /u01/app/oracle/oradata/orcl/system01.dbf 
  145.  
  146.         669442 
  147. /u01/app/oracle/oradata/orcl/undotbs01.dbf 
  148.  
  149.         669442 
  150. /u01/app/oracle/oradata/orcl/sysaux01.dbf 
  151.  
  152.  
  153. CHECKPOINT_CHANGE# 
  154. ------------------ 
  155. NAME 
  156. -------------------------------------------------------------------------------- 
  157.         669442 
  158. /u01/app/oracle/oradata/orcl/users01.dbf 
  159.  
  160.         676942 
  161. /u01/app/oracle/oradata/orcl/example01.dbf 
  162.  
  163.  
  164.  
  165.  
  166. SQL> alter tablespace example offline; 
  167.  
  168. Tablespace altered. 
  169.  
  170.  
  171.  
  172. B、 
  173. SQL> select checkpoint_change#,name from v$datafile; 
  174.  
  175. CHECKPOINT_CHANGE# 
  176. ------------------ 
  177. NAME 
  178. -------------------------------------------------------------------------------- 
  179.         669442 
  180. /u01/app/oracle/oradata/orcl/system01.dbf 
  181.  
  182.         669442 
  183. /u01/app/oracle/oradata/orcl/undotbs01.dbf 
  184.  
  185.         669442 
  186. /u01/app/oracle/oradata/orcl/sysaux01.dbf 
  187.  
  188.  
  189. CHECKPOINT_CHANGE# 
  190. ------------------ 
  191. NAME 
  192. -------------------------------------------------------------------------------- 
  193.         669442 
  194. /u01/app/oracle/oradata/orcl/users01.dbf 
  195.  
  196.         671527--scn增大 
  197. /u01/app/oracle/oradata/orcl/example01.dbf 
  198.  
  199.  
  200. @@@ 
  201. 增量檢查點:當增量檢查點發生時,ckpt將檢查點隊列中的髒快第一次被髒的LRBA地址記錄到控制文件中。 
  202. 增量檢查點並不會去更新數據文件,以及控制文件中的文件scn以及數據文件頭部的scn信息,而只是沒三秒由ckpt 
  203. 去更新控制文件中的LRBA信息,也就是檢查點位置。 
  204. @@@ 
  205. 完全檢查點:完全檢查點發生時,ckpt會觸發dbwn將所有髒塊寫回磁盤 
  206. 完全檢查點實驗: 
  207. A、 
  208. SQL> conn hr/hr 
  209. Connected. 
  210. SQL> update employees set salary=24001 where employee_id=100; 
  211.  
  212. SQL> alter system  checkpoint;(實現完全檢查點。相當於正常關機(shutdown immediate)) 
  213.  
  214. System altered.  此時出發完全檢查點進程將database bffer cache 中的數據全部寫入數據文件(內存最乾淨,日誌到最後一條) 
  215.  
  216. @@@ 
  217. SQL> show parameter fast_start 
  218.  
  219. NAME                     TYPE    VALUE 
  220. ------------------------------------ ----------- ------------------------------ 
  221. fast_start_io_target             integer     0 
  222. fast_start_mttr_target           integer     0(默認值爲0,最大值爲3600,單位秒。表示沒有打開,系統自動採樣出一個時間,用於實例恢復時跑日誌的時間)  
  223. fast_start_parallel_rollback         string  LOW 
  224. SQL> alter system set fast_start_mttr_target=300; 
  225.  
  226. System altered.

 

  1. 觸發完全檢查點 條件
    觸發完全檢查點,促使DBWR 將檢查點時刻前所有的髒數據寫入數據文件。
    另外,一般正常運行期間的數據庫不會產生完全檢查點。

    1. 通過正常事務處理或者立即選項關閉例程時(shutdown immediate 或者
    Shutdown normal).

    2. 當通過設置初始化參數:
    LOG_CHECKPOINT_INTERVAL,
    LOG_CHECKPOINT_TIMEOUT ,
    FAST_START_IO_TARGET 強制時;

    3. 當數據庫管理員手動請求時:
    ALter system checkpoint;
    alter tablespace ... offline;

    4. 每次日誌切換時;
    alter system switch logfile

    注意:
    1. alter system switch logfile也將觸發完全檢查點的發生。
    2. alter database datafile ... offline 不會觸發檢查點進程


    如果是單純的offline datafile,那麼將不會觸發文件檢查點,只有針對offline
    tablespace 的時候纔會觸發文件檢查點,這也是爲什麼online datafile需要media
    recovery而online tablespace不需要。

    觸發增量檢查點
    1. 在聯機熱備份數據文件前,要求該數據文件中被修改的塊從DB_Buffer 寫
    入數據文件中。所以,發出這樣的命令:
    ALTER TABLESPACE tablespace_name BIGEN BACKUP / end backup;
    也將觸發和該表空間的數據文件有關的局部檢查點;

    2. 另外,
    ALTER TABLESPACE tablespace_name READ ONLY;
    ALTER TABLESPACE tablespace_name OFFLINE NORMAL;

    等命令都會觸發增量檢查點。

    對於表空間的offline後再online這種情況,最好做個強制的checkpoint比較好。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章