1. 查看失效的连接数

  1. SELECT count(*) FROM gv$session WHERE inst_id = 1 and status = 'INACTIVE'

Oracle失效链接清理 - 图1

2. 查看总连接

SELECT count(*) FROM gv$session WHERE inst_id = 1

Oracle失效链接清理 - 图2

3. 查看失效链接

SELECT SID, SERIAL
    MODULE, STATUS
    FROM V$SESSION S
    WHERE S.USERNAME IS NOT NULL
    AND S.LAST_CALL_ET >= 60*60*2
    AND S.STATUS = 'INACTIVE'
ORDER BY SID DESC;

Oracle失效链接清理 - 图3

4.RAC 模式下查看超过 18 小时的失效链接

SELECT SID, SERIAL
    FROM gv$session S
    WHERE S.USERNAME IS NOT NULL
    AND S.LAST_CALL_ET >= 18*60*60
    AND S.STATUS = 'INACTIVE'
 ORDER BY INST_ID DESC

Oracle失效链接清理 - 图4

5. 查看失效链接的 sql 语句

    SELECT s.SID, s.SERIAL
    s.INST_ID, s.MODULE,s.STATUS,y.sql_text
    FROM gv$session S,v$sql y
    WHERE S.USERNAME IS NOT NULL
    AND S.LAST_CALL_ET >= 18 * 60*60
    AND S.STATUS = 'INACTIVE' AND s.sql_address = y.address
    ORDER BY INST_ID DESC

Oracle失效链接清理 - 图5

6. 杀掉失效链接

ALTER SYSTEM KILL SESSION 's.SID, s.SERIAL#';
alter system disconnect session 's.SID, s.SERIAL#';

7. 查看失效链接的使用用户以及使用程序

然后可以登录使用程序的机器 kill -9 &spid(即查询出来的进程号 spid)

select spid, osuser, s.program
from v$session s, v$process p,(     SELECT SID
    FROM v$session S
    WHERE S.USERNAME IS NOT NULL
    AND S.LAST_CALL_ET >= 18 * 60*60
    AND S.STATUS = 'INACTIVE')c
where s.paddr = p.addr and s.sid =c.sid;

Oracle失效链接清理 - 图6

然后登录使用程序的机器 kill -9 &spid(即查询出来的进程号 spid)

8. 批量杀的 sql 拼接

SELECT 'alter system kill session ''' || s.sid || '' || ',' || s.serial
    FROM gv$session S
    WHERE S.USERNAME IS NOT NULL
    AND S.LAST_CALL_ET >= 18 * 60*60
    AND S.STATUS = 'INACTIVE'

Oracle失效链接清理 - 图7