oracle数据库报“关闭的连接”1.问题背景近期有些私有云客户项目上线后,有不少客户反映,U8C服务使用一段时间后,会出现登不上的情况,但是重启以后环境又可以正常操作了。经统计发现,反映这些问题的客户都是使用oracle数据库,并且在出现登录不上的情况时,后台都在频繁抛出“关闭的连接”的错误。2.问题解决2.1日志排查数据库类型及版本:Oracle11.2.0.1通过查找U8C的日志,发现里面最后的报错最后只到“关闭的连接”,只显示到有一瞬间,U8C跟Oracle数据库的链接全部切断,并且无法重新连接。此瞬间后,虽然U8C的服务显示正常,但是所有的操作已无法继续进行。重启后,客户业务可以重新正常进行。这次正好碰到一客户重现了该问题,然后迅速连上了客户的数据库服务器,查看Oracle数据库的alert.log,发现了在客户反馈应用无法使用的时间节点,数据库抛出了以下报错:ORA-00600:内部错误代码,参数:[kkqctmdcq:QueryBlockCouldNotbeCopied!]然后根据日志中提示的具体日志路径找到对应日志,内容如下:发现该问题的产生是因为,Oracle数据库在运行咱们的sql脚本的时候,直接产生了ORA-00600的报错。2.2问题解决看到这条sql后,我将这条sql粘贴了出来,此时我怀疑可能有两个原因产生:用友网络科技股份有限公司1.数据错误;2.数据量过大;然后我把客户的数据拿到了咱们本地,进行恢复,恢复完成后运行这条sql发现,竟然可以执行,并且执行完成数据是0条!瞬间怀疑的原因全部被否定了。遇到这种情况以后,我以为是偶然,然后我又去客户的服务器上执行了这条sql发现还是报原来的错。此时对比两台数据库的差异只有Oracle的版本不一样,客户的是11.2.0.1,咱们的是11.2.0.4。此时猜测是oracle自己的bug导致,为了确定这一猜测,我又找了个11.2.0.1的库,将数据导入后,执行sql发现,会出现同样的错。最终确定,该问题由Oracle本身bug导致。2.3解决方案通过Oracle的售后官网找到了该bug,确定是需要修改一个Oracle11.2.0.1里面的隐含参数“"_fix_control"="7499258:off"”,既可以解决该问题。在Oracle11.2.0.1的测试库上运行:SQL>altersystemset"_fix_control"="7499258:off"scope=both;Systemaltered更改完成后,重新运行sql,sql可以执行成功,不再报错。3.总结这两年Oracle的数据库更新很快,有很多客户或者实施都还在使用的是Oracle11.2.0.1版本的数据库,这版本算是Oracle11.2序列里面最不稳定的版本,以上问题也是出现在此版本,建议如有条件是否可以建议客户直接使用Oracle11.2.0.4版本。也就是此问题有两种解决办法:1.升级数据库。将Oracle数据库从11.2.0.1版本升级到11.2.0.4;2.修改“"_fix_control"="7499258:off"”参数,命令如下:SQL>altersystemset"_fix_control"="7499258:off"scope=both;Systemaltered另附:1.导致该问题的sql如下:selectDISTINCTgl_voucher.pk_corp,gl_detail.pk_detail,gl_voucher.pk_voucher,gl_voucher.prepareddate,gl_detail.explanation,gl_detail.localdebitamount,gl_detail.localcreditamount,gl_voucher.pk_vouchertype,用友网络科技股份有限公司gl_voucher.pk_prepared,gl_detail.pk_accsubj,gl_voucher.no,gl_cashflowcase.moneymain,gl_cashflowcase.pk_currtype,bd_currtype.currdigit,gl_voucher.pk_glorgbook,gl_detail.assid,gl_detail.pk_currtypefromgl_detailleftouterjoingl_voucherongl_voucher.pk_voucher=gl_detail.pk_voucherleftouterjoingl_cashflowcaseongl_detail.pk_detail=gl_cashflowcase.pk_detailandgl_cashflowcase.pk_cashflow='0001F810000000000II4'leftouterjoinbd_currtypeon(gl_cashflowcase.pk_currtype=bd_currtype.pk_currtypeor(gl_cashflowcase.pk_currtypeisnullandgl_detail.pk_currtype=bd_currtype.pk_currtype))wheregl_voucher.discardflag='N'andgl_voucher.dr=0andgl_voucher.errmessageisnullandgl_voucher.voucherkind<>2andgl_voucher.voucherkind<>255andgl_cashflowcase.pk_detailISNOTNULLandgl_voucher.pk_manager<>'N/A'andgl_voucher.pk_glorgbook='0001F810000000000BFB'andgl_voucher.prepareddate>='2018-09-01'andgl_voucher.prepareddate<='2018-09-30'orderbyprepareddate,pk_vouchertype,no2.查询隐含参数的sql如下(需要sysdba用户):selectx.ksppinmname,y.ksppstvlvalue,y.ksppstdfisdefault,decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE')ismod,decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE')isadjfromsys.x$ksppix,sys.x$ksppcvywherex.inst_id=userenv('Instance')andy.inst_id=userenv('Instance')用友网络科技股份有限公司andx.indx=y.indxandx.ksppinm='_fix_control'orderbytranslate(x.ksppinm,'_','')用友网络科技股份有限公司