Oracle修改数据的时候,首先把数据读入内存(data
buffer),在内存里面修改,修改的同时,记录重做日志信息(重做日志实际也有log
buffer,只是日志写入相对是很频繁的,如果log
buffer写入日志文件之前就断电,这些未写入重做日志的数据也是无法恢复的,日志部分这里不做更多研究了)。那么,既然数据在data
buffer中被修改了,它最终是要写入数据文件的,那么oracle是怎么往数据文件写东西的呢?这里,就是检查点的功劳了(实际上,数据写入文件不一定要检查点,但是出于优化恢复的需要,检查点是必不可少的)。
检查点就是一个数据库事件,它由后台进程CKPT触发,通知DBWR进程把脏数据写入磁盘,同时通知CKPT进程更新控制文件和数据文件头信息。一般来讲,检查点更新比重做日志更新慢。对于异常断电,如果检查点越逼近日志文件的最后更新,那么需要恢复的数据就会越少。当然,检查点发生太过频繁,势必会产生过多I/O,影响系统性能。那么,ORACLE要做的就是在考虑让检查点逼近日志文件的最后更新的同时,兼顾数据库的性能。
一、常规检查点:
常规检查点又叫完全检查点,oracle 8之前用的就是这项技术。常规检查点在执行检查点的时候,把全部的data
buffer写入数据文件,工作过程如下:
第一步、 开始checkpoint事件,记录当前scn和当前的checkpoint
rba。
这里谈一下rba:
rba(redo
bytes address),即重做日志块地址(脏块对应的重做日志记录),它包括以下几种RBA:
(1)LRBA,一个块第一次被列入脏列表时候对应的RBA
(2)HRBA,一个脏块最后修改时候对应的RBA
(3)checkpoint RBA,表示检查点发生时当前最后的的重做日志块的地址,上一个checkpoint RBA到当前的checkpoint RBA之间的日志对应的的buffer cache中的脏块接下来将会被写入到数据文件当中去(类似增量检查点的target ,可以作为前滚恢复的起点)。
(4)on disk rba,表示disk中redo log中的最后一条redo recode记录,当实例crash时候,他就是数据库前滚的终点
rba分为三部分,第一部分表示日志文件序列号,第二部分表示日志文件块编号,第三部分表示重做日志记录在日志文件块中的起始偏移。例如rba:(0x12.12392.0),表示日志文件序列号是21,日志文件块编号是ox12392,重做记录在块中偏移值为0。如下所示,如果执行日志切换操作,就会看到当前使用的日志序列号为切换前使用的前那个日志文件的序列号加1,而且当前使用的日志文件序列号总是最大的。
SYS AS SYSDBA >select
group#,sequence#,members,status from v$log;
GROUP#| SEQUENCE#|
MEMBERS|STATUS
----------|----------|----------|----------------
1| 16|
1|INACTIVE
2| 17|
1|INACTIVE
3|18|
1|CURRENT
SYS AS SYSDBA
>alter system switch logfile;
SYS AS SYSDBA
>select group#,sequence#,members,status from v$log;
GROUP#| SEQUENCE#|
MEMBERS|STATUS
--- ------|----------|----------|----------------
1| 19|
1|CURRENT
2| 17|
1|INACTIVE
3| 18|
1|INACTIVE
第二步、 把checkpoint
rba之前的buffer
cache数据全部写入数据文件
第三步、脏块写完后,CKPUT进程用写完那一刻的scn和写完的那个checkpoint
rba更新控制文件和数据文件头信息。也就是说,常规检查点的scn实际是要滞后于发生检查点时候的那个scn的。一旦在写入过程中发生掉电,重启后将要进行回滚恢复?
现在做一个常规检查点实验:
1.
执行下面命令:把检查点日志输入到告警日志
alter system set
log_checkpoints_to_alert=TRUE SCOPE=MEMORY;
2.
执行检查点:
SYS AS SYSDBA
>alter system checkpoint;
3.
查看告警文件
oracle[~/diag/rdbms/hx/hx/trace]$tail
-f alert_hx.log
Wed May 08 21:58:28 2013
Beginning global checkpoint up to RBA [0x20.4eae.10], SCN:
4514520
Completed checkpoin