【发布时间】: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 连接。
【问题讨论】: