Как я могу остановить запущенный оператор 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 Надеюсь, это поможет вам.