Thread 1 cannot allocate new log 引起的宕机事故 发生 oracle宕机事故,alert文件中报告如下错误: Fri Jan 12 04:07:49 2007 Thread 1 cannot allocate new log, sequence 187398 Checkpoint not complete 产生此问题的原因分析: CKPT 这个后台进程的就是做 checkpoint 这件事,checkpoint 被触发的条件之一是就发生 redo log switch,Checkpoint 的具体工作包括: • 触发 DBWn 向磁盘写入 Dirty data。 • 把 checkpoint 信息更新到 datafile header 上。 • 把 checkpoint 信息更新到 control file 里。 Checkpoint 做的事情之一是触发 DBWn 把 buffer cache 中的 Dirty cache 磁盘。另外就是把最近的系统的 SCN 更新到 datafile header 和 control file(每一个事务都有一个 SCN),做第一件事的目的是为了减少由于系统突然宕机而需要的恢复时间,做第二件事实为了保证数据库的一致性。 而 redo log switch 就是触发 checkpoint 的主要的事件(event) ,当第一组 redo log 被用完之后,Oracle 就要停止使用当前的 redo log,转而使用另一组 redo log,这就叫做 log switch。而 log switch 触发 checkpoint。 Oracle 要求的最少的 redo group 的是 2 个,但我们一般都建议配置 3 个或 3 个以上 redo log group。假设我们只有两个 redo log group:group 1 和 group 2,并且系统中总是有大量的 dirty block 需要写入 datafile,当我们从group 1 switch to group 2 的时候,会触发 checkpoint, checkpoint 要求 DBWn 把buffer cache 中的 dirty block 写入 datafile,然而,当我们再次用完 group 2 里面的空间,需要再次switch to group 1 并重用 group 1 的时候,如果我们发现redo log group 1 所保护的那些dirty block 还没有完全写入到 datafile,整个数据库必须等待DBWn 把所有的 dirty block 写入到 datafile 之后才能做其他的事情,这就是我们遇到的“checkpoint not complete”问题。这个问题往往暗示了 redo log 的配置有问题,就本例而言,要么是 redo log 太小,要么是像我们这里的 redo log group 太少,只有 2 个。而这个问题的解决方案就是加大redo log 或添加更多 redo log group,不管哪一种解决方案,我们的目的都是给 DBWn 争取更多...