SQL команда ALTER SYSTEM CANCEL
была введена в Oracle Database 18c для отмены инструкции SQL в сеансе, что является альтернативой убийству "непослушной" сессии (kill). Если вам в конечном итоге придется убить сеанс, это обсуждается здесь.
Синтаксис команды
Основной синтаксис SQL оператора ALTER SYSTEM CANCEL
показан ниже:
ALTER SYSTEM CANCEL SQL 'SID, SERIAL[, @INST_ID][, SQL_ID]';
Если INST_ID
опущен, предполагается, что вы имеете в виду текущий экземпляр. Если SQL_ID
опущен, предполагается, что вы имеете в виду SQL, который в настоящее время выполняется в указанном сеансе. Некоторые из вариантов показаны ниже:
-- Current SQL in session on this instance.
ALTER SYSTEM CANCEL SQL '738, 64419';
-- Current SQL in session on instance with INST_ID = 1.
ALTER SYSTEM CANCEL SQL '738, 64419, @1';
-- Specified SQL in session on this instance.
ALTER SYSTEM CANCEL SQL '738, 64419, 84djy3bnatbvq';
-- Specified SQL in session on instance with INST_ID = 1.
ALTER SYSTEM CANCEL SQL '738, 64419, @1, 84djy3bnatbvq';
Все четыре части информации можно получить из представления GV$SESSION
, как будет показано ниже.
Как определить сессию, подлежащую отмене?
Отмена инструкции SQL в фоновом сеансе может быть очень разрушительной, поэтому будьте очень осторожны при определении сессии и SQL-кода, требующих "прибития".
Определите "зависшую" сессию и SQL, используя представление GV$SESSION
. Следующий запрос присоединяется к представлению GV$PROCESS
, чтобы получить столбец SPID
, который не является действительно необходимым для этой команды:
SET LINESIZE 150
COLUMN spid FORMAT A10
COLUMN username FORMAT A30
COLUMN program FORMAT A45
SELECT s.inst_id,
s.sid,
s.serial#,
s.sql_id,
p.spid,
s.username,
s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND';
Значения SID
, SERIAL#
, INST_ID
и SQL_ID
соответствующего сеанса могут быть заменены командами из предыдущих разделов.