【问题标题】:Disconnect all user connections on an RDS Oracle DB断开 RDS Oracle DB 上的所有用户连接
【发布时间】:2016-12-06 12:30:56
【问题描述】:

所以我有一个配置了 oracle 数据库的 AWS RDS 服务器实例,我试图强制断开给定用户的所有连接,以便我可以删除该用户并重新创建用户及其架构。

根据 AWS RDS 文档,而不是使用

ALTER SYSTEM KILL SESSION ' sid, serial#' immediate

我们应该使用

exec rdsadmin.rdsadmin_util.kill(sid, serial#)

Amazon's documentation here

所以,我尝试了以下两种方法来杀死所有连接,但它们都不起作用:


BEGIN
  for session_to_drop in (select 'exec rdsadmin.rdsadmin_util.kill('|| sid ||',' || serial# || ')' command from v$session where username in ('SCHEMA_NAME'))
  loop
    dbms_output.put_line(session_to_drop.command);
    execute immediate session_to_drop.command;
  end loop;
end;

Error report - ORA-00900: invalid SQL statement ORA-06512: at line 5 00900. 00000 - "invalid SQL statement" *Cause:
*Action: exec rdsadmin.rdsadmin_util.kill(22,48087)


BEGIN
  for session_to_drop in (select sid, serial# from v$session where username in ('PERFLAB')) loop
    dbms_output.put_line('exec rdsadmin.rdsadmin_util.kill(' || session_to_drop.sid || ',' || session_to_drop.serial# ||')');
    exec rdsadmin.rdsadmin_util.kill(session_to_drop.sid, session_to_drop.serial#);
end loop; end;

Error report - ORA-06550: line 4, column 10: PLS-00103: Encountered the symbol "RDSADMIN" when expecting one of the following: := . ( @ % ; The symbol ":=" was substituted for "RDSADMIN" to continue. 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error. *Action:

理想情况下,这些循环会遍历所有当前连接并杀死每个连接;但是,循环中似乎无法识别 exec 命令。

还有其他人能够解决这个问题吗?

【问题讨论】:

    标签: sql oracle amazon-web-services amazon-s3 oracle11g


    【解决方案1】:

    您不能在 PL/SQL 块中使用 execexec 是一个 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;
    

    我猜您可能希望在终止会话之前锁定帐户,以防止用户在您终止会话的过程中重新登录。

    【讨论】:

    • 像魅力一样工作!!
    【解决方案2】:

    使用call 而不是exec,为我工作(JDBC 连接)。

    -- select username, sid, serial#, status, machine 
    -- from v$session where username is not null;
    
    call rdsadmin.rdsadmin_util.kill(123, 45678);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 2015-09-08
      • 2021-10-31
      • 1970-01-01
      • 2018-09-21
      相关资源
      最近更新 更多