数据库top5 events里Log file switch(checkpoint incomplete)等待事件排在了第一位。
oracle日志切换会产生一个增量检查点,但这个检查点,不同于alter system checkpoint,后者会启动dbwn进程,将内存中的已修改的数据立即写入数据文件。但前者不会,前者只需要保证整个日志组一轮切换后,比如日志组2,切换到3,然后1,在到第二组的时候,必须将“脏”数据写入数据文件(因为如果此时还没有写入数据库,再次由1切换到2的时候,假设此后实例崩溃,就造成数据的丢失)。
检查点的工作职责是通知dbwn写数据,更新某些数据文件头信息,更新控制文件信息。既然是日志切换时检查点未完成。那么基本上就是日志切换了一圈,dbwn进程还没有完成工作。由此可见原因如下
1.日志文件过小
2.日志组过少
3.dbwn进程工作的慢 (oracle11g中db_write_process参数是cpu数/8得来的,一般情况下不去修改此参数)
通过查看 v$log 视图发现日志组切换过于频繁,差不多5s左右。改进方案,采用大的日志文件并增加日志组。
增加日志组
alter database add logfile group 4 '? REDO04.LOG' size 1g;
最终是加了4组1g的日志文件
alter system switch logfile;
alter database drop logfile group 1;
对于要删除的日志组,除了当前组不能删除,还有一种active状态下的文件组不可删除,因为该日志组的信息还没有完成checkpoint。
alter system checkpoint;
在切换日志删除