记录oracle数据库连接满的解决办法 |
您所在的位置:网站首页 › 数据库满了怎么清理 › 记录oracle数据库连接满的解决办法 |
一、描述 数据库突然连不上,检查: 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列: 六、存储过程方法 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 |