• Oracle连接数过多释放机制


    sqlplus /nolog 
     打开sqlplus  
      
      
     connect /as sysdba  
     使用具有dba权限得用户登陆oracle  
       
      
     show parameter resource_limit 
     显示资源限定是否开启,value为true是开启,为false是关闭  
     
     alter system set resource_limit=true 
     如果未开启,则使用此命令开启资源限定功能  
      
       
     create profile profileName limit connect_time 60 idle_time 30 
     创建profile文件,profileName任意起,connect_time设置连接超过多少分钟后强制释放,idle_time设置连续不活动的会话超过多少分钟后强制释放  
     
     alter user oracleUser profile profileName 
     将profile文件作用于指定用户 

    从上周起,服务器Oracle数据库出现问题,用不到半天,就会报maxsession(150)的问题,肯定是数据库的会话超过最大数了。

      由于服务器跑的是文件传输应用,占用的请求和会话肯定很大,因此用户数不大就已经让oracle的会话数达到最大值。

      处理方式不外乎两种:扩大oracle最大session数以及清除inactive会话,当然还有,就是从数据库连接池和程序bug上面下手。

    从各处收集了一些查看当前会话的语句,记录一下:

    1.select count(*) from v$session;

      select count(*) from v$process;

      查看当前总会话数和进程数,这两个视图就是跟会话及进程有关的重要视图啦,信息都是从这里面取的。

    2.查询那些应用的连接数此时是多少

    select  b.MACHINE, b.PROGRAM , count(*) from v$process a, v$session b where a.ADDR = b.PADDR and  b.USERNAME is not null   group by  b.MACHINE  , b.PROGRAM order by count(*) desc;

    3.查询是否有死锁

    select * from v$locked_object;

    如果查询结果为no rows selected,说明数据库中没有死锁。否则说明数据库中存在死锁。

    接下来说明一下会话的状态:

    1.active 处于此状态的会话,表示正在执行,处于活动状态。

    2.killed 处于此状态的会话,表示出现了错误,正在回滚,当然,也是占用系统资源的。还有一点就是,killed的状态一般会持续较长时间,而且用windows下 的工具pl/sql developer来kill掉,是不管用的,要用命令:alter system kill session 'sid,serial#' ;

    3.inactive 处于此状态的会话表示不是正在执行的,比如select语句已经完成。我一开始以为,只要是inactive状态的会话,就是该杀,为什么不释放呢。其 实,inactive对数据库本身没有什么影响,但是如果程序没有及时commit,那么就会造成占用过多会话。解决inactive的方法最好的就是在 oracle中直接设置超时时间,也是有两种方法,区别暂时还不清楚:

    1.修改sqlnet.ora文件,新增expire_time=x(单位是分钟)  

    我的sqlnet.ora位置在D:/oracle/ora92/network/admin

    2.通过ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10; 命令修改,记得重启下oracle。

    修改ORACLE 中的SESSION和PROCESS

    会话sessions和进程pocesses的关系
    一个process可以有0个、1个或者多个session,一个session也可以存在若干个process中,并行同样是一个session对应一 个process,主session是coordinator session,每个parallel process同样会对应数据库里一个单独的session。可以从v$px_session和v$session中验证这点。
    连接connects,会话sessions和进程pocesses的关系

    每个sql login称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式,一个会话对应一个服务器进程(process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。

    Oracle的sessions和processes的数量关系是:sessions=1.1 * processes + 5

    下面我们用两种方法修改PROCESS的最大值
    一、通过Oracle Enterprise Manager Console在图形化管理器中修改
    以系统管理员的身份登入,进入界面 数据库的例程 - 配置 - 一般信息 - 所有初始化参数,修改processes的值

    二、在SQLPLUS中修改
    以DBA权限登录,修改PROCESS的值(SESSION的值会跟着改);创建pfile;重新启动数据库。输入的SQL命令如下,回显信息省略了
    SQL> connect sys/sys as sysdba
    SQL> alter system set processes=400 scope = spfile;
    SQL> create pfile from spfile;
    SQL> shutdown immediate;
    SQL> startup

  • 相关阅读:
    sftp上传到远程服务器
    mysql 的 find_in_set函数使用方法
    wamp2.5 局域网无法访问问题
    JS图片上传预览
    select2的相关问题
    linux 更新源miss问题
    freeMarker遍历map的正确方式
    Input类型是checkbox时checked属性获取
    Java 内存区域划分 备忘录
    简单聊聊java中如何判定一个对象可回收
  • 原文地址:https://www.cnblogs.com/liqing1009/p/12714780.html
Copyright © 2020-2023  润新知