如何停止kill session 无法终止的oracle回话

当在Windows服务器上运行Oracle数据库时遇到Ora-00030错误,可以使用查询会话信息和执行orakill命令来强制终止会话。首先,通过查询v$session视图找到目标会话的SID和Serial#。然后,构造orakill命令并执行,如orakill数据库名称+PSID,成功后会显示线程已成功被信号通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

windows 服务器中运行oracle数据库时,如果kill sesion 会出现 Ora-00030"user session ID does not exist" (用户会话id 不存在)错误

可以通过强制停止oracle回话线程的方式进行终止。

1、查询会话信息,确认无法kill sesion


select username,sid,serial#,status 
from v$session 
where sid in
(你的SID)

2、生成orakill 命令行


select 
   'alter system kill session '''||s.sid||','||s.serial#||''' immediate;' as killsess,
   'orakill orcl '||p.spid||';'  as orakillcmd  
   --orakill命令需要在数据库服务器的命令行中执行
   --s.sid,s.serial#,s.username,s.status ,p.spid 
from v$process p,v$session s 
where p.addr=s.paddr 
and s.Program='最好有程序名称防止杀错'
and sid in (你的SID)

3、命令行下执行


cmd
orakill 命令:orakill + 数据库名称  +PSID;

如果执行成功,会返回如下信息

Kill of thread id xxxx; in instance orcl successfully signalled.

当存储过程卡住时,您可以尝试以下步骤来死它: 第一步:查询SID。使用以下SQL语句查询SID: ``` select * from v$access a where object like '存储过程名%' --存储过程名为大写字母 ``` 其中,“存储过程名”是您要查询的存储过程的名称。记下查询结果中的SID值。 第二步:查询serial#。使用以下SQL语句查询serial#: ``` select * from v$session where sid=39 --39为上一个查询得到的SID值,可能是多个,这里找到他们对应的serial#值 ``` 其中,39应替换为前一步查询得到的SID值。记下查询结果中的serial#值。 第三步:删除进程。使用以下SQL语句删除进程: ``` alter system kill session '39,11234' --参数为'sid,serial#',用于停止这个回话,同时也终止了存储过程 ``` 其中,39和11234应替换为前两步查询得到的SID和serial#值。 如果上述步骤无效,您可以尝试以下方法: 1. 关闭PL/SQL开发工具,如果无法关闭,请使用任务管理器强制结束PL/SQL进程,然后重新登录。 2. 使用以下SQL语句查看锁表进程,以确定执行的语句是否有锁表: ``` select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess where ao.object_id = lo.object_id and lo.session_id = sess.sid; ``` 如果您遇到执行SQL语句卡住的情况,可以尝试以下步骤来终止进程: 1. 根据登录的用户名查询进程信息: ``` select a.sid, a.program, b.pid, b.spid, c.sql_text, c.SQL_ID from v$session a, v$process b, v$sqlarea c where a.paddr = b.addr and a.sql_hash_value = c.hash_value and a.username = '执行卡住sql语句的用户名'; ``` 其中,'执行卡住sql语句的用户名'应替换为您卡住的SQL语句所属的用户名。记下查询结果中的SID和serial#值。 2. 死进程。使用以下SQL语句死进程: ``` alter system kill session '39,31012' immediate; --参数为'sid,serial#',用于停止这个回话,同时也终止了存储过程 ``` 其中,39和31012应替换为前一步查询得到的SID和serial#值。 3. 如果前一步提示没有权限,您可以进入命令行模式,使用以下命令死进程: ``` kill -9 spid ``` 其中,spid应替换为前一步查询得到的spid值。 请注意以下事项: 1. 如果您死了进程,但在表中仍然可以查询到相关信息,请耐心等待几分钟,然后再次查询,可能状态已变为inactive。 2. 一般情况下,登录管理员用户后直接死进程即可,需要进行复杂的操作。但如果无法获得管理员权限,可以尝试上述方法。 请确保您使用这些操作时具有适当的权限和谨慎操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值