一、描述

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐