oracle
包被鎖定的原因分析及解決方案
在資料庫的開發過程中,經常碰到包、儲存過程、函式無法編譯或編譯時會導致pl/sql 無法響應的問題。碰到這種問題,基本上都要重啟資料庫解決,嚴重浪費開發時間。本文將就產生這種現象的原因和解決方案做基本的介紹。
從事資料庫開發的都知道鎖的概念,如:執行 update table *** where *** 的時候就會產生鎖。這種常見的鎖在oracle裡面被稱為dml鎖。在oracle中還有一種ddl鎖,主要用來保證儲存過程、表結構、檢視、包等資料庫物件的完整性,這種鎖的資訊可以在dba_ddl_locks中查到。注意:v$locked_object記錄的是dml鎖資訊,ddl鎖的資訊不在裡面。
對應ddl鎖的是ddl語句,ddl語句全稱資料定義語句(data define language)。用於定義資料的結構或schema,如:create、alter、drop、truncate、comment、rename。當我們在執行某個儲存過程、或者編譯它的時候oracle會自動給這個物件加上ddl鎖,同時也會對這個儲存過程所引用的物件加鎖。
了解了以上知識以後,我們可以得出結論:編譯包長時間無響應說明產生了死鎖。我們可以輕易的讓這種死鎖發生,舉例:
1、 開啟乙個pl/sql,開始除錯某個函式(假設為:fun_core_servicecall),並保持在除錯狀態
2、 開啟乙個sql window,輸入select
*from
dba_ddl_locks a
where
a.name =
'fun_core_servicecall'會發現一行記錄:
開啟乙個新的pl/sql,重新編譯這個函式。我們會發現此時已經無法響應了
4、 回到第乙個pl/sql ,重新執行select
*from
dba_ddl_locks a
where
a.name =
'fun_core_servicecall'我們將會看到如下記錄:
上述的情況表明發生了鎖等待的情況。
在oracle中ddl鎖分為:exclusive ddl locks(排他的ddl)、share ddl locks(共享ddl鎖)、
breakable parse lock
s(可被打破的解析鎖)幾類。篇幅所限,這裡就不再詳細介紹了。根據這個例子推理一下,當我們試圖編譯、修改儲存過程、函式、包等對資料物件的時候,如果別人也正在編譯或修改他們時就會產生鎖等待;或者我們在編譯某個儲存過程的時候,如果它所引用的資料庫物件正在被修改應該也會產生鎖等待。這種假設有興趣的兄弟可以測試下,不過比較困難。
碰到這種問題,如果知道是被誰鎖定了(可以查出來的),可以讓對方盡快把鎖釋放掉;實在查不出來只能手工將這個鎖殺掉了。步驟如下: 1、
首先查出哪些程序鎖住了這個物件,語句如下:
select
b.sid,b.serial#
from dba_ddl_locks a, v$session b
where a.session_id = b.sid
and a.name = 'fun_core_servicecall'; 2、
執行如下語句殺程序:alter system kill session 'sid,serial#'
3、 執行了以上的語句後,有的時候不一定能夠將程序殺掉。這個時候就需要連到資料庫伺服器上殺掉伺服器端的程序了,查詢語句:
select
spid, osuser, s.program
from v$session s, v$process p
where s.paddr = p.addr
and s.sid =
(上面查出來的
sid) 4、
在伺服器上執行如下語句:
#kill -9 spid
(unix平台)
orakill sid thread
(windows平台sid是oracle的例項名,thread是上面查出來的sid) 5、
執行完4步以後基本上就可以殺掉這些鎖死的程序了,不放心的話可以再執行第一步確認下。
本文只能是說對這個問題做了初步分析,產生此問題的原因及解決方案涉及到很多oracle的基本知識。如:dml語句,ddl語句;oracle鎖的機制;v$session 與 v$process之間關係等。有興趣的兄弟可以更加深入的研究,歡迎跟我交流!
Oracle 使用者解鎖後還是會鎖定的原因
在伺服器上有乙個資料庫,使用df6100i wisdom.df6100 energydb登入時提示 user 已經被鎖定,執行 alter user df6100i account unlock 命令,賬戶解鎖,可以登入,但是第二天還是提示使用者被鎖定 原因 據庫安全配置中,需要做相關的安全加固工作...
oracle死鎖原因分析 轉
死鎖的原因 1。模擬死鎖 1。1。主表 create table create table wdz1 wdz1id number not null,memo varchar2 20 alter table wdz1 add constraint primary key wdz1id 1。2。從表 沒...
oracle中表的鎖定
鎖的概念 鎖出現在資料共享的場合,用來保證資料的一致性。當多個會話同時修改乙個表時,需要對資料進行相應的鎖定。鎖有 唯讀鎖 排它鎖 共享排它鎖 等多種型別,而且每種型別又有 行級鎖 一次鎖住一條記錄 頁級鎖 一次鎖住一頁,即資料庫中儲存記錄的最小可分配單元 表級鎖 鎖住整個表 若為 行級排它鎖 則除...