我设了oracle的processes数为300,但是现在发现我的一个应用模块存在连接泄露,占用了大量连接,但所有的后台进程和服务进程加起来是298个,就不能再也连接进去了,不知道是怎么回事?
是不是oracle有预留连接?
我现在想通过sqlplus连上去看看,但是sqlplus / as sysdba连接不上。
在这种情况下我是否还可以通过sqlplus连上数据库?否则的话我连到底是哪个客户端进程发生异常产生了那么多服务进程都不知道啊。

解决方案 »

  1.   

    kill 掉占用CPU最大的oracle 进程就可以了
      

  2.   

    在oracle的安装目录下:%oracle_home%\admin\orcl\pfile\有一个init.ora文件
    lz把这个文件的processes的值再改的大一些,看看能用sqlplus登陆吗
      

  3.   

    看是否有Inactive的连接
    如有就kille掉
    顺便说一下,既然有泄漏,应该把这个源头堵上
    而不是去改连接数
      

  4.   

    你们都没有理解我的意思,我就是要做一个监控程序,监控我的应用是否有连接泄露,如果连接泄露了,当然如果虽然泄到290了,但业务还在正常跑,我当然不想这时候就做什么极端操作,顶多是报个告警出来,如果告警没人处理,连接继续泄露达到最大了,这样就会影响我的业务运行了,监控到这种糟糕情况时我希望能有一种正常的手段将数据库shutdown掉重启一下,而不是kill掉。
    虽然我没有搞过DB2不过听我一个同事说db2是有类似功能的,即不需要登陆到数据库中就可以通过某条命令关闭数据库。
    oracle没有么?一定要sqlplus连上去?
      

  5.   

    悖论就在这里,连接全被我的客户端程序占完了,sqlplus根本登不上去,我怎么查哪个是Inactive的?
      

  6.   

    找oracle专家搞清楚了,oracle不提供我说的那种功能,这种情况下就只能kill了。
    但实际上我认为这是oracle做的不妥的地方,因为在这种情况下我很可能很想搞清楚是哪个客户端进程申请了这么多服务进程连接,但不让登陆就查不了。非得kill掉很不爽。
    而且这样数据库也不是正常关闭的。
      

  7.   

    1.只是kill掉几个session,又没叫你去kill ORACLE的后台进程,数据库怎么会DOWN掉?何来“而且这样数据库也不是正常关闭的”2.“因为在这种情况下我很可能很想搞清楚是哪个客户端进程申请了这么多服务进程连接”、
    你用OS的命令看进程是可以看到哪个客户机连接的。
      

  8.   

    ps查看进程,加个|oracle就知道哪些oracle的进程连接上来
    kill点一个,登录上去再仔细查看不久清楚了
      

  9.   

    试试alter system kill session
      

  10.   

    我说的这些都是要写成自动脚本的,我现在是吧ps出来的oracle进程全部都干掉了,因为我觉得随便找几个服务进程kill掉再连上去shutdown,与直接kill掉关键进程也没什么区别,而最重要的是,你怎么预测你程序的异常,连接泄露时有可能极短时间内就能把连接泄露完,那就很可能kill了几个服务进程还没等再登上sqlplus时就已经有泄露干净了,这时如何处理?
    另外ps只能看到客户端进程和服务端进程,并不能得知客户端进程和服务进程的对应关系,我又不是只有一个客户段进程,不等数据库如何判断哪些服务端进程是这个客户端申请的?