如何为用户终止所有活动和非活动的 oracle 会话
How to kill all active and inactive oracle sessions for user
我正在尝试使用以下脚本立即为用户终止所有活动和非活动的 oracle 会话,但它不起作用。脚本成功执行,但不会终止用户的会话。
BEGIN
FOR r IN (select sid,serial# from v$session where username = 'USER')
LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid
|| ',' || r.serial# || '''';
END LOOP;
END;
KILL SESSION
命令实际上并没有终止 会话。它只是要求会话自行终止。在某些情况下,例如等待远程数据库的回复或回滚事务,会话不会立即终止自身,而是等待当前操作完成。在这些情况下,会话的状态为“marked for kill”。然后它会尽快被杀死。
查看状态确认:
SELECT sid, serial#, status, username FROM v$session;
您也可以使用 IMMEDIATE 子句:
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
IMMEDIATE
子句不影响命令执行的工作,但它 returns 立即将控制权返回到当前会话,而不是等待 kill 的确认。看看 Killing Oracle Sessions.
更新如果你想杀死所有会话,你可以准备一个小脚本。
SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' FROM v$session;
将上面的假脱机到.sql
文件并执行它,或者,复制粘贴输出并运行它。
执行这个脚本:
SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;'
FROM v$session
where username='YOUR_USER';
它将打印出应该执行的 sqls。
BEGIN
FOR r IN (select sid,serial# from v$session where username='user')
LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid || ','
|| r.serial# || ''' immediate';
END LOOP;
END;
这应该有效 - 我只是更改了您的脚本以添加 immediate
关键字。正如前面的答案所指出的, kill session
仅标记要杀死的会话;它不会立即这样做,而是在以后方便时这样做。
从你的问题来看,你似乎希望马上看到结果。因此 immediate
关键字用于强制执行此操作。
对于 Oracle 11g 这可能不起作用,因为您可能会收到如下错误
Error report:
SQL Error: ORA-00026: missing or invalid session ID
00026. 00000 - "missing or invalid session ID"
*Cause: Missing or invalid session ID string for ALTER SYSTEM KILL SESSION.
*Action: Retry with a valid session ID.
要纠正此问题,请使用以下代码来识别会话
SQL> select inst_id,sid,serial# from gv$session
或 v$session
注意 : v$session 没有 inst_id 字段
并使用
杀死他们
alter system kill session 'sid,serial,@inst_id' IMMEDIATE;
BEGIN
FOR r IN (select sid,serial# from v$session where username='user')
LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid || ',' || r.serial# || '''';
END LOOP;
END;
/
It works for me.
杀死前一天的非活动会话
begin
for i in (select * from v$session where status='INACTIVE' and (sysdate-PREV_EXEC_START)>1)
LOOP
EXECUTE IMMEDIATE(q'{ALTER SYSTEM KILL SESSION '}'||i.sid||q'[,]' ||i.serial#||q'[']'||' IMMEDIATE');
END LOOP;
end;
我正在尝试使用以下脚本立即为用户终止所有活动和非活动的 oracle 会话,但它不起作用。脚本成功执行,但不会终止用户的会话。
BEGIN
FOR r IN (select sid,serial# from v$session where username = 'USER')
LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid
|| ',' || r.serial# || '''';
END LOOP;
END;
KILL SESSION
命令实际上并没有终止 会话。它只是要求会话自行终止。在某些情况下,例如等待远程数据库的回复或回滚事务,会话不会立即终止自身,而是等待当前操作完成。在这些情况下,会话的状态为“marked for kill”。然后它会尽快被杀死。
查看状态确认:
SELECT sid, serial#, status, username FROM v$session;
您也可以使用 IMMEDIATE 子句:
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
IMMEDIATE
子句不影响命令执行的工作,但它 returns 立即将控制权返回到当前会话,而不是等待 kill 的确认。看看 Killing Oracle Sessions.
更新如果你想杀死所有会话,你可以准备一个小脚本。
SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' FROM v$session;
将上面的假脱机到.sql
文件并执行它,或者,复制粘贴输出并运行它。
执行这个脚本:
SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;'
FROM v$session
where username='YOUR_USER';
它将打印出应该执行的 sqls。
BEGIN
FOR r IN (select sid,serial# from v$session where username='user')
LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid || ','
|| r.serial# || ''' immediate';
END LOOP;
END;
这应该有效 - 我只是更改了您的脚本以添加 immediate
关键字。正如前面的答案所指出的, kill session
仅标记要杀死的会话;它不会立即这样做,而是在以后方便时这样做。
从你的问题来看,你似乎希望马上看到结果。因此 immediate
关键字用于强制执行此操作。
对于 Oracle 11g 这可能不起作用,因为您可能会收到如下错误
Error report:
SQL Error: ORA-00026: missing or invalid session ID
00026. 00000 - "missing or invalid session ID"
*Cause: Missing or invalid session ID string for ALTER SYSTEM KILL SESSION.
*Action: Retry with a valid session ID.
要纠正此问题,请使用以下代码来识别会话
SQL> select inst_id,sid,serial# from gv$session
或 v$session
注意 : v$session 没有 inst_id 字段
并使用
杀死他们alter system kill session 'sid,serial,@inst_id' IMMEDIATE;
BEGIN
FOR r IN (select sid,serial# from v$session where username='user')
LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid || ',' || r.serial# || '''';
END LOOP;
END;
/
It works for me.
杀死前一天的非活动会话
begin
for i in (select * from v$session where status='INACTIVE' and (sysdate-PREV_EXEC_START)>1)
LOOP
EXECUTE IMMEDIATE(q'{ALTER SYSTEM KILL SESSION '}'||i.sid||q'[,]' ||i.serial#||q'[']'||' IMMEDIATE');
END LOOP;
end;