11.2資料庫登入出現library cache lock等待(一)
客戶的11.2.0.2 RAC for Linux X86-64環境的資料庫在登入時,發現出現長時間等待。
這一篇描述問題的現象的診斷。
出問題的時候我正好在客戶現場,於是當時診斷了一下。
客戶反映,問題發生在一個使用者上,使用這個使用者登入需要等待很長時間,而使用其他的使用者登入則不存在問題。
首先檢查了DBA_PROFILES,確認和密碼以及登入有關的PROFILE是否存在限制,當前資料庫已經都設定為UNLIMITED,那麼問題應該和PROFILE無關。
檢查出現問題的使用者,也未發現任何特別之處。
在sqlplus上使用這個使用者登入,經歷了將近10秒左右的等待,終於成功登入。同時檢查到會話當時出現library cache lock等待事件。
當再次嘗試重現問題時,卻已發現問題無法重現了,現在即使使用剛才的問題使用者,也可以很快登入成功,並不會出現明顯的登入等待。莫非一次成功的登入,就可以解決這個問題。
不過很快,問題再次出現,為了檢查會話執行的具體操作,對這個問題使用者建立了一個登入觸發器,在登入觸發器中設定會話的TRACE:
SQL> CREATE OR REPLACE TRIGGER
T_AFTER_LOGON AFTER LOGON ON DATABASE
2 BEGIN
3 IF USER = 'GJT' THEN
4 DBMS_SESSION.SESSION_TRACE_ENABLE(TRUE, TRUE);
5 END IF;
6 END;
7 /
Trigger created.
雖然問題重現了,但是找到會話的TRACE資訊,卻沒有發現任何異常之處,甚至在TRACE資訊中都找不到任何library cache lock等待事件的資訊。
而且此時還發現一個現象,就是利用這個使用者登入時,即使使用者名稱的密碼輸入錯誤,sqlplus也會等待很長時間,然後才會返回錯誤資訊。而這個長時間的等待從V$SESSION檢視中查詢,恰恰就是library cache lock等待事件。
上面的兩個現象說明,library cache lock的等待實際上是發生在使用者登入之前的。其實從資料庫V$SESSION檢視中也可以看出這個問題:
SQL> select sid, username, event, p1text, p1, p2text, p2,
p3text, p3, seconds_in_wait
2
from gv$session
3
where event = 'library cache lock';
SID USERNAME EVENT SECONDS_IN_WAIT
----------- ------------------------------ ------------------ ---------------
19 library cache
lock 21
2017 library cache
lock 20
2062 library cache lock 0
2147 library cache
lock 10
2210 library cache
lock 21
可以看到,所有出現library cache lock等待的會話使用者名稱都是空。這些會話並不是Oracle後臺程式,而是剛才提到的問題使用者,這同樣說明當方式這個library cache lock等待時,會話還沒有成功的登入到資料庫中。
那麼現在問題有點棘手,如果會話沒有登入,則沒有辦法檢查會話執行了哪些操作,Oracle的文件中也沒有提到過,會話登入之前會進行哪些操作,經歷哪些等待。
分析一下這個問題,整個資料庫目前只有這個使用者出現了library cache lock的等待,而其他使用者沒有出現,說明問題肯定和這個使用者的自身特點有關。而資料庫中只存在預設的DEFAULT PROFILE,且所有限制都設定為UNLIMITED,那麼問題應該和PROFILE沒有關係。透過登入觸發器設定TRACE後發現,會話登入後並無任何異常操作,且TRACE檔案中看不到library cache lock等待資訊。而且即使使用者名稱密碼錯誤,也會出現這個等待事件。這說明等待發生在登入之前,與使用者登入後的行為無關。
簡單總結一下,問題和當前使用者的自身特性有關,且與DBA_PROFILE無關,也與使用者登入後的行為無關。如果不考慮PROFILE,那麼使用者特有的屬性恐怕就剩下了使用者名稱和密碼了。而且在一次成功的登入資料庫後,這個現象曾短時間消失,這說明問題可能確實和密碼有關係。
在11g中,Oracle的密碼策略確實出現了一些改變,比如密碼變成大小寫敏感。這個問題很可能導致老的程式來連線資料庫時出現密碼錯誤的現象。此外,11g還新增了一個密碼相關的特性——密碼錯誤延遲驗證:當使用者連續的輸入錯誤的密碼,Oracle所需要的密碼驗證時間會逐步增加,這可以有效的避免有人試圖透過暴力方式來破解密碼。關於11g新增密碼錯誤延遲驗證的詳細內容,可以參考:http://yangtingkun.itpub.net/post/468/505041
那麼當前的問題和這個密碼延遲驗證有關係嗎,如果是密碼延遲驗證的問題,那麼至少要多次重複輸入錯誤的密碼。不過從剛才的V$SESSION檢視中可以看到,問題使用者存在多個會話在登入資料庫,如果是程式連線資料庫,且配置了錯誤的密碼,那麼基本上就可以確定問題了。
詢問了相關程式人員,發現一個測試程式的密碼確實配置錯誤,且這個程式目前仍然在後臺不斷的嘗試連線資料庫。
現在所有的疑問都解開了,使用者程式已錯誤的密碼不斷登入,在加上11g的密碼延遲驗證,使得使用者的驗證等待時間不斷加長。這也解釋了為什麼輸入正確的密碼登入後,這個現象曾短暫消失,因為使用者成功登入,密碼延遲驗證的時間歸零。
找到問題的原因後,在客戶的資料庫上以其他的使用者嘗試模擬這個現象,測試發現,如果一個會話登入資料庫,即使每次密碼都不正確使得延遲驗證時間不斷變長,也不會引發library cache lock的等待時間,但是隻要該使用者存在第二個登入會話,這時library cache lock會在兩個會話同時出現,而且即使這個會話嘗試使用正確的密碼登入,在成功登入之前,也要等待library cache lock事件。
根據這個現象,個人推測Oracle為了實現延遲驗證,必然需要在共享池中儲存一個類似計數器的物件。這個計數器記錄使用者登入連續密碼錯誤次數,從而確定延遲驗證的等待時間。當使用者成功登入,計數器清零。如果是一個會話,那麼只需要獨佔這個計數器就可以了,當存在兩個以上的會話,且兩個會話都試圖修改計數器的內容,那麼資源競爭就出現了,而體現在資料庫中的等待事件就是library cache lock。當然這只是個人的猜測而已,還沒有看到Oracle官方對這種情況的說明。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-710826/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- latch:library cache lock等待事件事件
- library cache pin和library cache lock(一)
- [20240827]分析為什麼出現library cache lock等待事件2.txt事件
- [20240828]分析為什麼出現library cache lock等待事件5.txt事件
- 【TUNE_ORACLE】等待事件之“library cache lock”Oracle事件
- library cache pin和library cache lock (zt)
- library cache pin和library cache lock(二)
- Library Cache最佳化篇(一)降低library cache lock和library cache pin的方法
- library cache lock和library cache bin實驗_2.0
- 【等待事件】library cache pin事件
- 一次library cache lock 問題分析
- [20240920]跟蹤library cache lock library cache pin使用gdb.txt
- [20240824]跟蹤library cache lock library cache pin使用gdb.txt
- Oracle 11g 密碼延遲認證與 library cache lock 等待Oracle密碼
- 當刪除oracle資料庫user時發生row cache lock 等待事件Oracle資料庫事件
- Library Cache 診斷:Lock, Pin 以及 Load Lock (文件 ID 1548524.1)
- [20241105]跟蹤library cache lock library cache pin使用gdb(11g)2.txt
- [20241108]跟蹤library cache lock library cache pin使用gdb(11g)4.txt
- [20241108]跟蹤library cache lock library cache pin使用gdb(11g)3.txt
- 【TUNE_ORACLE】等待事件之“library cache pins”Oracle事件
- 【ASM_ORACLE】Library Cache最佳化篇(二)Library cache load lock的概念和解決辦法ASMOracle
- cache資料庫入門教程資料庫
- 【ASK_ORACLE】Library cache pin 與 library load lock的關係和區別Oracle
- 金倉資料庫KingbaseES等待事件之LWLock lock_manager資料庫事件
- 重啟大法失效?詳述Oracle11g因JDBC bug引發異常Library Cache Lock等待處理事件OracleJDBC事件
- 徹底搞清楚library cache lock的成因和解決方法(轉)
- Oracle Library cacheOracle
- Lock物件Condition介面實現等待/通知物件
- MySQL資料庫故障分析-鎖等待(一)MySql資料庫
- library cache pin(轉)
- 【ASK_ORACLE】Library Cache概念篇(二)之Library Cache Pin的定義Oracle
- ubuntu登入時出現“一閃之後回到登入介面”的現象Ubuntu
- 10.註冊和登入功能實現(3)—— 註冊資料寫入資料庫資料庫
- 在登入資料庫的使用!sql資料庫SQL
- CAS 5.3使用MySQL資料庫登入MySql資料庫
- 資料庫登入留痕功能新增資料庫
- 透過等待看資料庫資料庫
- [20190402]Library Cache mutex.txtMutex
- [20210507]dump library_cache.txt