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;

 

posted on 2022-03-30 10:34  JennyYu  阅读(288)  评论(0编辑  收藏  举报