Убить мёртвую сессию. В копилку администратору

dbstalker, 01 октября

Часто бывает так, что утрачено соединение сервера с клиентом. В этом случае, если сессия пребывала в статусе «ACTIVE», настанет момент, когда серверному процессу нужно будет обратиться к клиенту. И если связи с ним не будет, то серверный процесс завершается, а фоновый процесс PMON очистит занимаемые ресурсы. А если сессия была в состоянии 'INACTIVE'? Или сеанс «завис» по какой-то причине и блокировки, которые он удерживает, мешают работать прочим клиентам? Или тайм-ауты firewall/router/switch мешают жить соединению клиента с сервером?

В этом случае первое, что можно пробовать выполнять:

ALTER SYSTEM KILL SESSION 'sid,serial#';

ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;

Где значения sid и serial# можно почерпнуть из представления v$session.

Но, увы! Часто бывает так, что сессия приобретает после этого статус 'KILLED' (process='PSEUDO') и избавиться от этой сессии удается лишь после перезагрузки. А если это не возможно?

Тогда пробуйте следующий вариант:

  • Определимся с нашим мертвым процессом с помощью следующего запроса:SELECT p.spid FROM v$session s, v$process p WHERE s.paddr=p.addr;
  • Если удалось найти наш мертвый процесс, то удаляем его средствами операционной системы. Для LINUX это реализуется командой KILL -9 spid.

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

Есть еще вариант: Попробуйте в sqlnet.ora на сервере установить параметр SQLNET.EXPIRE_TIME (значение в минутах).

Очень часто это тоже не помогает. И вот почему (излагаю своё представление, поэтому прошу быть снисходительными и исправить, если Вы нашли несуразность):

Сетевая модель OSI (можно почитать здесь) состоит из 7 уровней.

  • Сетевой протокол ORACLE (Oracle Net/NET8/SQL*Net) находится на 6-7 уровне. Здесь работает тайм-аут SQLNET.EXPIRE_TIME . Когда проблемы возникают здесь, тогда срабатывает SQLNET.EXPIRE_TIME и мертвый сеанс будет закрыт, PMON очистит ресурсы.
  • Протокол TCP/IP (его использует оракловский сетевой протокол) находится на 4-5 уровне. Здесь работает тайм-аут TCP_KEEP_ALIVE TIME (значение по умолчанию для каждой ОС разное: Linux - 45 минут ,Solaris - 72 часа…). И если проблемы возникли на этих уровнях (разорвался сетевой кабель …), то все время тайм-аута KEEP_ALIVE TIME протокол TCP пробует восстановить связь сервера с клиентом только на своих уровнях, на верхние уровни (где находится Oracle Net) об этом не сообщает, поэтому уровень оракловского протокола о проблеме даже не подозревает. Вот по этой причине SQLNET.EXPIRE_TIME не срабатывает.

Выход: KeepAliveTime устанавливать значительно меньшим, чем по умолчанию (например, 1-3 минуты). Очевидно, что для каждой ОС устанавливается KeepAliveTime по разному (LINUX : /proc/sys/net/ipv4/tcp_keepalive_time,WIN: HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters…). Консультируйтесь со своим сетевым администратором, ибо с этим параметром не все так просто. Не забудьте на клиентах в TNSNAMES.ORA установить конструкцию (ENABLE=BROKEN) для Вашего алиаса . На пример:

My_db.my_domain = (DESCRIPTION=(ENABLE=BROKEN)(ADDRESS= ....)... )

Здесь источник информации.

4 комментария

Прокоментировать

гость
1 октября 2008 г. в 15:55

в статье опечатка:
запрос SELECT p.spid FROM v$session s, v$process p WHERE s.paddr=p.addr вернет ВСЕ процессы ОС, необходимо добавить условие:
"AND s.sid=<sid>"

dbstalker
1 октября 2008 г. в 17:27

Конечно,Вы правы. Только по представлению v$session нужно найти sid нашей мертвой сессии.Спасибо!

olegon
21 февраля 2009 г. в 15:20

нельзя забывать о том, что не во всех версиях Oracle expire_time вообще корректно работала
http://olegon.ru

Александр
5 мая 2009 г. в 06:24

вот мой скриптец, то что он возвращает выполнить на сервере БД через пуск-выполнить (cmd):

SELECT 'orakill ' || i.instance_name || ' ' || p.spid as Kill_cmd
FROM v$process p, v$session s, v$instance i
WHERE p.addr = s.paddr AND
s.status = 'KILLED'

 

Новый комментарий

Я не спамер: введите суму 8+3



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Нужен поставщик Дропшиппинг
10 декабря, 1 ответа
КИНО КАФЕ!!!!!!!!!!!!!!!!
10 декабря, 1 ответа