断开 RDS Oracle 数据库上的所有用户连接
Disconnect all user connections on an RDS Oracle DB
所以我有一个配置了 oracle 数据库的 AWS RDS 服务器实例,我试图强行断开给定用户的所有连接,以便我可以删除该用户并重新创建该用户及其模式。
根据 AWS RDS 文档,而不是使用
ALTER SYSTEM KILL SESSION ' sid, serial#' immediate
我们应该使用
exec rdsadmin.rdsadmin_util.kill(sid, serial#)
所以,我尝试了以下两种方法来终止所有连接,但都不起作用:
开始
for session_to_drop in (select 'exec rdsadmin.rdsadmin_util.kill('|| sid ||',' || serial# || ')' 来自 v$session 的命令 where username in ('SCHEMA_NAME') )
环形
dbms_output.put_line(session_to_drop.command);
立即执行session_to_drop.command;
结束循环;
结束;</p>
<p>错误报告 -
ORA-00900: 无效的 SQL 语句
ORA-06512: 在第 5 行
00900.00000 - "invalid SQL statement"
*原因:<br>
*行动:
执行 rdsadmin.rdsadmin_util.kill(22,48087)
</pre>
开始
for session_to_drop in (select sid, serial# from v$session where username in ('PERFLAB')) 循环
dbms_output.put_line('exec rdsadmin.rdsadmin_util.kill(' || session_to_drop.sid || ',' || session_to_drop.serial# ||')');
执行 rdsadmin.rdsadmin_util.kill(session_to_drop.sid, session_to_drop.serial#);<br>
结束循环;
结束;</p>
<p>错误报告 -
ORA-06550:第 4 行,第 10 列:
PLS-00103: 遇到以下符号之一时遇到符号 "RDSADMIN":
:= 。 ( @% ;
符号“:=”被替换为 "RDSADMIN" 以继续。
06550.00000 - "line %s, column %s:\n%s"
*原因:通常是 PL/SQL 编译错误。
*行动:
</pre>
理想情况下,这些循环会遍历所有当前连接并杀死每个连接;但是,循环中似乎无法识别 exec 命令。
还有其他人能够解决这个问题吗?
您不要在 PL/SQL 块中使用 exec
。 exec
是一个 SQL*Plus 命令,它不是 SQL 或 PL/SQL 语言的一部分。你只要在循环中调用程序
BEGIN
for session_to_drop in (select sid, serial#
from v$session
where username in ('PERFLAB'))
loop
rdsadmin.rdsadmin_util.kill(session_to_drop.sid, session_to_drop.serial#);
end loop;
end;
我猜想您会希望在终止会话之前锁定帐户,以防止用户在您终止会话的过程中重新登录。
使用 call
而不是 exec
,对我有用(JDBC 连接)。
即
-- select username, sid, serial#, status, machine
-- from v$session where username is not null;
call rdsadmin.rdsadmin_util.kill(123, 45678);
所以我有一个配置了 oracle 数据库的 AWS RDS 服务器实例,我试图强行断开给定用户的所有连接,以便我可以删除该用户并重新创建该用户及其模式。
根据 AWS RDS 文档,而不是使用
ALTER SYSTEM KILL SESSION ' sid, serial#' immediate
我们应该使用
exec rdsadmin.rdsadmin_util.kill(sid, serial#)
所以,我尝试了以下两种方法来终止所有连接,但都不起作用:
开始 for session_to_drop in (select 'exec rdsadmin.rdsadmin_util.kill('|| sid ||',' || serial# || ')' 来自 v$session 的命令 where username in ('SCHEMA_NAME') ) 环形 dbms_output.put_line(session_to_drop.command); 立即执行session_to_drop.command; 结束循环; 结束;</p> <p>错误报告 - ORA-00900: 无效的 SQL 语句 ORA-06512: 在第 5 行 00900.00000 - "invalid SQL statement" *原因:<br> *行动: 执行 rdsadmin.rdsadmin_util.kill(22,48087) </pre>
开始 for session_to_drop in (select sid, serial# from v$session where username in ('PERFLAB')) 循环 dbms_output.put_line('exec rdsadmin.rdsadmin_util.kill(' || session_to_drop.sid || ',' || session_to_drop.serial# ||')'); 执行 rdsadmin.rdsadmin_util.kill(session_to_drop.sid, session_to_drop.serial#);<br> 结束循环; 结束;</p> <p>错误报告 - ORA-06550:第 4 行,第 10 列: PLS-00103: 遇到以下符号之一时遇到符号 "RDSADMIN": := 。 ( @% ; 符号“:=”被替换为 "RDSADMIN" 以继续。 06550.00000 - "line %s, column %s:\n%s" *原因:通常是 PL/SQL 编译错误。 *行动: </pre>
理想情况下,这些循环会遍历所有当前连接并杀死每个连接;但是,循环中似乎无法识别 exec 命令。
还有其他人能够解决这个问题吗?
您不要在 PL/SQL 块中使用 exec
。 exec
是一个 SQL*Plus 命令,它不是 SQL 或 PL/SQL 语言的一部分。你只要在循环中调用程序
BEGIN
for session_to_drop in (select sid, serial#
from v$session
where username in ('PERFLAB'))
loop
rdsadmin.rdsadmin_util.kill(session_to_drop.sid, session_to_drop.serial#);
end loop;
end;
我猜想您会希望在终止会话之前锁定帐户,以防止用户在您终止会话的过程中重新登录。
使用 call
而不是 exec
,对我有用(JDBC 连接)。
即
-- select username, sid, serial#, status, machine
-- from v$session where username is not null;
call rdsadmin.rdsadmin_util.kill(123, 45678);