Как убить работающий оператор SELECT - PullRequest
46 голосов
/ 03 марта 2012

Как я могу остановить выполнение оператора SELECT, убив сеанс?

Команда непрерывно выдаёт мне вывод, основываясь на операторе SELECT, я хочу остановить его в промежутке.

Ответы [ 6 ]

69 голосов
/ 03 марта 2012

Поскольку вы продолжаете получать страницы результатов, я предполагаю, что вы начали сеанс в SQL * Plus. Если это так, то легко сделать это: ударить ctrl + break много, много раз, пока он не остановится.

Более сложный и более общий способ (-ы), который я подробно описываю ниже, в порядке увеличения свирепости / зла. Первый, вероятно, будет работать для вас, но если это не так, вы можете продолжать двигаться вниз по списку.

Большинство из них не рекомендуется и может иметь непредвиденные последствия.


1. Уровень Oracle - убить процесс в базе данных

Согласно ответу ОбиВанКеноби и ALTER SESSION документации

alter system kill session 'sid,serial#';

Чтобы найти sid, идентификатор сеанса и serial#, серийный номер, выполните следующий запрос - обобщенный из OracleBase - и найдите ваш сеанс:

select s.sid, s.serial#, p.spid, s.username, s.schemaname
     , s.program, s.terminal, s.osuser
  from v$session s
  join v$process p
    on s.paddr = p.addr
 where s.type != 'BACKGROUND'

Если вы используете RAC , вам нужно немного изменить его, чтобы учесть несколько экземпляров, inst_id - это то, что их идентифицирует:

select s.inst_id, s.sid, s.serial#, p.spid, s.username
     , s.schemaname, s.program, s.terminal, s.osuser
  from Gv$session s
  join Gv$process p
    on s.paddr = p.addr
   and s.inst_id = p.inst_id
 where s.type != 'BACKGROUND'

Этот запрос также будет работать, если вы не используете RAC.

Если вы используете такой инструмент, как PL / SQL Developer, окно сессий также поможет вам его найти.

Для немного более сильного "kill" вы можете указать ключевое слово IMMEDIATE, которое указывает базе данных не ждать завершения транзакции:

alter system kill session 'sid,serial#' immediate;

2. Уровень ОС - Выпуск SIGTERM

kill pid

Предполагается, что вы используете Linux или другой вариант * nix. A SIGTERM - это сигнал завершения от операционной системы к конкретному процессу с просьбой прекратить работу. Он пытается изящно завершить процесс.

Если вы ошибетесь, это может привести к прерыванию основных процессов ОС, поэтому будьте внимательны при наборе. Вы можете найти pid, идентификатор процесса, выполнив следующий запрос, который также сообщит вам полезную информацию, такую ​​как терминал, с которого запущен процесс, и имя пользователя, на котором он запущен, чтобы вы могли убедиться, что вы выбрали правильный один.

select p.*
  from v$process p
  left outer join v$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

Еще раз, если вы используете RAC, вам нужно немного изменить это на:

select p.*
  from Gv$process p
  left outer join Gv$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

Изменение предложения where на where s.status = 'KILLED' поможет вам найти уже убитый процесс, который все еще "работает".

3. ОС - выпуск SIGKILL

kill -9 pid

Используя тот же pid, который вы выбрали в 2, SIGKILL - это сигнал от операционной системы к определенному процессу, который вызывает немедленное завершение процесса. Еще раз будьте осторожны при наборе текста.

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

Все остальные опции убьют все сеансы и приведут к тому, что ваша база данных - и в случае с 6 и 7 сервером - станет недоступной. Их следует использовать только в случае крайней необходимости ...

4. Oracle - Завершение работы база данных

shutdown immediate

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

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

Закрывает базу данных, завершает все сеансы и выполняет rollback для всех незафиксированных транзакций. Это может занять некоторое время, если у вас есть большие незафиксированные транзакции, которые необходимо откатить.

5. Oracle - Завершение работы базы данных (менее приятный способ)

shutdown abort

Это примерно то же самое, что и SIGKILL , но еще раз для всех процессов в базе данных. Это сигнал для базы данных, чтобы немедленно остановить все и умереть - тяжелый крах. Завершает все сеансы и не выполняет откат; из-за этого это может означать, что для базы данных снова потребуется больше времени до startup. Несмотря на зажигательный язык, shutdown abort не является чистым злом и обычно может безопасно использоваться.

Как и прежде, сначала сообщите людям соответствующие люди.

6. ОС - перезагрузить сервер

reboot

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

7. ОС - последний этап

У меня перезагрузка не работает ... Как только вы достигли этой стадии, вам лучше надеяться, что вы используете виртуальную машину. Мы закончили тем, что удалили это ...

4 голосов
/ 17 июля 2015

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

select s.sid, s.serial#, p.spid, s.username, s.schemaname
     , s.program, s.terminal, s.osuser
  from v$session s
  join v$process p
    on s.paddr = p.addr
 where s.type != 'BACKGROUND';

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

SELECT SID, SQL_ID, USERNAME, BLOCKING_SESSION, COMMAND, MODULE, STATUS FROM v$session WHERE BLOCKING_SESSION IS NOT NULL;  

Затем я запускаю инструкцию ALTER, чтобы завершить определенный сеанс в этом формате:

ALTER SYSTEM KILL SESSION 'sid,serial#'; 

Например:

ALTER SYSTEM KILL SESSION '314, 2643';
3 голосов
/ 28 февраля 2018

Нет необходимости убивать весь сеанс. В Oracle 18c вы можете использовать ALTER SYSTEM CANCEL:

Отмена оператора SQL в сеансе

Вы можете отменить оператор SQL в сеансе, используя оператор SQL ALTER SYSTEM CANCEL.

Вместо завершения сеанса вы можете отменить оператор SQL с высокой нагрузкой в ​​сеансе. Когда вы отменяете инструкцию DML, она откатывается.

ALTER SYSTEM CANCEL SQL 'SID, SERIAL[, @INST_ID][, SQL_ID]';

Если @INST_ID не указан, используется идентификатор экземпляра текущего сеанса.

Если SQL_ID не указан, текущий оператор SQL в указанном сеансе завершается.

2 голосов
/ 03 марта 2012

Чтобы завершить сеанс в Oracle, вы используете команду ALTER SYSTEM KILL SESSION .

Подробности здесь: http://www.oracle -base.com / articles / misc / KillingOracleSessions.php

0 голосов
/ 13 ноября 2013

О!просто прочитайте комментарии в вопросе, дорогой, я пропустил это.но просто оставив здесь ответ на тот случай, если он может пригодиться другому человеку

Я пробовал "Ctrl + C" и "Ctrl + Break", но ничего не получалось.Я использовал SQL Plus, который шел с Oracle Client 10.2.0.1.0.SQL Plus используется большинством в качестве клиента для связи с БД Oracle.Я использовал опцию «Отмена» в меню «Файл», и она остановила выполнение!

File Menu, Oracle SQL*Plus

После того, как вы нажмете «Файл», подождите несколько минут, затем команда выбора остановится, и появится меню, нажмите «Отмена».

0 голосов
/ 03 марта 2012

Если вы хотите остановить процесс, вы можете убить его вручную из диспетчера задач, с другой стороны, если вы хотите прекратить выполнение запроса в СУБД, вы можете остановить, как указано здесь для ms sqlserver Команда T-SQL STOP или ABORT в SQL Server Надеюсь, это поможет вам

...