是否有更好的方法强制断开所有用户与Oracle 10g数据库模式的连接,而不是重新启动Oracle数据库服务?
我们有几个开发人员使用SQL Developer连接到单个Oracle 10g服务器上的相同模式。问题是,当我们想要删除架构以重建它时,不可避免地有人仍然连接,并且当有人仍然连接时我们不能删除数据库架构或用户。
出于同样的原因,我们不希望删除所有与其他模式的连接,因为其他人可能仍然连接并使用这些模式进行测试。
有人知道解决此问题的快捷方法吗?
答案 0 :(得分:103)
要查找会话,请使用
作为DBA
select sid,serial# from v$session where username = '<your_schema>'
如果您只想确保使用SQL Developer的会话,可以添加and program = 'SQL Developer'
。如果您只想杀死属于特定开发人员的会话,则可以在os_user
然后用
杀死他们
alter system kill session '<sid>,<serial#>'
(例如
alter system kill session '39,1232'
)
生成现成的kill-statement的查询可能是
select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = '<your_schema>'
这将为该用户的每个会话返回一个kill语句 - 类似于:
alter system kill session '375,64855';
alter system kill session '346,53146';
答案 1 :(得分:17)
使用此查询查找到DB的现有会话:
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';
你会看到下面的内容。
然后,使用从上面的结果中提取的值运行以下查询。
ALTER SYSTEM KILL SESSION '<put above s.sid here>,<put above s.serial# here>';
例: ALTER SYSTEM KILL SESSION '93,943';
答案 2 :(得分: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;
/
答案 3 :(得分:1)
确保在杀死系统之前更改系统并启用受限会话,否则他们会在您完成工作之前快速重新登录数据库。
答案 4 :(得分:1)
只使用SQL:
disconnect;
conn tiger/scott as sysdba;
答案 5 :(得分:0)
你有没有尝试过ALTER SYSTEM KILL SESSION?从给定模式中的每个会话中获取V $ SESSION的SID和SERIAL#,然后执行
ALTER SCHEMA KILL SESSION sid , serial#;
答案 6 :(得分:0)
只是我的两分钱:最好的方法(但可能不是短期内最快的)可能是每个开发人员都在他自己的数据库实例上工作(参见rule #1 for database work)。
自Oracle Database 10g Express Edition以来,在开发者工作站上安装Oracle已经变得毫无疑问了。