是否有比重新启动Oracle数据库服务更好的方法来强制所有用户与Oracle 10g数据库架构断开连接?
我们有几个使用SQL Developer的开发人员连接到单个Oracle 10g服务器上的相同模式。 问题是,当我们要删除架构以重建它时,不可避免地有人仍在连接,并且在有人仍在连接时我们无法删除数据库架构或用户。
同样,我们也不想删除所有与其他模式的连接,因为其他人可能仍然可以连接并使用这些模式进行测试。
有人知道解决此问题的快速方法吗?
要查找会话,作为DBA使用
select sid,serial# from v$session where username = ''
如果要确保仅获取使用SQL Developer的会话,则可以添加and program = 'SQL Developer'。如果只想终止属于特定开发人员的会话,则可以对os_user添加限制
然后用杀死他们
alter system kill session ','
(e.g. alter system kill session '39,1232')
产生现成的kill-statement的查询可能是
select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = ''
这将为该用户在每个会话中返回一条kill语句-类似于:
alter system kill session '375,64855';
alter system kill session '346,53146';
使用此查询查找到数据库的现有会话:
1 2 3 4 5 6 7 8 9
| SELECT s.inst_id,
s.sid,
s.serial#,
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'; |
您会看到类似下面的内容。
然后,使用从以上结果中提取的值运行以下查询。
1
| ALTER SYSTEM KILL SESSION '<put above s.sid here>,<put above s.serial# here>'; |
例如:
ALTER SYSTEM KILL会议'93,943';
我的建议是这个简单的匿名块:
1 2 3 4 5 6 7 8 9
| DECLARE
lc_username VARCHAR2 (32) := 'user-name-to-kill-here';
BEGIN
FOR ln_cur IN (SELECT sid, serial# FROM v$session WHERE username = lc_username)
LOOP
EXECUTE IMMEDIATE ('ALTER SYSTEM KILL SESSION ''' || ln_cur.sid || ',' || ln_cur.serial# || ''' IMMEDIATE');
END LOOP;
END;
/ |
只需使用SQL即可:
1 2 3
| disconnect;
conn tiger/scott as sysdba; |
在杀死它们之前,请确保更改系统并启用受限会话,否则它们将在完成工作之前迅速重新登录数据库。
只是我的两分钱:最好的方法(但短期内可能不是最快的方法)可能是每个开发人员都可以在自己的数据库实例上工作(有关数据库工作,请参见规则1)。
自从Oracle Database 10g Express Edition以来,在开发人员工作站上安装Oracle变得轻而易举。
您是否尝试过ALTER SYSTEM KILL SESSION?从V $ SESSION获取给定架构中每个会话的SID和SERIAL#,然后执行
ALTER SCHEMA KILL SESSION sid,序列号;