В некоторых ситуациях требуется принудительно завершить пользовательский сеанс. Например, требуется выполнить какие либо административные работы на сервере.
Статья включает три раздела:
- Идентификация сеансов, которые требуется завершить
- Завершение активных сеансов
- Завершение неактивных сеансов
При завершении сеанса, транзакции этого сеанса откатываются и все ресурсы (такие как, блокировки и области памяти) освобождаются и становятся доступными для других сеансов.
Завершение текущего сеанса с использованием 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.