源库为10.1.153.231 orcl oracle版本:10g
目标库为10.1.153.138 cnpclz1 oracle版本:817
程序使用数据链路反复从源库里面查询数据,插入到目标库里面,调用另一个exe文件进行执行。
项目人员说监听总是停止,查询监听的日志文件,发现大量错误:
08-9月 -2009 22:06:03 * (CONNECT_DATA=(SID=orcl)(CID=(PROGRAM=C:\oracle\product\10.2.0\db_1\bin\emagent.exe)(HOST=GSWTUSJFBJ83QM2)(USER=SYSTEM))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.1.16.211)(PORT=1276)) * establish * orcl * 0
08-9月 -2009 22:06:31 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=__jdbc__)(USER=))(SERVICE_NAME=orcl)) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.1.16.211)(PORT=1279)) * establish * orcl * 12518
TNS-12518: TNS: 监听程序无法分发客户机连接
TNS-12560: TNS: 协议适配器错误
查询网上错误ORA-12518: TNS: 监听程序无法分发客户机连接,可能是如下的原因:客户连接到监听器后,监听器把客户重定向到调度程序端口(很可能不是1521端口),由于操作系统问题,这些连接会被拒绝。如果是java连接oracle的问题,连接出现ora-12518 的问题,查询了服务器仍然是dedicated的连接方式,说是在oracle的监听器LISTENER.ORA头加上
direct_handoff_ttc_LISTENER=off 这么一句话就OK了
DIRECT_HANDOFF_TTC_LISTENER = OFF命令 回收关闭掉长久不用连接
设置监听的跟踪文件
TRACE_LEVEL_LISTENER = USER
TRACE_DIRECTORY_LISTENER = C:\oracle\product\10.2.0\db_1\NETWORK\trace
TRACE_FILE_LISTENER = LISTENER1.trc
同时查看目标库的alert文件,发现出现大量600 7445:
Fri Sep 10 21:16:17 2010
Errors in file c:\oracle\product\10.2.0\admin\cnpclz1\udump\cnpclz1_ora_3116.trc:
ORA-00600: 内部错误代码, 参数: [kksfbc-reparse-infinite-loop], [0x74E7664], [], [], [], [], [], []
Fri Sep 10 22:29:03 2010
Thread 1 advanced to log sequence 178
Current log# 3 seq# 178 mem# 0: C:\ORACLE\PRODUCT\10.2.0\ORADATA\CNPCLZ1\REDO03.LOG
Sat Sep 11 01:00:38 2010
Errors in file c:\oracle\product\10.2.0\admin\cnpclz1\udump\cnpclz1_ora_1576.trc:
ORA-00600: 内部错误代码, 参数: [kksfbc-reparse-infinite-loop], [0x9489F38], [], [], [], [], [], []
Sat Sep 11 01:06:16 2010
Errors in file c:\oracle\product\10.2.0\admin\cnpclz1\udump\cnpclz1_ora_3436.trc:
ORA-07445: 出现异常错误: 核心转储 [ACCESS_VIOLATION] [_kksfbc+12153] [PC:0x832B49] [ADDR:0x28] [UNABLE_TO_READ] []
还有大量类似信息:
Wed Sep 15 11:56:45 2010
Thread 1 cannot allocate new log, sequence 221
Checkpoint not complete
检查监听,确实不再出现12518的错误了
第二步:同时调整应用,修改程序使用绑定变量,同时减少提交的次数:
在pb里面使用绑定变量的方式:
PREPARE SQLSA FROM " insert into t1(rq,xtlb,idlb,id,xh,lxml) VALUES (?,?,?,?,?,?)" using sqlca;
EXECUTE SQLSA using :ist_owc.czrq,:gs_xtlb,:gs_idlb,:ls_code,:li_xh,:ls_data;
在java程序里面要用prepareStatement 进行变量绑定
(但是修改后的程序在对2个表抽取时候出现cpu 100%的情况,后来只能又改回原来的方式,本想跟踪下没继续)
第三步、处理Checkpoint not complete问题
Thread 1 cannot allocate new log, sequence 221
Checkpoint not complete
checkpoint not complete, cannot allocate new log(2007-07-27 14:42:13)
当oracle重用一个日志文件的时候,该日志文件所保护的处于Buffer cache中的脏块(dirty buffer),必须写回磁盘,且必须纪录checkpoint的位置在控制文件和数据文件头。这个过程叫做检查点checkpoint.
发生checkpoint not complete, cannot allocate new log ,表示要重用的日志文件的检查点还没有完成,被日志文件保护的脏块还没有完全被写回磁盘。必须等待该日志文件的checkpoint完成,才可以重新使用该日志文件。
V$LOG中STATUS为Active的,表示日志文件checkpoint未完成,Inactive表示checkpoint完成,current表示为当前LGWR写的日志文件。在实例恢复的时候,oracle需要使用到处于Active和Current状态的日志文件。
当因为检查点没有完成而不能重用日志文件的时候,从v$session_wait中可以看到很多session等待log file switch (checkpoint incomplete)事件,系统基本处于hang的状态。
查询了日志文件,都是1兆的大小,3个日志组:
增加日志组然后增大日志文件:
alter database add logfile group 4 size 25m;
alter database add logfile group 5 size 25m;
alter system switch logfile;
alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
alter database add logfile thread 1 group 1 size 25m;
alter database add logfile group 1 ('d:\oracle\oradata\orcllz\redo01.log') size 25m reuse;
alter database add logfile group 2 ('d:\oracle\oradata\orcllz\redo02.log') size 25m reuse;
alter database add logfile group 3 ('d:\oracle\oradata\orcllz\redo03.log') size 25m reuse;
alter database add logfile group 4 ('d:\oracle\oradata\orcllz\redo04.log') size 25m reuse;
alter database add logfile group 5 ('d:\oracle\oradata\orcllz\redo05.log') size 25m reuse;
四、查看内存的设置,感觉太大,怀疑应用耗尽了内存才会出现ora-7445 ora-600的错误,故缩小内存的应用reparse-infinite-loop:
Data_buffer 1g 缩为 800m
Sga 350m 缩为 300m
五、查询网上,10g有个bug,需要在10.2.0.4版本fixed
内存泄露显示遇到Bug 6494146了,下载了p6810189_10204_Win32.zip这个包
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7177735/viewspace-674946/ ,如需转载,请注明出处,否则将追究法律责任。