Thread 1 cannot allocate new log 故障处理

开发反馈业务系统无法登录,排查了到数据库部分时候,发现日志里有“ Thread 1 cannot allocate new log ”错误,该错误是redo日志组无法切换,初步查看了日志情况,没有可切换空余的日志组。

各种状态含义

CURRENT:指当前的日志文件,在进行实例恢复时是必须的;

ACTIVE:是指活动的非当前日志,在进行实例恢复时会被用到。Active状态意味着,Checkpoint尚未完成,因此该日志文件不能被覆盖。这时也不能drop掉,应该执行alter system checkpoint; –强制执行检查点;然后在操作。

INACTIVE:是非活动日志,在实例恢复时不再需要,但在介质恢复时可能需要。

UNUSED:表示该日志从未被写入,可能是刚添加的,或RESETLOGS后被重置。

查看日志状态

1
2
--查看日志组状态
select group#,sequence#,bytes,members,status from v$log;
1
2
3
--查看当前日志组成员
select * from v$logfile;
select * from v$log;

增加日志组

1
2
3
4
5
SQL> alter database add logfile group 4 ('/u01/app/oracle/oradata/orcl/redo04.log') size 1024m;
SQL> alter database add logfile group 5 ('/u01/app/oracle/oradata/orcl/redo05.log') size 1024m;
SQL> alter database add logfile group 6 ('/u01/app/oracle/oradata/orcl/redo06.log') size 1024m;

切换到新增的日志组上

1
SQL> alter system switch logfile; --可多次执行,直到CURRENT指向新建的日志组

删除日志组

1
2
3
4
-- 只能删除INACTIVE状态日志, 只能从数据库中删除日志,并不删除物理文件,需要手动rm删除系统中的物理文件。
alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;

ps:

查看占用资源较多的进程,根据进程系统进程id查看sql语句;

1
2
3
SELECT addr FROM v$process WHERE spid='418736';
SELECT sql_id FROM v$session WHERE paddr='0000000978F9B0E0'
SELECT sql_text FROM v$sql WHERE sql_id ='0uy9j8b502c4r';

如果遇到复杂的性能问题,还是建议生成awr报告,更加详细的反馈数据库的性能,瓶颈,根据具体项去做优化。

1
SYS@orcl> @?/rdbms/admin/awrrpt.sql

参考链接:

https://www.cnblogs.com/xqzt/p/5034826.html

https://blog.51cto.com/4709096/1741983

独学无友,孤陋寡闻;学习记录,欢迎拍砖!