9.1.2 重做日志文件组的规划
数据库中的重做日志文件是分组的,在一个数据库中至少需要两个日志组,日志组的最大数目由永久性参数MAXLOGFILES限定,这个数目在创建数据库时就已经确定。在数据库中创建多个重做日志组的主要目的是为了对重做日志文件进行归档,因为当数据库正在使用一个重做日志文件时,是不能对它进行归档的,只有当切换到下一个日志组时,才能对它进行归档。其次,使用多个日志组可以节约磁盘空间,如果只有一个日志组,那么所有的重做日志都将被写入这组重做日志文件,文件的大小将无限制地增加,从而消耗大量的磁盘空间。
重做日志是以循环的方式被写入各个重做日志组的。如图9.1所示,当数据库服务器刚开始运行时,重做日志被写入第一个日志组,当第一个日志组中的重做日志文件被写满时,数据库服务器将自动切换到第二个日志组,重做日志将接着被写入第二个日志组,依此类推。当最后一个日志组被写满后,数据库服务器将自动切换到第一个日志组,这样重做日志便被写入第一个日志组。当数据库服务器再次使用一个日志组时,这组重做日志文件中以前的内容将被新的重做日志覆盖。
图 9.1 重做日志组
在对重做日志文件进行规划时,应该选择合适的日志组数目。如果日志组太多,可能会消耗太多的磁盘空间。如果日志组太少,可能会影响数据库的性能。如果数据库处于归档日志模式下,当数据库服务器切换到下一个日志组时,ARCH进程要对刚刚使用过的日志组进行归档。如果归档的速度较慢,或者数据库服务器写日志的速度较快,那么可能在日志归档还没有结束时,数据库服务器又切换到了这个日志组。当数据库服务器试图使用一个尚未归档或者归档未结束的日志组时,LGWR进程将被阻塞,用户事务将无法执行,直到归档结束。
如果在数据库中有上述情况发生,在数据库的警告文件中将产生这样的警告信息:“checkpoint incomplete”。虽然这种情况持续的时间并不长,但是对数据库性能的影响是比较大的。解决这种问题的最直接的办法是在数据库中增加日志组,或者将目前的重做日志文件替换为更大的文件。
重做日志组数目的选择需要一定的经验,数据库管理员可以在数据库的运行过程中不断观察,在不影响LGWR进程工作的前提下,将日志组的数目设置为最小的可能值。
如果发生了LGWR进程被阻塞的情况,在警告文件和LGWR进程的跟踪文件中将产生相应的信息。数据库管理员在设置重做日志组时,可以不断观察这个文件的内容,以判断是否有这种情况发生。
现在以一个实际的例子来说明重做日志组太少,或者重做日志文件太小对数据库系统所造成的不利影响。在某个实际的生产系统中,数据库管理员经常接到用户的抱怨。在业务最繁忙的时段内,用户进程向数据库中写入一行数据需要等待50秒左右。通过对数据库进行诊断后发现,在该数据库中每天大约产生3GB的重做日志,而数据库中当时只有三个重做日志组,每个组中的成员只有50MB。通过进一步对重做日志文件的归档情况进行观察发现,在业务最繁忙的时段内,一个重做日志组被写满所用的时间大约为2分钟,而对一个重做日志组进行归档所用的时间大约为4分钟,而且在警告文件中有大量的警告信息:“checkpoint incomplete”。
在找到问题发生的原因后,解决这个问题就很简单了。在该数据库中另外增加了6个重做日志组,每个日志组的日志成员大小为200MB,然后删除了以前的三个重做日志组,这个问题基本上就解决了。