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;