Oracle 11g имеет фантомное соединение - PullRequest
1 голос
/ 10 марта 2011

На моей машине локально установлен 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.

1 Ответ

5 голосов
/ 10 марта 2011

Этот синтаксис Jnnn (J000 и J001) указывает, что это «подчиненный процесс очереди заданий». Если вы убьете его, планировщик, вероятно, просто перезапустит его.

Посмотрите на соответствующий API DBMS_JOB или DBMS_SCHEDULER.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...