標籤:
http://www.itpub.net/forum.php?mod=viewthread&tid=1761963
以前在資料庫維護中,基本都是碰到表被鎖的情況,然後就是尋找被鎖的表相關的資訊,通過v$session視圖尋找到相關的sid和serial#,通過
alter system kill session ‘sid,serial#’
kill掉相關的進程即可。但是今天碰到開發封裝更新過程中,串連中斷,導致開發包一直被鎖定的狀態,無法操作。
由於以前沒有遇到包被鎖的情況,所以也沒太注意這方面的技術,網上好像也很少相關的資訊。當開發找到我的時候 確實也琢磨了好一陣子。
然後又從網上查到一些相關的資訊,最後結合,解決問題。這裡吧解決方案寫下來,供參考!
如有更好的方法,歡迎大神指導學習!!歡迎拍磚
鎖表的資訊屬於dml鎖,在v$locked_object中,
但所包的資訊屬於ddl鎖,在dba_ddl_locks中,
首先尋找那個進程鎖住了該對象,以下是操作過程
sql> Select b.SID,b.SERIAL# From dba_ddl_locks a, v$session b Where a.session_id = b.SID And a.name = ‘xxx包名‘ AND OWNER=‘登陸使用者‘;
SID SERIAL#
---------- ----------
249 27744
255 10572
70 49021
39 9881
220 1101
32 33362
290 828
264 36682
266 34873
93 41887
193 63309
115 46955
186 20919
84 2125
62 57709
41 21572
320 58450
285 14303
133 38681
221 32723
39 9881
220 1101
193 63309
115 46955
62 57709
133 38681
221 32723
27 rows selected.
好多資訊,這個時候本來可以直接執行
Select spid, osuser, s.program From v$session s, v$process p Where s.paddr = p.addr And s.sid = (sid);
找到相關sid的spid。然後執行kill -9 spid 或者執行
alter system kill session ‘sid,serial#‘
kill掉進程就可以了,但是一個資料庫上面與很多連結使用者,都在做同一件事情,你不可以吧其他正常的進程也給kill了吧
顯然是不可能的。
如果是這樣的情況,你可以直接尋找到連結用戶端機器鎖開啟的所有進程,kill掉,避免亂殺無辜!
確認該使用者的包是否存在
select * From all_objects where owner=‘登陸使用者‘and object_type = ‘PACKAGE‘ 確實存在。其實這步這裡可以不做每應該在最前面做,可以看看包的資訊-----
終極方法,對鎖表和所包應該夠有效果
一般開發都是用戶端串連資料庫伺服器。所以查到該使用者在當前資料庫下的所有會話,記得連用戶端的電腦名稱都查出來,避免亂殺
涉及到資料資料我就不多了
sys> select saddr,sid,serial#,username,MACHINE from v$session order by username desC;
SADDR SID SERIAL# USERNAME MACHINE
-------- ---------- ---------- ------------------- -----------------------
B54R8510 71 27377 DB1
B5659D50 319 1 DB1
B54A3B28 32 37270 xxxx user-b4b16aa573
這樣就可以看到該電腦串連到資料庫的所有進程了
現在就可以執行
alter system kill session ‘32,37270‘;
執行後再查看
sys> select saddr,sid,serial#,username,MACHINE from v$session order by username desC;
已經沒有該用戶端的進程了!!搞定
歡迎拍磚哈!!!
Oracle開發包被鎖解決辦法-終極辦法