Как я могу остановить запущенный оператор SELECT, убив сеанс?
Команда постоянно дает мне вывод на основе инструкции SELECT, я хочу остановить ее между ними.
Как я могу остановить запущенный оператор SELECT, убив сеанс?
Команда постоянно дает мне вывод на основе инструкции SELECT, я хочу остановить ее между ними.
Поскольку вы продолжаете получать страницы результатов, я предполагаю, что вы начали сеанс в SQL * Plus. Если это так, легко сделать это bash ctrl + break много, много раз, пока он не остановится.
Более сложный и более общий способ (ы), который я подробно описываю ниже, в порядке возрастания свирепости/зла. Первый, вероятно, сработает для вас, но если это не так, вы можете продолжать двигаться вниз по списку.
Большинство из них не рекомендуется и могут иметь непреднамеренные последствия.
Согласно ответ ObiWanKenobi и документация 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;
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'
поможет вам найти уже убитый процесс, который все еще "работает".
kill -9 pid
Используя тот же pid
, который вы выбрали в 2, SIGKILL является сигналом операционной системы к определенному процессу, который немедленно приводит к немедленному завершению процесса. Еще раз будьте осторожны при наборе текста.
Это редко бывает необходимо. Если вы делали DML или DDL, он остановится любой откат обрабатывается и может затруднить восстановление базы данных до согласованного состояния в случае сбоя.
Все остальные параметры уничтожат все сеансы и приведут к вашей базе данных, а в случае с сервером 6 и 7 - станут недоступными. Они должны использоваться только в случае крайней необходимости...
shutdown immediate
Это на самом деле политический, чем SIGKILL, хотя, очевидно, он действует на все процессы в базе данных, а не на ваш конкретный процесс. Всегда полезно быть вежливым в вашей базе данных.
Выключение базы данных должно выполняться только с согласия вашего администратора баз данных, если оно у вас есть. Приятно рассказывать людям, которые также используют базу данных.
Он закрывает базу данных, завершая все сеансы и rollback
по всем незафиксированным транзакциям. Это может занять некоторое время, если у вас есть большие незафиксированные транзакции, которые необходимо отменить.
shutdown abort
Это примерно то же самое, что и SIGKILL, хотя еще раз для всех процессов в базе данных. Это сигнал к базе данных, чтобы немедленно остановить все и умереть - тяжелая авария. Он завершает все сеансы и не откатывается; из-за этого это может означать, что база данных снова займет больше startup
. Несмотря на зажигательный язык, shutdown abort
не является чистым злом и обычно можно безопасно использовать.
Как и раньше, сначала сообщите людям соответствующие люди.
reboot
Очевидно, что это не только останавливает базу данных, но и сервер использует ее с осторожностью и с согласия ваших системных администраторов в дополнение к администраторам баз данных, разработчикам, клиентам и пользователям.
У меня перезагрузка не работала... Как только вы достигли этого этапа, вам лучше надеяться, что вы используете виртуальную машину. Мы закончили его удаление...
Это то, что я использую. Я делаю этот первый запрос для поиска сеансов и пользователей:
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
О! просто прочитал комментарии в вопросе, дорогой, я пропустил это. но просто позволяя ответить здесь, если он может быть полезен для кого-то другого.
Я попробовал "Ctrl + C" и "Ctrl + Break" никто не работал. Я использовал SQL Plus, который поставлялся с Oracle Client 10.2.0.1.0. SQL Plus используется большинством в качестве клиента для подключения к Oracle DB. Я использовал параметр "Отмена" в меню "Файл" и остановил выполнение!
Как только вы нажмете "Файл" в течение нескольких минут, команда выбора прекратится, и появится меню, нажмите "Отмена".
Если вы хотите остановить процесс, вы можете убить его вручную из диспетчера задач на другой стороне, если вы хотите прекратить выполнение запроса в СУБД, вы можете остановиться, как указано здесь для ms sqlserver T-SQL STOP или ABORT в SQL Server Надеюсь, это поможет вам.