暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【排障记录】Oracle杀死会话不灵的话,可以试试这一招

原创 Jose Chen 2024-09-27
95

前言

昨儿我在机房睡得正酣的时候,开发人员发来求救讯息,说是Oracle数据库上的一个会话无法被彻底杀死,并告知了SID号和进程状态(killed)。没有多问,我立马发下手机,打开电脑,娴熟的敲下sqlplus,连入目标数据库进行查看。

步骤

part1 验证信息

根据开发人员报过来的SID号,查询会话的状态是否属实。经检查,确实是处在KILLED的状态。

select sid,serial#,usename from gv$session where sid=&sid;
复制

6cfa60b5bf18a255dc6648e81391e5b.jpg

part2 常规方法杀死会话

alter system kill session 'sid,serial';
复制

执行命令并等待几分钟后,弹出报错,提示会话正在被KILLED

part3 暴力方法杀死会话

alter system kill session 'sid,serial' immediate;
复制

依旧弹出报错,会话正在被KILLED,尝试过在语句后带上abort参数,但是系统无法执行该命令。

part4 查询会话的PID号,查看对应的操作系统进程

结合v$process视图,我们可以查到数据库会话对应的操作系统进程,发现这是一个j开头的进程,代表它是数据库的一个job任务。

select s.sid,s.serial#,p.spid from v$session s join v$process p on s.paddr=p.addr where s.sid=&sid;
复制

b37cd743f93812b75cc3e3b8b4248f8.jpg

822c8ca369ec5b3e3013c6a4c0be342.jpg

part 5 操作系统层面暴力终止进程

这一步想必大家都比较熟悉,KILL -9 带上pid号就可以强制终止进程,值得注意的是,执行前记得要反复确认,因为有些系统进程如果被终止,会导致数据库挂掉,一般后缀带local=no的都可以放心的kill。

part 6

再次验证数据会话的状态,查询不到信息,已经被成功的终止。

select sid,serial#,usename from gv$session where sid=&sid;
复制

总结

任凭数据库再厉害,始终也是一套安装在操作系统上的软件而已,所以对于一些数据库的问题,不妨跳出来,在操作系统上去思考,也许就能找到问题的解决办法。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论