Как убить выполняющуюся инструкцию SELECT

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

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

6 ответов


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

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

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


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

по состоянию на ObiWanKenobi сейчас!--42--> и ALTER SESSION документация

alter system kill session 'sid,serial#';

найти sid, идентификатор сессии, и serial#, серийный номер, выполните следующий запрос-summarised from 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, окно сеансов также поможет вам найти его.

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

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

2. на уровне ОС - выпуск a команды SIGTERM

kill pid

предполагается, что вы используете Linux или другой вариант *nix. А команды 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. OS - выпуск a сигнал SIGKILL

kill -9 pid

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

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

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

4. Оракул - остановка базы данных

shutdown immediate

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

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

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

5. Оракул - завершение работы базы данных ( менее хороший способ )

shutdown abort

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

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

6. OS - перезагрузите сервер

reboot

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

7. OS - последняя стадия

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


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

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';

чтобы убить сеанс в Oracle, вы используете ALTER SYSTEM KILL SESSION.

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


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

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

можно отменить инструкцию SQL в сеансе с помощью инструкции alter SYSTEM CANCEL SQL.

вместо завершения сеанса можно отменить высоконагруженную инструкцию SQL в сеансе. При отмене инструкции DML выполняется откат инструкции спина.

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

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

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


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

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

File Menu, Oracle SQL*Plus

Как только вы нажмете файл, подождите несколько минут команда select останавливается, и появляется меню "отмена".


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