-- 1. 查看被鎖的表
SELECT p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,b.os_user_name FROM v$process p, v$session a, v$locked_object b, all_objects c WHERE p.addr = a.paddr AND a.process = b.process AND c.object_id = b.object_id
-- 2. 查看是哪個進程鎖的
SELECT sid, serial#, username, status, osuser FROM v$session where serial# = '5002' SELECT sid, serial#, username, status, osuser FROM v$session where serial# = '3789'
-- 3. 殺掉這個進程
alter system kill session 'sid,serial#'; alter system kill session '269,3789'; alter system kill session '34,4661'; alter system kill session '265,5002'; alter system kill session '289,1688'; alter system kill session '282,5799';
第一種:
SQL>select session_id from v$locked_object;
49
SQL>SELECT sid, serial#, username FROM v$session where sid = 49;
49 554 system
SQL>ALTER SYSTEM KILL SESSION '49, 554';
第二種:
如果用的是客戶端登錄,直接關掉客戶端就可以了,因為你的客戶端也是個session
普通用戶也可以,因為是你這個用戶開啟這個進程,那麼你也可以關閉這個進程
通過dba_objects查找表的object_id,再查v$lock中id1等於object_id的,在這行裡肯定有個不同於你SID的用戶擁有了這個表的鎖,它肯定在update這個表,長時間沒有commit,要麼找到這個client讓它commit或者rollback,要麼通過sid把它kill掉
下面還有幾個方法
a. $ORACLE_HOME/rdbms/admin/utllockt.sql 好用!
b.select blocking_session from v$session where blocking_session not is null 可以查出誰會阻塞會話 必須在10g中
c.dba_waiters 可以查詢阻塞源和目標
d. dba_blockers 僅有一列阻塞源