Oracle: убитая сессия продолжается - PullRequest
3 голосов
/ 05 февраля 2012

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

Сессия помечена как убитая. Что я могу сделать?

Я нашел дополнительную информацию по следующей ссылке: http://oracleunix.wordpress.com/2006/08/06/alter-system-kill-session-marked-for-killed-forever/ но если я запускаю следующий запрос, он возвращает 241 запись. Что это значит?

SELECT   spid
  FROM   v$process
 WHERE   NOT EXISTS (SELECT   1
                       FROM   v$session
                      WHERE   paddr = addr);

Ответы [ 2 ]

6 голосов
/ 05 февраля 2012

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

Попробуйте этот запрос:

select vt.used_ublk from v$transaction vt, v$session vs where vs.taddr=vt.addr and vs.sid=&&sid;

Теперь, если вы выполняете вышеупомянутый запрос несколько раз подряд, используется used_ublkпадает или увеличивается?Если он падает, то сессия откатывается.

Надеюсь, это поможет.

5 голосов
/ 05 февраля 2012

Я собираюсь предположить, что ваш сеанс, который вы убили, был просто select, как вы заявляете, и что вы работаете над вариантом * nix.

Если вы используете update или delete, тогда ожидание завершения отката будет наилучшим.Вы можете проверить количество отката, используя следующий запрос, который я беззастенчиво украл из orafaq , потому что я не помню этих вещей на макушке:

select rn.Name "Rollback Segment", rs.RSSize/1024 "Size (KB)", rs.Gets "Gets"
     , rs.waits "Waits", (rs.Waits/rs.Gets)*100 "% Waits"
     , rs.Shrinks "# Shrinks", rs.Extends "# Extends"
  from sys.v_$rollName rn, sys.v_$rollStat rs
 where rn.usn = rs.usn;

Во-первых, select не следует использовать откат ... если это произойдет, то, вероятно, у вас есть функция, которая выполняет где-то DML , что не очень хорошая идея.Вы также не упоминаете, использует ли select ссылку на базу данных, если это немного проясняет ситуацию.

Если select не использует ссылку на базу данных и не выполняет никаких действийDML, то ссылка, которую вы нашли, сделает все, что вам нужно.Ваши 241 строка, в основном, должны быть идентичными - может быть несколько значений, если у вас есть более одного процесса, у которого есть эта проблема.Я бы изменил запрос на:

select p.*
  from v$process p
  left outer join v$session s
    on p.addr = s.paddr
 where s.saddr is null

Это означает, что вы можете проверить имя пользователя, которому принадлежит процесс, с которого он был запущен, и программу, которая выполняется, прежде чем делать что-либо радикальное.Вы не хотите убивать не ту вещь.

Затем вы можете пойти прямо к вашему ящику и выдать sigterm kill 1234.Это выдает сигнал завершения процессу на уровне вашей ОС и должен от него избавиться.

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

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

Предупреждение : чем сильнее вы получаете в поле, тем сильнееэто будет с вами, и более вероятно, что все пойдет не так.

Следующий шаг от sigterm - sigkill .Это сигнал для ОС, чтобы убить процесс, не задавая никаких вопросов.На * nix это kill -9 1234.Это должно быть редко необходимо.Если вы выполняли DML, это остановит любой откат и может затруднить восстановление базы данных в согласованное состояние в случае сбоя.

Если это все еще не работает, то у вас есть серьезные проблемы.В примере с виртуальной машиной мы сделали следующее, чтобы решить проблему.Большинство из них не рекомендуется: -).

  1. Oracle - alter system kill 123
  2. ОС - kill 1234
  3. ОС - kill -9 1234
  4. Oracle - shutdown immediate - это на самом деле политичнее, чем kill -9 .....Он не отправляет sigkill в ОС и ждет откатов процессов и т. Д. Но всегда хорошо быть вежливым с вашей базой данных.
  5. Oracle - shutdown abort - это примерно то же самое, что и sigkill .Это сигнал для базы данных, чтобы немедленно остановить все и умереть (запутанная терминология, я знаю).
  6. ОС - reboot
  7. Да, верно, reboot не сработало.Когда вы достигнете этой стадии, вам лучше надеяться, что вы используете виртуальную машину.Мы закончили тем, что удалили это ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...