alert日志中含有大量警告信息:“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”。
解决方法:
修改redo日志的大小并添加日志组后问题解决。
set lines 200 pages 300
col member for a60
select a.thread#,a.group#,b.member,b.type,a.status,a.bytes/1024/1024 MB from v$log a,v$logfile b where a.group#=b.group#
union all
select a.thread#,a.group#,b.member,b.type, a.status,a.bytes/1024/1024 MB from v$standby_log a,v$logfile b where a.group#=b.group#;
THREAD# GROUP# MEMBER TYPE STATUS MB
---------- ---------- ----------------------------------------------------------
可以看到,每个redo只有50MB,且每个线程只有两组。
因为redo不能直接修改大小,因而采用先增加大一点的新redo然后删除旧redo的方式。
增加新的redo,因为RAC环境下有多个日志线程,所以在添加日志时必须指定线程号:
每个节点实例用到的联机日志就是一个Redo Thread,单实例有且只有一个Redo Thread。
在RAC环境下,每个节点实例都需要自己的联机日志,也就是每个节点实例都有自己的Redo Thread。
这种每个节点实例一个Redo Thread,该设计是为了避免实例间共享Redo文件引发的竞争,提高系统性能。
RAC数据库通过thread这个参数用来指定节点实例使用的Redo Thread线程号,一般和该实例的INSTANCE_NUMBER参数相同。
通过视图V$LOG的THREAD#列可以确认日志组所属的线程。
alter database add logfile thread 1
group 5 '+DG_ORA/ipcc/redo05.log' size 200M,
group 6 '+DG_ORA/ipcc/redo06.log' size 200M;
alter database add logfile thread 2
group 7 '+DG_ORA/ipcc/redo07.log' size 200M,
group 8 '+DG_ORA/ipcc/redo08.log' size 200M;
当原日志组的状态为 INACTIVE 时方可删除
删除日志组的命令如下:
alter database drop logfile group N;
#其中N对应GROUP#
如果redo的状态不是INACTIVE,可以执行如下两条sql切换redo
alter system switch logfile;
alter system checkpoint;
然后删除旧的redo
alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
alter database drop logfile group 4;
数据库中删除之后,物理文件并没有被删除,手动删除对应的redo物理文件
db1:~# su - grid
grid@db1:~> asmcmd
ASMCMD> ls
redo01.log
redo02.log
redo03.log
redo04.log
redo05.log
redo06.log
redo07.log
redo08.log
spfileipcc.ora
ASMCMD> rm redo01.log
ASMCMD> rm redo02.log
ASMCMD> rm redo03.log
ASMCMD> rm redo04.log
删除完成后,再增加新的redo
alter database add logfile thread 1
group 1 '+DG_ORA/ipcc/redo01.log' size 200M,
group 2 '+DG_ORA/ipcc/redo02.log' size 200M;
alter database add logfile thread 2
group 3 '+DG_ORA/ipcc/redo03.log' size 200M,
group 4 '+DG_ORA/ipcc/redo04.log' size 200M;
验证结果
set lines 200 pages 300
col member for a60
select a.thread#,a.group#,b.member,b.type,a.status,a.bytes/1024/1024 MB from v$log a,v$logfile b where a.group#=b.group#
union all
select a.thread#,a.group#,b.member,b.type, a.status,a.bytes/1024/1024 MB from v$standby_log a,v$logfile b where a.group#=b.group#;