如何使用Oracle清理死连接?

时间:2008-11-18 04:15:17

标签: oracle

现在我有一些针对Oracle数据库开发的新应用程序,有时它们会崩溃或无法正确结束等等......无论如何,问题是它们有时似乎会打开它们的连接,我需要清理在他们之后。 我的问题是,是否有一种方法可以从数据库方面确定死连接并清理它们?

4 个答案:

答案 0 :(得分:3)

这是一个页面,指的是您可以在Oracle 11g中设置的连接超时参数。我认为'放弃连接超时'是你正在寻找的。

答案 1 :(得分:2)

您可能也有兴趣杀死它们。在SQL * Plus中运行此脚本将为您提供“kill”语句列表。您可以根据sid选择要杀死的那些并运行它们。 Oracle有一些内部连接,不要杀死它们。

SELECT 'alter system kill session ''' || sid || ',' || serial# || ''';     ' || sql_id death
FROM v$session
/

答案 2 :(得分:1)

我相信您正在寻找SQLNet.ora参数EXPIRE_TIME,该参数告诉数据库每隔几分钟就向客户端发送一次探测,以验证连接是否仍然存在。

答案 3 :(得分:0)

这里是如何识别要杀死的会话(你将需要SID和SERIAL#来杀死它)。我是否应该提到你需要确保你正在杀死正确的会话? sys_context('userenv','sid')获取您自己会话的SID。

SELECT s.inst_id,
       s.sid,
       s.serial#,
       p.spid,
       s.username,
       s.osuser,
       s.program
FROM   gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE  s.type != 'BACKGROUND';

然后,您可以按照WW建议发布alter system kill session '[sid],[serial#]'

但是alter system kill session命令不强制终止会话,而是要求会话死掉。如果会话真的挂起,您会发现请求挂起60秒然后返回ORA-00031 Session marked for kill。会议仍在那里。

在这种情况下,首先检查会话是否回滚大型事务(交叉引用上面的SID和SERIAL#):

SELECT s.username,
       s.osuser,
       s.sid,
       s.serial#,
       t.used_ublk,
       t.used_urec,
       rs.segment_name,
      r.rssize,
       r.status
FROM   v$transaction t,
       v$session s,
       v$rollstat r,
       dba_rollback_segs rs
WHERE  s.saddr = t.ses_addr
AND    t.xidusn = r.usn
AND    rs.segment_id = t.xidusn
ORDER BY t.used_ublk DESC;

如果交易正在回滚,您将看到USED_UREC减少。让它完成回滚。

否则,ALTER SYSTEM DISCONNECT SESSION '[sid],[serial#]' IMMEDIATE;将强制断开会话并回滚打开的事务。

上述所有信息均来自here