Как я могу очистить мертвые соединения с помощью Oracle? - PullRequest
3 голосов
/ 18 ноября 2008

Прямо сейчас у меня есть несколько новых приложений, разрабатываемых для базы данных Oracle, и иногда они дают сбой или не могут правильно завершиться, и т.д. после них. У меня вопрос, есть ли способ со стороны базы данных определять мертвые соединения и очищать их?

Ответы [ 4 ]

3 голосов
/ 18 ноября 2008

Вот страница, ссылающаяся на параметры времени ожидания соединения, которые вы можете установить в Oracle 11g . Я думаю, что вы ищете «Abandon Connection Timeout».

2 голосов
/ 18 ноября 2008

Вас также может заинтересовать их убийство. Запуск этого скрипта в SQL * Plus даст вам список операторов kill. Вы можете выбрать тех, кого хотите убить, на основе sid и запустить их. У Oracle есть свои внутренние соединения, не убивайте их.

SELECT 'alter system kill session ''' || sid || ',' || serial# || ''';     ' || sql_id death
FROM v$session
/
1 голос
/ 18 ноября 2008

Я полагаю, что вы ищете параметр SQLNet.ora EXPIRE_TIME , который сообщает базе данных, чтобы каждые несколько минут отправлять запрос клиенту для проверки того, что соединение все еще активно.

0 голосов
/ 19 июня 2014

Вот как определить сеанс для уничтожения (для его уничтожения понадобятся SID и SERIAL #). Должен ли я упомянуть, что вам нужно убедиться, что вы убиваете правильный сеанс? sys_context('userenv','sid') получает SID вашего собственного сеанса.

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

После этого вы можете выдать alter system kill session '[sid],[serial#]', как предлагает WW.

Однако команда alter system kill session не приводит к принудительному завершению сеанса, скорее, она просит сеанс умереть. Если сеанс действительно завис, вы обнаружите, что запрос зависает на 60 секунд, а затем возвращает ORA-00031 Session marked for kill. И сессия все еще там.

В этом случае сначала убедитесь, что сеанс не откатывает большую транзакцию (перекрестная ссылка на SID и SERIAL # из приведенного выше):

SELECT s.username,
       s.osuser,
       s.sid,
       s.serial#,
       t.used_ublk,
       t.used_urec,
       rs.segment_name,
      r.rssize,
       r.status
FROM   v$transaction t,
       v$session s,
       v$rollstat r,
       dba_rollback_segs rs
WHERE  s.saddr = t.ses_addr
AND    t.xidusn = r.usn
AND    rs.segment_id = t.xidusn
ORDER BY t.used_ublk DESC;

Если транзакция откатывается, вы увидите, что USED_UREC уменьшается. Оставьте его для завершения отката.

В противном случае ALTER SYSTEM DISCONNECT SESSION '[sid],[serial#]' IMMEDIATE; принудительно отключит сеанс и откатит открытую транзакцию.

Вся вышеупомянутая информация взята с здесь .

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