ORA-00031错误:标记为终止的Oracle会话仍运行求助
解决ORA-00031: 会话已标记为终止且KILLED状态会话无法清除的问题
当执行alter system kill session 'SID, SERIAL' immediate;后,会话状态显示为KILLED但仍占用资源,同时触发ORA-00031错误,且该会话持有Body Definition Lock时,说明Oracle内部无法直接中断当前会话的操作,需要结合操作系统级的进程终止来彻底清除。
步骤1:获取会话对应的操作系统进程ID
执行以下SQL查询,拿到会话关联的操作系统进程ID(os_process_id):
SELECT s.sid, s.serial#, s.status, p.spid AS os_process_id, l.lock_type, l.lock_id1 FROM v$session s JOIN v$process p ON s.paddr = p.addr JOIN dba_lock_internal l ON s.sid = l.session_id WHERE UPPER(l.lock_id1) LIKE '%PACKAGE_NAME%' AND l.lock_type = 'Body Definition Lock';
步骤2:操作系统级强制终止进程
根据你的操作系统类型执行对应命令:
- Linux/Unix系统:以Oracle用户或root身份执行
kill -9 <os_process_id> - Windows系统:以管理员身份打开命令提示符执行
注:orakill <ORACLE_SID> <os_process_id><ORACLE_SID>替换为你的数据库实例名称。
步骤3:验证会话清除结果
重新执行步骤1的查询,确认目标会话已从结果中消失,对应的Body Definition Lock也已释放。
补充说明
alter system kill session仅在Oracle内部标记会话为终止状态,当会话正在执行无法被Oracle中断的操作(比如持有Body Definition Lock的PL/SQL包编译操作)时,Oracle无法立即回收会话资源,必须通过操作系统级强制杀死进程才能彻底清除。
内容的提问来源于stack exchange,提问作者Nassim 94
相关产品推荐
相关产品推荐

