11.2資料庫登入出現library cache lock等待(二)

yangtingkun發表於2011-11-12

客戶的11.2.0.2 RAC for Linux X86-64環境的資料庫在登入時,發現出現長時間等待。

這一篇描述現象重現過程。

11.2資料庫登入出現library cache lock等待(一):

 

 

上一篇描述了客戶的11.2.0.2 RAC for Linux X86-64環境出現library cache lock的問題,同事回來後想要模擬這個現象,在Windows環境下的11.2.0.1上卻沒有模擬出來,我也在Windows上的11.2.0.1上嘗試了一下,結果沒有出現library cache lock等待,但是出現了row cache lock等待事件。

測試步驟很簡單,開啟三個sqlplus,其中一個設定SET TIME ON,獲取時間資訊,並不斷的已錯誤的使用者名稱密碼嘗試連線資料庫。另一個會話以正確的使用者名稱和密碼連線到資料庫,設定SQLPROMPTSQL2>,以便於和第一個會話區別。最後一個會話以SYS登入資料庫,檢查會話的等待狀態:

SQL> SET TIME ON
08:34:41 SQL> CONN TEST/A@192.25.1.100/TEST112
ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:34:42 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:34:42 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:34:43 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:34:44 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:34:46 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:34:49 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:34:54 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:34:59 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:35:05 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:35:12 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:35:21 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:35:30 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:35:40 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:35:50 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:36:01 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:36:01 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:36:01 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:36:01 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:36:02 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:36:05 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕

.
.
.

08:38:00 SQL> CONN
ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:38:10 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:38:20 SQL> CONN

ERROR:
ORA-01017:
使用者名稱/口令無效; 登入被拒絕


08:38:30 SQL>

可以看到,會話1登入失敗的等待時間從1秒慢慢漲到了10秒,隨後又縮短到1秒以內,最後又一次漲到了10秒。

之所以等待時間被重置,是因為會話2上成功的執行一次登入:

SQL> CONN TEST/TEST@192.25.1.100/TEST112
已連線。
SQL> SET SQLP 'SQL2> '
SQL2> CONN TEST/TEST@192.25.1.100/TEST112
已連線。
SQL2>

會話2的登入成功,使得會話110秒的延遲驗證被重置到1秒以內。

最後看一下V$SESSION檢視查詢的等待資訊:

SQL> SELECT SID, USERNAME, PROGRAM, EVENT, SECONDS_IN_WAIT
  2  FROM V$SESSION
  3  WHERE NVL(USERNAME, 'OTHER') != USER
  4  AND NVL(PROGRAM, 'OTHER') NOT LIKE 'ORACLE.EXE%';

       SID USERNAME   PROGRAM         EVENT                                 SECONDS_IN_WAIT
---------- ---------- --------------- ------------------------------------- ---------------
        12            sqlplusw.exe    SQL*Net message from client                         4
        63 TEST       sqlplusw.exe    SQL*Net message from client                        89

SQL> SELECT SID, USERNAME, PROGRAM, EVENT, SECONDS_IN_WAIT
  2  FROM V$SESSION
  3  WHERE NVL(USERNAME, 'OTHER') != USER
  4  AND NVL(PROGRAM, 'OTHER') NOT LIKE 'ORACLE.EXE%';

       SID USERNAME   PROGRAM         EVENT                                 SECONDS_IN_WAIT
---------- ---------- --------------- ------------------------------------- ---------------
        12            sqlplusw.exe    SQL*Net message from client                         2
        63 TEST       sqlplusw.exe    SQL*Net message from client                       103

SQL> SELECT SID, USERNAME, PROGRAM, EVENT, SECONDS_IN_WAIT
  2  FROM V$SESSION
  3  WHERE NVL(USERNAME, 'OTHER') != USER
  4  AND NVL(PROGRAM, 'OTHER') NOT LIKE 'ORACLE.EXE%';

       SID USERNAME   PROGRAM         EVENT                                 SECONDS_IN_WAIT
---------- ---------- --------------- ------------------------------------- ---------------
        12            sqlplusw.exe    SQL*Net message from client                         6
        63 TEST       sqlplusw.exe    SQL*Net message from client                       107

SQL> SELECT SID, USERNAME, PROGRAM, EVENT, SECONDS_IN_WAIT
  2  FROM V$SESSION
  3  WHERE NVL(USERNAME, 'OTHER') != USER
  4  AND NVL(PROGRAM, 'OTHER') NOT LIKE 'ORACLE.EXE%';

       SID USERNAME   PROGRAM         EVENT                                 SECONDS_IN_WAIT
---------- ---------- --------------- ------------------------------------- ---------------
        12            sqlplusw.exe    SQL*Net message from client                         8
        63 TEST       sqlplusw.exe    SQL*Net message from client                       143

SQL> SELECT SID, USERNAME, PROGRAM, EVENT, SECONDS_IN_WAIT
  2  FROM V$SESSION
  3  WHERE NVL(USERNAME, 'OTHER') != USER
  4  AND NVL(PROGRAM, 'OTHER') NOT LIKE 'ORACLE.EXE%';

       SID USERNAME   PROGRAM         EVENT                                 SECONDS_IN_WAIT
---------- ---------- --------------- ------------------------------------- ---------------
        12            sqlplusw.exe    SQL*Net message from client                         1
        63            sqlplusw.exe    row cache lock                                      1

SQL> SELECT SID, USERNAME, PROGRAM, EVENT, SECONDS_IN_WAIT
  2  FROM V$SESSION
  3  WHERE NVL(USERNAME, 'OTHER') != USER
  4  AND NVL(PROGRAM, 'OTHER') NOT LIKE 'ORACLE.EXE%';

       SID USERNAME   PROGRAM         EVENT                                 SECONDS_IN_WAIT
---------- ---------- --------------- ------------------------------------- ---------------
        12            sqlplusw.exe    SQL*Net message from client                         4
        63            sqlplusw.exe    row cache lock                                      4

SQL> SELECT SID, USERNAME, PROGRAM, EVENT, SECONDS_IN_WAIT
  2  FROM V$SESSION
  3  WHERE NVL(USERNAME, 'OTHER') != USER
  4  AND NVL(PROGRAM, 'OTHER') NOT LIKE 'ORACLE.EXE%';

       SID USERNAME   PROGRAM         EVENT                                 SECONDS_IN_WAIT
---------- ---------- --------------- ------------------------------------- ---------------
        12            sqlplusw.exe    SQL*Net message from client                         6
        63            sqlplusw.exe    row cache lock                                      6

SQL> SELECT SID, USERNAME, PROGRAM, EVENT, SECONDS_IN_WAIT
  2  FROM V$SESSION
  3  WHERE NVL(USERNAME, 'OTHER') != USER
  4  AND NVL(PROGRAM, 'OTHER') NOT LIKE 'ORACLE.EXE%';

       SID USERNAME   PROGRAM         EVENT                                 SECONDS_IN_WAIT
---------- ---------- --------------- ------------------------------------- ---------------
        12            sqlplusw.exe    SQL*Net message from client                         9
        63            sqlplusw.exe    row cache lock                                      8

SQL> SELECT SID, USERNAME, PROGRAM, EVENT, SECONDS_IN_WAIT
  2  FROM V$SESSION
  3  WHERE NVL(USERNAME, 'OTHER') != USER
  4  AND NVL(PROGRAM, 'OTHER') NOT LIKE 'ORACLE.EXE%';

       SID USERNAME   PROGRAM         EVENT                                 SECONDS_IN_WAIT
---------- ---------- --------------- ------------------------------------- ---------------
        63 TEST       sqlplusw.exe    SQL*Net message from client                         1
        69            sqlplusw.exe    SQL*Net message from client                         0

可以看到,如果只有一個會話連線資料庫失敗,則不會導致任何異常等待的出現,如果這時存在另一個會話以同樣的使用者名稱來訪問資料庫,那麼不管這個使用者使用的密碼是否正確,都會引發row cache lock等待事件。

而同樣的測試在11.2.0.2的環境中,出現的等待是library cache lock。檢查了一下,當前的row cache lock等待事件,實際上是11.2.0.1的一個bugBug 9720182: DUE TO ROW CACHE LOCK WAIT EVENTS IN DATABASE APPLICATION GOT HUNG

Oracle提供了專門的PATCH可以解決這個問題,其實解決這個問題的最有效的辦法,就是避免使用者使用不正確的密碼來連線資料庫。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-710844/,如需轉載,請註明出處,否則將追究法律責任。

相關文章