记录oracle数据库连接满的解决办法

本文详细讲述了数据库连接问题的诊断与解决,包括检查归档日志满载、连接数过多导致的性能瓶颈,提供了解决方案如暂停项目进程、使用存储过程清理闲置连接和调整连接数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、描述

数据库突然连不上,检查:
1、如果全部用户都连不上,有可能是归档日志满了,需要删除归档日志。
2、如果部分用户可以连上,并且很慢,则有可能就是连接数满了。

二、连接数满
分析:
1、有可能是数据库操作一直没释放。
2、项目使用数据库连接池,数据库连接池超时。

三、解决办法

1、可以先停止部分项目的进程。
2、直接杀掉数据库的连接数。
3、增大数据库连接数。

四、数据库连接数操作
1、用sys角色登录数据库(ps命令:sqlplus sys/密码 as sysdba)。
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;

如下图:
在这里插入图片描述
可以看到所有连接的机器、程序、连接数量。(我这里有本地电脑,服务器等连接)。

五、杀掉连接数的方法
1、找到最多的连接数机器名:

select 'alter system kill session ''' || sid || ',' ||serial# || ''' immediate;' sql,username,program,machine,status from v$session where machine ='机器名称'

这个语句可以自动拼接杀掉连接数的sql语句,就是第一个sql列:
在这里插入图片描述
可以全部复制出来,然后批量执行就行了。这里杀的连接数都是INACTIVE类型的,被杀掉的状态会不一样。

六、存储过程方法

1、如果想定时清理INACTIVE会话,我们要创建一个存储过程找出超过2小时(可以根据自身项目需求设定)的会话,然后断开会话,具体如下:

CREATE OR REPLACE PROCEDURE DB_KILL_IDLE_CLIENTS AUTHID DEFINER AS
  job_no       number;
  num_of_kills number := 0;
BEGIN
 
  FOR REC IN (SELECT SID, SERIAL#, INST_ID, MODULE, STATUS
                FROM gv$session S
               WHERE S.USERNAME IS NOT NULL
                 AND S.LAST_CALL_ET >= 2 * 60 * 60
                 AND S.STATUS = 'INACTIVE'
               ORDER BY INST_ID ASC) LOOP
    DBMS_OUTPUT.PUT('LOCAL SID ' || rec.sid || '(' || rec.module || ')');
    execute immediate 'alter system disconnect session ''' || rec.sid || ', ' ||
                      rec.serial# || '''immediate';
   
    DBMS_OUTPUT.PUT_LINE('. killed locally ' || job_no);
    num_of_kills := num_of_kills + 1;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('Number of killed system sessions: ' ||
                       num_of_kills);
END DB_KILL_IDLE_CLIENTS;

2、创建定时任务执行这个存储过程:

begin
  sys.dbms_job.submit(job       => :job,
                      what      => 'SYS.DB_KILL_IDLE_CLIENTS;',
                      next_date => to_date('29-04-2021 17:00:00',
                                           'dd-mm-yyyy hh24:mi:ss'),
                      interval  => 'TRUNC(sysdate,''hh'') + 1/(24)');
  commit;
end;

然后就没有然后了。。。

增加数据库连接数: https://blog.csdn.net/code_ang/article/details/116273312

### Oracle 数据库连接数配置与优化 #### 一、查询最大连接数和当前连接数 为了了解Oracle数据库允许的最大连接数以及当前已建立的连接数量,可以通过查询动态视图`v$parameter`来获取这些信息。具体命令如下: ```sql -- 查询数据库允许的最大连接数 SELECT value FROM v$parameter WHERE name = 'processes'; ``` 此命令返回的结果即为数据库能够支持的最大并发进程数目,而每一个用户会话通常对应着一个进程[^3]。 对于监控实时在线的会话数,则可执行下面这条语句: ```sql -- 查看当前活跃会话的数量 SELECT COUNT(*) AS active_sessions FROM v$session; ``` 这有助于管理员评估系统的负载状况并据此做出相应的调整决策。 #### 二、修改最大连接数 当现有设置无法足业务需求时,可能需要增加最大连接数以适应更高的并发访问量。更改这一参数涉及到了全局初始化文件中的`processes`项,其操作方式如下所示: ```sql ALTER SYSTEM SET processes = 800 SCOPE=SPFILE; ``` 这里需要注意的是,由于该变更影响到整个实例层面的基础架构资源分配策略,因此建议谨慎行事,并且只有在充分测试之后才应用于生产环境之中。另外,在完成上述指令后还需要重启数据库服务才能使新的设定生效[^4]。 #### 三、连接池的选择及其作用 除了直接调节服务器端所能承载的最大客户端链接限额之外,合理选用适合应用层特性的连接池组件同样重要。常见的几种选择有: - **UCP (Universal Connection Pool)**: 来自于甲骨文官方推荐的产品之一,具备良好的兼容性和安全性特性; - **HikariCP**: 凭借出色的性能表现受到众多开发者青睐,尤其适配微服务体系结构下的应用场景; - **Apache DBCP** 及 **C3P0**: 虽然相对较为传统但仍被广泛应用,特别是在一些遗留项目里保持着较高的占有率; 通过引入高效的连接管理机制,可以在一定程度上缓解因频繁创建销毁物理链路所带来的开销问题,从而间接提高了整体吞吐能力[^2]。 #### 四、其他注意事项 最后提醒一点,在实施任何有关联度高的改动之前务必先做好备份工作以防万一。同时也要记得清理掉所有现存活动事务再进行必要的停机维护动作,比如采取即时停止(`SHUTDOWN IMMEDIATE`)的方式确保数据一致性不受损害[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值