oracle 重做日志文件无法自动创建保存问题Thread 1 cannot allocate new log, sequence 233678
Mon Nov 26 09:10:16 2018 Thread 1 cannot allocate new log, sequence 233678 Checkpoint not complete Current log# 1 seq# 233677 mem# 0: D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG Thread 1 advanced to log sequence 233678 (LGWR switch) Current log# 2 seq# 233678 mem# 0: D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG
最近项目的c++程序老是自动停止工作,检查c++日志找到了ORA-03113: 通信通道的文件结尾, 这种错误都是指的oracle的归档日志满了才会报这样的错,
可项目的oracle数据库的归档功能都是关闭的,初步排除归档日志的问题
再次查找资料,找到了oracle运行的日志文件(oracle运行的日志,错误啥的都在这),路径如下:D:\app\Administrator\diag\rdbms\orcl\orcl\trace\alert_orcl.log
打开log搜索error就发现了Thread 1 cannot allocate new log这样的错误,查找资料后,这样的错误是oracle的重做日志文件无法正确切换保存的问题。
根据网上的介绍,多数解决方法为新增几个重做日志文件就可以了
先查询一下oracle的重做日志文件:
select group#,sequence#,bytes,members,status from v$log;
select * from v$logfile;
select * from v$log;
发现有三个重做日志文件,RED001,RED002,RED003状态一个为current,两个为active,没有inactive,也就是说都在使用,没有空闲的,
就考虑是不是重做日志文件太少了
于是以 sqlplus /nolog登陆,conn / as sysdba登陆后,执行了如下命令:
--增加一个名字为RED004.LOG的log文件 alter database add logfile (\'D:\app\Administrator\oradata\orcl\RED004.LOG\') size 50M; --执行一下手动切换日志文件命令 alter system switch logfile;
我按照顺序增加了2个(重做日志文件必须按照顺序增加),也就是说我的重做日志文件为RED001,RED002,RED003,RED004,RED005一共有5个
重做日志路径在D:\app\Administrator\oradata\orcl文件夹下,数据库的dbf也在这
再次执行select * from v$log; 状态如下,有了2个空闲的inactive
再次检查alert_orcl.log日志,没有文章开始的错误了,说明重做日志文件已经正常保存了(下面黑色字体表示重做日志文件已经正常了)
Mon Nov 26 17:02:20 2018
Thread 1 advanced to log sequence 233879 (LGWR switch)
Current log# 3 seq# 233879 mem# 0: D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG
注:新加重做日志文件,不需要停止数据库,直接sqlplus / nolog conn / as sysydba 操作即可
在解决过程中发现alert_orcl.log 太大了我这有240M,打开很慢,
于是直接重命名这个文件,重新建了一个空的,过了一会日志文件就输出到那个空的log里面了,如下图
接上次的问题,oracle重做日志调好了之后,还是会提示通信通道文件末尾错误,有说是服务器防火墙的设置,关闭了数据连接导致这样的问题,于是把防火墙关闭
但仍然出现这样的情况
再找资料说:把D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\sqlnet.ora 里面加一个sqlnet.expire_time=30 目的是设置一个时间
可以用于检测、标记僵死而没有断开会session,再由PMON进行清理,释放资源。开启DCD(DCD: Dead Connection Detection),只需要在服务端的sqlnet.ora文件中添加SQLNET.EXPIRE_TIME参数,单位为分钟。
如果时间达到这个值,server端就是发出一个”probe” packet 给客户端,如要客户断是正常的,这个packet就被忽略,timer重新计时;如果客户端异常中断,则server端就会收到一个消息,用以释放连接。
DCD还可以用于防止防火墙的timeout当client和server在timeout时间内没有数据传输的时候,会话就会被防火墙断开。而设置SQLNET.EXPIRE_TIME参数,使其小于防火墙的timeout时间,就可以避免这一情况的发生。