Как убить выполняющуюся инструкцию 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. Я использовал опцию "отмена" в меню "Файл", и она остановила выполнение!
Как только вы нажмете файл, подождите несколько минут команда select останавливается, и появляется меню "отмена".
Если вы хотите остановить процесс, вы можете убить его вручную из Диспетчера задач с другой стороны, если вы хотите остановить выполнение запроса в СУБД, вы можете остановиться, как указано здесь для ms sqlserver команда T-SQL STOP или ABORT в SQL Server Надеюсь, это поможет вам