Отмена сессий в Oracle (ALTER SYSTEM KILL, DISCONNECT SESSION)

Как удалить - отменить - убить сессию в OracleСуществует множество способов убить (отменить / удалить) "зависшие" сессии как изнутри Oracle, так и внешними инструментами. Все эти методы мы и обсудим в данной статье.


Оглавление статьи[Показать]


 

ALTER SYSTEM KILL SESSION

Ниже приведен базовый синтаксис для отмены (убийства) сеанса:

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#';

В среде Oracle RAC вы можете указать INST_ID, выполнив запрос к представлению GV$SESSION. Это позволяет убить сессию на другом узле RAC.

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#,@inst_id';

Команда KILL SESSION фактически не убивает сеанс. Он просто просит сеанс убить себя. В некоторых ситуациях, таких как ожидание ответа от удаленной базы данных или откат транзакций, сеанс не будет немедленно убивать себя и будет ждать завершения текущей операции. В этих случаях сеанс будет иметь статус "marked for kill" ("помечен для отмены"). Затем он будет убит как можно скорее.

В дополнение к синтаксису, описанному выше, вы можете добавить предложение IMMEDIATE.

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

Это не влияет на работу, выполняемую командой, но немедленно возвращает управление обратно в текущий сеанс, а не ждет подтверждения отмены сессии.

Если помеченная для отмены сессия  сохраняется в течение некоторого времени, вы можете подумать о том, чтобы убить процесс на уровне операционной системы. Прежде чем делать это, стоит проверить, не выполняет ли она откат в текущее время. Вы можете сделать это, запустив этот скрипт (session_undo.sql). Если значение USED_UREC уменьшается для рассматриваемого сеанса, вы должны оставить его для завершения отката, а не убить сеанс на уровне операционной системы.

 

ALTER SYSTEM DISCONNECT SESSION

Синтаксис ALTER SYSTEM DISCONNECT SESSION является альтернативным методом для убийства сеансов Oracle. В отличие от команды KILL SESSION, которая просит сессию убить себя, команда DISCONNECT SESSION убивает выделенный серверный процесс (или виртуальную схему при использовании Shared Sever), что эквивалентно убийству процесса сервера из операционной системы. Основной синтаксис аналогичен команде KILL SESSION с добавлением предложения POST_TRANSACTION. Значения SID и SERIAL# соответствующего сеанса могут быть заменены на одно из следующих выражений:

SQL> ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION;
SQL> ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;

Предложение POST_TRANSACTION ожидает завершения текущих транзакций перед отключением сессии, в то время как предложение IMMEDIATE отключает сеанс, и текущие транзакции немедленно откатываются.

Предложения POST_TRANSACTION и IMMEDIATE могут использоваться вместе, но в документации указано, что в этом случае предложение IMMEDIATE игнорируется. Кроме того, синтаксическая диаграмма предполагает, что оба предложения являются необязательными, но на самом деле один или оба должны быть указаны или вы получаете сообщение об ошибке.

SQL> alter system disconnect session '30,7';
alter system disconnect session '30,7'
                                     *
ERROR at line 1:
ORA-02000: missing POST_TRANSACTION or IMMEDIATE keyword

SQL>

 

ALTER SYSTEM CANCEL SQL (18c+)

Эта команда означает, что вам не нужно переключаться в операционную систему, чтобы убивать сеансы, что уменьшает вероятность убийства неправильного процесса.

Команда ALTER SYSTEM CANCEL SQL была введена в Oracle Database 18c для отмены инструкции SQL в сеансе, что является альтернативой убийству зависших сессий.

ALTER SYSTEM CANCEL SQL 'SID, SERIAL[, @INST_ID][, SQL_ID]';

 

Убийство сессии через Windows

Чтобы убить сессию в операционной системе Windows, сначала определите сеанс, требующий удаления, а затем подставьте соответствующие значения SID и SPID в следующую команду, выполняемую из командной строки.

C:\> orakill ORACLE_SID spid

Сессионный поток должен быть немедленно уничтожен, и все занимаемые им ресурсы будут высвобождены.

 

Убийство сессии Oracle в UNIX / Linux

Предупреждение! Если вы используете многопоточную модель в Oracle 12c, вы не должны пытаться убивать процессы операционной системы. Чтобы узнать, почему, прочитайте это.

Чтобы убить сессию  в операционных системах UNIX или Linux, сначала определите сеанс, требующий отмены, а затем замените соответствующий SPID и выполните следующую команду:

% kill spid

Если через несколько минут процесс не удалится, то завершите сессию, используя следующую команду:

% kill -9 spid

Сессионный поток должен быть немедленно уничтожен, и все ресурсы будут высвобождены.

Если вы сомневаетесь, убедитесь, что SPID соответствует указанному с помощью UNIX PROCESSID. Вывести запущенные процессы сервера Oracle можно следующей командой:

% ps -ef | grep ora

 

Как определить зависшую сессию?

Принудительное удаление сессий может быть очень разрушительными, если вы убиваете неправильный сеанс, поэтому будьте очень осторожны при определении сеанса, который нужно убить. Если вы убьете сессию, принадлежащую фоновому процессу, вы вызовете сбой экземпляра.

Определите "нашкодившую" сессию, используя представления [G]V$SESSION и [G]V$PROCESS следующим образом:

SET LINESIZE 100
COLUMN spid FORMAT A10
COLUMN username FORMAT A10
COLUMN program FORMAT A45

SELECT s.inst_id,
       s.sid,
       s.serial#,
       --s.sql_id,
       p.spid,
       s.username,
       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';

   INST_ID        SID    SERIAL# SPID       USERNAME   PROGRAM
---------- ---------- ---------- ---------- ---------- ---------------------------------------------
         1         30         15 3859       TEST       Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.n (TNS V1-V3)
         1         23        287 3834       SYS        Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.n (TNS V1-V3)
         1         40        387 4663                  Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.n (J000)
         1         38        125 4665                  Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.n (J001)

SQL>

Значения SID и SERIAL# соответствующего сеанса могут быть заменены командами предыдущих разделов.

Вас заинтересует / Intresting for you:

Oracle и непроцедурный доступ ...
Oracle и непроцедурный доступ ... 7402 просмотров Antoni Tue, 21 Nov 2017, 13:32:50
Работа с запросами Approximate...
Работа с запросами Approximate... 1484 просмотров Андрей Васенин Mon, 29 Oct 2018, 06:40:46
Язык SQL в Oracle
Язык SQL в Oracle 3297 просмотров Ирина Светлова Tue, 21 Nov 2017, 13:26:01
Listener Oracle
Listener Oracle 14914 просмотров Stas Belkov Tue, 21 Nov 2017, 13:18:05
Войдите чтобы комментировать

admin аватар
admin ответил в теме #9788 30 нояб 2020 18:11
Суперский мануальчик по работе с сессиями Oracle - удаление, отмена и даже "убийство"!)))