【问题标题】:Oracle 11g has phantom connectionOracle 11g 有幻象连接
【发布时间】:2011-03-10 07:14:13
【问题描述】:

我的机器上本地安装了 11g(Windows 7 64 位)。

当我从我的 oracle 断开所有客户端(即没有运行 sqlplus,没有运行 weblogic)然后使用 sqlplus 重新连接并运行以下脚本时:

SQL> set linesize 120
SQL> SELECT            s.sid,
  2                    s.serial#,
  3                    s.username,
  4                    s.program
  5    from v$session s
  6    where username is not null;
       SID    SERIAL# USERNAME                       PROGRAM
---------- ---------- ------------------------------ ----------------------------------------------------------------
       134      11274 FOO                         ORACLE.EXE (J000) <-- I want to remove this connection
       139      19140 MYADMIN                        sqlplus.exe       <-- My connection
       155       8941 FOO                         ORACLE.EXE (J001) <-- I want to remove this connection
SQL>

所以我正在尝试以编程方式删除我标记为蓝色的连接。

我正在使用以下内容:

SQL> ALTER SYSTEM DISCONNECT SESSION  134,11274  IMMEDIATE;
ALTER SYSTEM DISCONNECT SESSION  134,11274  IMMEDIATE
                                 *
ERROR at line 1:
ORA-00026: missing or invalid session ID

这不是正确的方法吗?我也试过了

ALTER SYSTEM DISCONNECT SESSION  '134,11274'  IMMEDIATE;

当我再次尝试运行上述程序时,我会收到错误消息:

SQL> ALTER SYSTEM DISCONNECT SESSION  '134,11274'  IMMEDIATE;
ALTER SYSTEM DISCONNECT SESSION  '134,11274'  IMMEDIATE
*
ERROR at line 1:
ORA-00031: session marked for kill

所以连接似乎并没有真正消失。

我想要一个强制终止所有“FOO”连接的脚本,以便我的构建能够正常运行。但是我的脚本不起作用。你有什么想法?我可以摆脱连接的唯一可靠方法是重新启动。停止和启动服务有时会起作用——但并非总是如此——这真的很奇怪。

这是我最终希望能够运行的 PL/SQL 脚本。

SET SERVEROUTPUT ON 
SET LINESIZE 120
DECLARE
   theKillCmd VARCHAR2(1000);

   PROCEDURE msg(msg VARCHAR2) AS 
   BEGIN
        DBMS_OUTPUT.PUT_LINE(msg);
   END;


BEGIN

msg(' . ');
msg(' . ');
msg('Killing extraneous sessions.');
msg(' . ');
msg(' . ');

for conn in (SELECT    s.sid,
         s.serial#,
         s.username,
         s.program
  FROM   v$session s
  WHERE s.USERNAME IS NOT NULL) 
loop

  msg( '.     ' || conn.sid || ' ' || conn.serial# || ' ' ||  conn.username || ' ' || conn.program );
  IF (conn.username = 'FOO') THEN
     -- Following asks client process to kill itself
     -- theKillCmd := 'ALTER SYSTEM KILL SESSION ''' ||  conn.sid || ',' || conn.serial# || ''' IMMEDIATE ';
     -- Following tells server to kill process 
     theKillCmd := 'ALTER SYSTEM DISCONNECT SESSION ' ||  conn.sid || ',' || conn.serial# || ' IMMEDIATE ';
     msg( '.           ' || 'Killing connection using command : ' || theKillCmd );
     EXECUTE IMMEDIATE theKillCmd ;
  ELSE
     msg('.           Ignoring .. ');
  END IF;

end loop;


END;
/

-- exit;

因此,如果有人有任何想法,将不胜感激。

我想知道我是否以某种方式搞砸了 oracle 安装 - 我还不想走重新安装的道路 - 宁愿有一个脚本在我运行 ant oracle 之前杀死 oracle 连接。

【问题讨论】:

    标签: oracle plsql oracle11g


    【解决方案1】:

    Jnnn(J000 和 J001)语法表明它是一个“作业队列从属进程”。如果你杀死它,调度程序可能会重新启动它。

    查看适当的 DBMS_JOB 或 DBMS_SCHEDULER API。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-15
      • 2014-04-19
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      相关资源
      最近更新 更多