oracle 查询锁住的对象,kill会话
在执行ddl时有时会报出ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired的错误,那是因为有会话锁住了ddl操作的表。
表被锁有可能是忘记关掉某个会话,或者某个会话因打开的sercureCRT窗口超时,无法正常关闭。
查询被锁对象与会话信息。
SQL> select l.session_id,o.owner,o.object_name,process from v$locked_object l,dba_objects o where l.object_id=o.object_id;
SESSION_ID OWNER OBJECT_NAME PROCESS
---------- ------------------------------ -------------------- ----------
17 SCOTT T 5389
session_id为会话id,process为操作系统进程id
可以通过视图v$session, 查询会话信息
select sid,serial#,sql_id,process from v$session where sid=17;
SID SERIAL# SQL_ID PROCESS
---------- ---------- ------------- ----------
17 897 7cfz5wy9caaf4 5389
当然也可以直接关联查询会话
SQL> select s.sid,s.serial#,s.sql_id,paddr from v$locked_object l,v$session s where l.session_id=s.sid;
SID SERIAL# SQL_ID PADDR
---------- ---------- ------------- ----------------
17 897 7cfz5wy9caaf4 00000000BF4E2020
sid 会话id,serial#为会话序列号
杀掉会话,可以通过sql命令 alter system kill session 'sid,serail#';
alter system kill session '17,897';
如果有ora-00031错误,则在后面加immediate;
查询对应的操作系统进程id, v$session视图的paddr对应v$process视图addr,进程对象的地址。
SQL> select spid from v$process where addr='00000000BF4E2020';
SPID
------------------------
5498
也可以通过操作系统命令 kill -9 '刚才查到的spid' 来杀掉对应的操作系统进程。
kill -9 5498
查询当前会话id
select sid from v$mystat where rownum=1;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示