如何终止指定对象块相关Schema?如何获取对应Owner的SID和Serial#
问题解答
先明确概念:不是终止Schema,而是终止访问目标对象的会话
Schema是数据库对象(表、视图等)的逻辑集合,本身无法被“终止”。你实际需要的是终止正在访问这些%JOBS_LOG%对象的数据库会话。
1. 获取对应会话的SID和Serial#
使用以下SQL关联对象、缓冲块和会话视图,找出所有访问目标对象的会话信息:
SELECT DISTINCT s.sid, s.serial#, s.username AS session_owner, o.object_name, s.status FROM DBA_OBJECTS o JOIN V$BH bh ON o.data_object_id = bh.OBJD JOIN V$SESSION s ON bh.sid = s.sid WHERE o.owner != 'SYS' AND o.object_name LIKE '%JOBS_LOG%' ORDER BY s.username, o.object_name;
这个查询会返回关键信息:
sid:会话IDserial#:会话序列号(必须和SID配合才能唯一标识会话)session_owner:会话所属的用户名object_name:被访问的目标对象名status:会话当前状态(ACTIVE/INACTIVE等)
2. 终止目标会话
拿到SID和Serial#后,使用以下语句终止会话:
-- 基础终止语句 ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; -- 若为RAC集群环境,需指定实例号(可从V$SESSION的inst_id字段获取) ALTER SYSTEM KILL SESSION 'sid,serial#,instance_number' IMMEDIATE;
注意事项:
- 执行该语句需要
ALTER SYSTEM系统权限 IMMEDIATE参数会立即标记会话为终止状态,正在执行的事务会自动回滚- 如果会话处于
ACTIVE状态,可能需要等待回滚完成;若需强制断开,可使用ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE; - 终止会话前务必确认这些会话是非必要的,避免影响正常业务操作
内容的提问来源于stack exchange,提问作者DIPAK SHAH
相关产品推荐
相关产品推荐

