一 问题描述
有同事反馈,oracle数据库登录很慢,业务也受影响,页面打不开或者很缓慢。
告警日志有如下报错:
Thread 1 cannot allocate new log, sequence 24954
Checkpoint not complete
awr报告里也看到有该等待事件:
二 问题排查
2.1 查看redo log的大小及状态
select * from v$log;
如果status都是ACTIVE或者CURRENT,没有INACTIVE或者unused,说明日志很紧张,不够用。
redo logfile的status为active,代表checkpoint还未完成,如果日志文件循环使用再次到达该文件,数据库将处于等待的停顿状态。
日志文件必须等待DBWR完成检查点触发的写操作之后才能被覆盖。
三 解决办法
3.1 新建日志组
#新建日志组
alter database add logfile group 10 '+DATA/yjt/onlinelog/group_10_1.log' size 5g;
alter database add logfile group 11 '+DATA/yjt/onlinelog/group_11_1.log' size 5g;
……
# 删除较小的日志组
当该日志组为INACTIVE状态时,将其删除:
alter database drop logfile group 2;
#检查确认
#查看redo log状态
select * from v$log;
确保状态不再都是ACTIVE或者CURRENT。
#切换日志
alter system switch logfile;
验证该sql是否能很快执行完成。
#检查告警日志是否还有该报错
略
3.2 查看AWR报告里的Segments by DB Blocks Changes
/*
如果新建完日志组后,还是不行,则检查下Segments by DB Blocks Changes。示例:
看下是哪个对象的DB Block Changes比较多,则具体对其进行分析优化或者将该业务迁移隔离,避免影响整体业务。
*/
3.3 增加dbwr进程
调大db_writer_processes参数值