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时间,就可以避免这一情况的发生。

 

版权声明:本文为-txf-原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/-txf-/p/10021721.html