Oracle连接数过多释放机制

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

时间: 2024-11-05 14:48:44

Oracle连接数过多释放机制的相关文章

《oracle每日一练Oracle DBLink连接数过多的问题(Ora-02020)》

本文转自Oracle DBLink连接数过多的问题(Ora-02020) 今天在处理资料同步问题,需要将其它几个DB Server的资料同步到一个目地资料库,采用的方式是:DBLink+Job ,然而在写过程编译时发生Ora-02020错误. 如下: 环境: 目地Server(别名:DB) 其它需要同步的Server(  DB1 , DB2,  DB3,  DB4  ,DB5) 做法: 建立各个Server的DB Link,然后在过程中同步相关的数据. 如代码: 1 create or repl

Mycat占用mysql连接数过多

背景:mariadb,mycat中间件.问题:DB连接数过多:开发使用程序使用连接池连mycat:DB待优化项: interactive_timeout,wait_timeout 都是8小时默认值.mycat配置:100个分片库,和其他业务库.现在分片库用到16分片,后面尚未使用.当前DB最大连接数:3000mycat 版本:当前线上的mycat版本是1.5.8版本,推荐以后线上使用最稳定的 mycat1.6.5版本. 经DB和开发碰面了解 这两个timeout时间不能缩短,所以常规的优化手段不

linux内存管理及手动释放机制

inux系统中查看内存状态一般都会用到free linux的free命令中,cached和buffers的区别 Free Mem:表示物理内存统计 -/+ buffers/cached:表示物理内存的缓存统计 Swap:表示硬盘上交换分区的使用情况 系统的总物理内存:8098060 8Gb,但系统当前真正可用的内存并不是第一行free 标记的6054972Kb,它仅代表未被分配的内存. 我们使用total1.used1.free1.used2.free2 等名称来代表上面统计数据的各值,1.2

Cocos2d-x内存自动释放机制--透彻篇

首先在架构里面需要明白,如果使用new创建对象的话,我们需要自己释放内存,如果直接用引擎提供的警静态方法,我们可以不做内存管理,引擎自动处理,因为引擎背后有一个自动释放池.通过查看源码可以知道,每个静态方法都会调用autorelease()方法.如果我们需要引擎自动释放一个对象,创建后可以调用该对象的autorelease()(前提是该对象所属类继承自CCObject),该方法会把当前对象放入自动释放池中,每次帧过渡时都会去遍历检查是否可以释放掉该对象的内存. 源码如下: // 创建一个精灵对象

ZooKeeper客户端连接数过多

ZooKeeper限制客户端连接数 问题: 最近发现ZooKeeper服务器上的连接数过多,都是连接zookeeper的. 解决方案: 通过查询分析,发现zookeeper的一个客户端使用有问题,创建的连接过多导致的. zookeeper有没有相应的功能能做下限制呢? 查看zookeeper的配置参数,可以发现zookeeper的可以通过相应的配置来限制某ip的连接数. maxClientCnxns 这个配置参数将限制连接到ZooKeeper的客户端的数量,限制并发连接的数量,它通过IP来区分不

mysql连接数过多 解决方案

mysql 默认链接数是100个 最大是16384. 原则:想尽一切办法不重启 导致原因: 出现这种错误明显就是 mysql_connect 之后忘记 mysql_close:当大量的connect之后,就会出现Too many connections的错误,mysql默认的连接为100个,而什么情况下会出现这种错误呢? 正常的mysql_connect 之后调用 mysql_close()关闭连接但在连接错误时,会者mysql_real_query()出现错误退出时,可能忘记mysql_clo

mysql连接数过多解决方案

mysql 默认链接数是100个 最大是16384. 原则:想尽一切办法不重启 导致原因: 出现这种错误明显就是 mysql_connect 之后忘记 mysql_close:当大量的connect之后,就会出现Too many connections的错误,mysql默认的连接为100个,而什么情况下会出现这种错误呢? 正常的mysql_connect 之后调用 mysql_close()关闭连接但在连接错误时,会者mysql_real_query()出现错误退出时,可能忘记mysql_clo

关于Oracle E-Business Suite并发处理机制(Current Processing)

2012年写过一篇关于Oracle E-Business Suite并发管理器的文章,回头看之前总结的内容还是比较单薄,很多点没说到,最近在看这块的内容,索性再写一篇稍微完整的文章来. Oracle E-Business Suite并发处理机制(Current Processing)的好处 区别于普通功能的处理机制,并发处理机制其实是一个异步处理机制,它把程序放到后台来运行,前台的操作还给用户,允许用户可以继续做其他业务. 技术上将,异步处理的好处是降低系统特定时间点的负载,提升系统资源的整体使

Zabbix监控Oracle 连接数

监控Oracle 连接数 使用python脚本编写脚本,监控oracle连接数:连接Oracle需要安装cx_Oracle模块,安装完成后检查是否正常,没有任何信息返回即正常: python -c "import cx_Oracle" 通常,还需要加载oralce的客户端配置环境和库 libclntsh.so.11.1 libnnz11.so 1.编写用于检查Oracle当前连接数.最大连接数的python脚本:zabbix_check_process.py #!/usr/bin/py