На моей машине локально установлен 11g (Windows 7 64bit).
Когда я отключил всех своих клиентов от моего оракула (т.е. не запущен 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 - я пока не хочу идти по пути переустановки - лучше бы иметь скрипт, который просто убивает соединения oracle перед тем, как я запустил ant oracle.