有没有比重新启动 Oracle 数据库服务更好的方法来强制断开所有用户与 Oracle 10g 数据库模式的连接?
我们有几个开发人员使用 SQL Developer 连接到单个 Oracle 10g 服务器上的相同模式。问题是当我们想要删除模式以重建它时,不可避免地有人仍然连接,我们不能在有人仍然连接时删除数据库模式或用户。
出于同样的原因,我们不希望删除与其他模式的所有连接,因为其他人可能仍然连接并使用这些模式进行测试。
有谁知道快速解决这个问题的方法?
有没有比重新启动 Oracle 数据库服务更好的方法来强制断开所有用户与 Oracle 10g 数据库模式的连接?
我们有几个开发人员使用 SQL Developer 连接到单个 Oracle 10g 服务器上的相同模式。问题是当我们想要删除模式以重建它时,不可避免地有人仍然连接,我们不能在有人仍然连接时删除数据库模式或用户。
出于同样的原因,我们不希望删除与其他模式的所有连接,因为其他人可能仍然连接并使用这些模式进行测试。
有谁知道快速解决这个问题的方法?
要查找会话,作为 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'
)
产生现成的终止语句的查询可以是
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';
使用此查询查找与 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';
我的建议是这个简单的匿名块:
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;
/
确保在杀死它们之前更改系统并启用受限会话,否则它们会在您完成工作之前快速登录回数据库。
您是否尝试过 ALTER SYSTEM KILL SESSION?从 V$SESSION 获取给定模式中每个会话的 SID 和 SERIAL#,然后执行
ALTER SCHEMA KILL SESSION sid , serial# ;
只是我的两分钱:最好的方法(但在短期内可能不是最快的)可能是每个开发人员在他自己的数据库实例上工作(参见数据库工作规则#1)。
自Oracle 数据库 10g 快捷版以来,在开发人员站上安装 Oracle 已成为一件轻而易举的事。
只需使用 SQL:
disconnect;
conn tiger/scott as sysdba;