Я собираюсь предположить, что ваш сеанс, который вы убили, был просто 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, это остановит любой откат и может затруднить восстановление базы данных в согласованное состояние в случае сбоя.
Если это все еще не работает, то у вас есть серьезные проблемы.В примере с виртуальной машиной мы сделали следующее, чтобы решить проблему.Большинство из них не рекомендуется: -).
- Oracle -
alter system kill 123
- ОС -
kill 1234
- ОС -
kill -9 1234
- Oracle -
shutdown immediate
- это на самом деле политичнее, чем kill -9 ....
.Он не отправляет sigkill в ОС и ждет откатов процессов и т. Д. Но всегда хорошо быть вежливым с вашей базой данных. - Oracle -
shutdown abort
- это примерно то же самое, что и sigkill .Это сигнал для базы данных, чтобы немедленно остановить все и умереть (запутанная терминология, я знаю). - ОС -
reboot
- Да, верно,
reboot
не сработало.Когда вы достигнете этой стадии, вам лучше надеяться, что вы используете виртуальную машину.Мы закончили тем, что удалили это ...