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比较好。

 

你可能感兴趣的:(oracle,checkpoint)