Завершение сеансов Oracle

Источник: all-oracle

Рекомендовано для:
  • Oracle Database 8i
  • Oracle Database 9i R1
  • Oracle Database 9i R2
  • Oracle Database 10g R1
  • Oracle Database 10g R2
  • Oracle Database 11g R1
 

В некоторых ситуациях требуется принудительно завершить пользовательский сеанс. Например, требуется выполнить какие либо административные работы на сервере.

Статья включает три раздела:

  • Идентификация сеансов, которые требуется завершить
  • Завершение активных сеансов
  • Завершение неактивных сеансов

При завершении сеанса, транзакции этого сеанса откатываются и все ресурсы (такие как, блокировки и области памяти) освобождаются и становятся доступными для других сеансов.

Завершение текущего сеанса с использованием SQL предложения ALTER SYSTEM KILL SESSION. Следующий пример, завершает сеанс с SID равным 7 и серийным номером 15:

ALTER SYSTEM KILL SESSION '7,15';

Идентификация сеанса который требуется завершить

Для идентификации сеанса, который требуется завершить, указывается номер индекса и серийный номер. Для идентификации индекса (SID) и серийного номера выполняется запрос к представлению V$SESSION.

Следующий запрос выбирает все сеансы пользователя TEST:

SELECT SID, SERIAL#
FROM V$SESSION
WHERE USERNAME = 'TEST';
SID    SERIAL#    STATUS
-----  ---------  --------
    7         15  ACTIVE 
   12         63  INACTIVE

Сеанс со статусом ACTIVE - это сеанс, выполняющий SQL инструкции и обращающийся к серверу Oracle. Сеанс со статусом INACTIVE - если не выполняется инструкция SQL или нет обращений к серверу.

Завершение активных сеансов

Если пользователь выполняет SQL инструкции, обращается к серверу Oracle, т.е. его сеанс имеет статус ACTIVE, и его сеанс принудительно завершен, то пользователь немедленно получит сообщение об ошибке:

ORA-00028: your session has been killed

Если, после получения сообщения об ошибке пользователь пытается сохранить какие-либо данные или выполняет SQL предложение, то Oracle вернет ошибку:

ORA-01012: not logged on

Если активный сеанс не может быть прерван (например, выполняется откат транзакции или идут операции ввода/вывода в сети), то, сеанс не сможет быть прерван до его завершения. В этом случае, сеанс держит все ресурсы, до своего завершения. Дополнительно, сеанс выполняющий предложение ALTER SYSTEM, перед завершением ожидает 60 секунд, и уже затем завершается. Если сеанс не завершается по истечении 60 секунд, то пользователь инициирующий завершение сеанса получает  сообщение, о том, что сеанс "помечен" на завершение. Сеанс, помеченный на удаление, в представлении V$SESSION имеет статус KILLED и значение в поле SERVER отличное от PSEUDO.

Завершение неактивных сеансов

Если сеанс имеет статус INACTIVE, когда он прерывается, сообщение об ошибке:

ORA-00028: your session has been killed

не возвращается пользователю немедленно. Сообщение возвращается, как только пользователь попытается использовать разорванный сеанс.
Как только неактивный сеанс прекращен, STATUS в представлении V$SESSION выглядит как KILLED. Строка прекращенного сеанса удаляется из представления V$SESSION, сразу же после того, как пользователь предпримет попытку использовать сеанс снова и получит сообщение об ошибке ORA-00028.

В следующем примере, прекращается неактивный сеанс. Первым шагом делается выборка из представления V$SESSION, для определения SID и номера сеанса, затем сеанс прерывается.

SELECT SID, SERIAL#, STATUS, SERVER
FROM V$SESSION
WHERE USERNAME = 'TEST';
SID    SERIAL#   STATUS     SERVER
-----  --------  ---------  ---------
    7        15  INACTIVE   DEDICATED
   12        63  INACTIVE   DEDICATED
2 rows selected.

ALTER SYSTEM KILL SESSION '7,15';
Statement processed.

SELECT SID, SERIAL#, STATUS, SERVER
FROM V$SESSION
WHERE USERNAME = 'TEST';
SID    SERIAL#   STATUS     SERVER
-----  --------  ---------  ---------
    7        15  KILLED     PSEUDO
   12        63  INACTIVE   DEDICATED
2 rows selected.


Страница сайта http://185.71.96.61
Оригинал находится по адресу http://185.71.96.61/home.asp?artId=20305