如何终止仅处于非活动状态的 Oracle 数据库会话?
How To Kill Oracle DB Sessions Who are inActive Only?
我需要终止(杀死)Oracle Db v$session
中的所有会话,其中 status
未处于活动状态
要列出活动和非活动会话,我使用了以下语句:
SELECT sid, serial#, status FROM v$session;
我需要一个语句来终止状态为 != Active
的会话
您可以使用以下区块
declare
v_command varchar2(500);
begin
for c in (
select sid, serial#, machine, module, username, client_info, status, inst_id
from gv$session v
where v.status != 'ACTIVE'
--and v.inst_id = '&i_inst_id'
order by username
)
loop
begin
v_command := 'alter system kill session ''' || c.sid || ',' ||c.serial# ||
',@'||to_char(c.inst_id)||''' immediate';
execute immediate v_command;
exception when others then dbms_output.put_line(sqlerrm);
end;
end loop;
end;
其中 v$session
替换为 gv$session
动态性能视图,并且 INST_ID
列排序规则带有实例编号参数,用于 RAC DB
例。也就是说,即使您有一个单实例数据库,也可能会使用上面的代码。
只有一种方法可以终止会话,即 'sid,serial#'
这是一个声明,例如:
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
所以我们需要通过一个循环来为所有人执行此语句 'sid,serial#'
但仅当 status!=active 时:
此代码可以解决此问题:
BEGIN
FOR sess IN (select sid,serial# from v$session where status<>'ACTIVE')
LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || sess.sid || ','
|| sess.serial# || ''' immediate';
END LOOP;
END;
我需要终止(杀死)Oracle Db v$session
中的所有会话,其中 status
未处于活动状态
要列出活动和非活动会话,我使用了以下语句:
SELECT sid, serial#, status FROM v$session;
我需要一个语句来终止状态为 != Active
的会话您可以使用以下区块
declare
v_command varchar2(500);
begin
for c in (
select sid, serial#, machine, module, username, client_info, status, inst_id
from gv$session v
where v.status != 'ACTIVE'
--and v.inst_id = '&i_inst_id'
order by username
)
loop
begin
v_command := 'alter system kill session ''' || c.sid || ',' ||c.serial# ||
',@'||to_char(c.inst_id)||''' immediate';
execute immediate v_command;
exception when others then dbms_output.put_line(sqlerrm);
end;
end loop;
end;
其中 v$session
替换为 gv$session
动态性能视图,并且 INST_ID
列排序规则带有实例编号参数,用于 RAC DB
例。也就是说,即使您有一个单实例数据库,也可能会使用上面的代码。
只有一种方法可以终止会话,即 'sid,serial#'
这是一个声明,例如:
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
所以我们需要通过一个循环来为所有人执行此语句 'sid,serial#'
但仅当 status!=active 时:
此代码可以解决此问题:
BEGIN
FOR sess IN (select sid,serial# from v$session where status<>'ACTIVE')
LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || sess.sid || ','
|| sess.serial# || ''' immediate';
END LOOP;
END;