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

您所在的位置:网站首页 数据库满了怎么清理 记录oracle数据库连接满的解决办法

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

2024-07-12 09:24| 来源: 网络整理| 查看: 265

一、描述

数据库突然连不上,检查: 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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3