某互联网公司Oracle数据库突然宕机,运维人员给的信息是数据库无法连接,并报出了ORA-01034和ORA-27102的错误,如下图所示:
接着让运维人员把Oracle的告警日志发来,查看该数据库的告警日志后没有发现含有shutdown的任何信息(说明Oracle的实例还有Open状态),却发现告警日志中有大量的“Thread 1 cannot allocate new log, sequence 320xx Checkpoint not complete”。
现象说明:
触发checkpoint条件其中有一条是redo切换时,观察告警日志发现大量的日志切换动作,说明该checkpoint就是由redo日志切换造成的,而checkpoint会触发DBWn将data buffer cache中的dirty block刷到datafile中,而checkpoint not complete说明data buffer cache中的dirty block还没有写到datafile中redo就又要切换,就会出现“Thread 1 cannot allocate new log”。
解决方法:
让运维人员在Oracle数据库服务器端登录,将redo日志加大,并增加日志组的数量
添加日志组:
alter database add logfile group 4 ('/data/oradata/orcl/redo04.log') size 500m;
alter database add logfile group 5 ('/data/oradata/orcl/redo05.log') size 500m;
alter database add logfile group 6 ('/data/oradata/orcl/redo08.log') size 500m;
查看当前日志组的大小及状态:
select group#,sequence#,bytes,members,status from v$log;
当原日志组的状态为 INACTIVE 时删除再添加成500M的redo file;
删除日志组的命令如下:
alter database drop logfile group n;
修改redo日志的大小并添加日志组后问题解决。