4.3.3 CKPT进程

CKPT进程的功能是发出检查点。检查点是一种数据库事件,当数据库服务器发生检查点时,SCN将被写入数据文件和控制文件,而且数据库高速缓存中的脏缓冲区将被DBWR进程写入数据文件,这时数据库达到完全一致的状态。

我们知道,数据库服务器是依靠SCN来维护数据文件、控制文件和重做日志文件之间的一致状态的。如果一个事务没有提交,脏缓冲区及重做日志缓冲区中的内容可能已经被写入了数据文件和重做日志文件。这时如果数据库服务器发出检查点,三种文件的SCN达到一致,数据库达到一种一致状态。但这三种文件中记录的是该事务之前的SCN。数据库服务器如果重新启动,这个事务将被回滚,因为它处于最后一个SCN之后。

如果事务被提交,新的SCN将首先被写入重做日志文件,这时数据库服务器如果发出检查点,新的SCN被写入数据文件和控制文件,三种文件的SCN完全相同,数据库达到一致状态,在这种情况下,数据库服务器在重新启动时就不需要进行实例恢复。相反,如果没有发出检查点,那么在数据文件和控制文件中保持原来的SCN。如果系统断电,数据库服务器在重新启动时,将进行实例恢复,两个SCN之间的所有事务将被重新执行一次,使数据库达到一致状态。

CKPT进程的任务有两个:一是通知DBWR进程,将数据库高速缓存中所有脏缓冲区写入数据文件,二是发出检查点,将SCN的值写入数据文件和控制文件的头部。可见,当数据库服务器发出检查点时,将带来大量的磁盘I/O,因此,应该尽量减少检查点的发生。

CKPT进程在以下几种情况下被启动执行:

·正常关闭数据库服务器时。

·进行日志切换时。

·手工发出检查点(执行ALTER SYSTEM CHECKPOINT命令)。

·由初始化参数LOG_CHECKPOINT_TIMEOUT和LOG_CHECKPOINT_INTERVAL指定的时机来到时。

与检查点的发生时机有关的两个初始化参数为:

·LOG_CHECKPOINT_TIMEOUT:用于指定两个检查点之间的时间间隔(以秒为单位)。Oracle 11g中这个参数的默认值为1800,即30分钟。如果设置为0,将取消固定时间间隔方式的检查点。

·LOG_CHECKPOINT_INTERVAL:这个参数指定了一个操作系统块的数目,可以看做是检查点在空间上发生的间隔。当往重做日志缓冲区中写入指定块数的重做日志时,将发出检查点。

在管理数据库时,应该为检查点设置合理的时间、空间间隔。如果间隔太大,对数据文件的写操作次数将减少,数据文件与重做日志文件的SCN将相差较大,在系统断电时,进行实例恢复的时间将加长。反之,如果间隔太小,磁盘写操作将被频繁执行,数据库的性能将降低,但这样做的好处是,在系统断电时实例恢复的时间将被缩短。

现在以一个不合理的检查点间隔的例子来说明如何消除不必要的检查点。假设操作系统块的大小为1024字节,初始化参数LOG_CHECKPOINT_INTERVAL的值为4608,重做日志文件的大小为10MB。那么每当向重做日志文件中写入1024×4608=4.5MB的重做日志时,数据库服务器将发出检查点。这样在两个检查点之后,重做日志文件将被写满9MB。如果再写入1MB,就会进行日志切换,并自动发出一个检查点。这样最后两个检查点的间隔仅为1MB,显然间隔太短。所以在设置LOG_CHECKPOINT_INTERVAL参数时要考虑重做日志文件的大小,尽量将一些检查点与切换日志时发出的检查点合并。