Oracle 10g使用者頻繁被鎖(ORA-28000)的診斷與處理

Hoegh發表於2015-08-17
    今天早上同事向我求助,說是一個使用者(我們假設該使用者名稱為HOEGH)的資料不是最新的。奇怪,我明明上週五統一使用expimp指令碼更新了相關使用者的資料,肯定是包含HOEGH使用者的。同事把應用程式啟動起來,指著程式介面告訴我,這個資料肯定不是最新的。好吧,難道是我當時更新資料時漏掉了HOEGH使用者?

    首先,我嘗試登入PLSQL,想查詢一下HOEGH使用者下表的編譯時間,確認一下我執行imp操作的具體時間。令人意外的是,使用PLSQL登入時報錯了,提示“ORA-28000: the account is locked”。

    有點暈,誰動了HOEGH使用者?

    我登陸到sys使用者,透過下面的sql語句查詢HOEGH使用者的帳戶狀態以及鎖定時間。

點選(此處)摺疊或開啟

  1. SQL> select username,account_status,to_char(lock_date,'yyyymmdd hh24:mi:ss') from dba_users where username='HOEGH';


  2. USERNAME ACCOUNT_STATUS TO_CHAR(LOCK_DATE

  3. ------------------------------ -------------------------------- -----------------


  4. HOEGH LOCKED 20150817 08:57:54


  5. SQL>
 

    從查詢結果來看,HOEGH使用者確實被鎖了,而且,鎖定操作就發生在幾分鐘之前。

    雖然沒弄明白怎麼回事,還是先把問題解決了再說吧。我使用“alter user HOEGH account unlock”語句把HOEGH使用者解鎖,然後登入PLSQL,查詢HOEGH使用者下表的編譯時間。結果證明我週五執行資料更新並沒有遺漏HOEGH使用者,所有表的編譯時間都是上週五。

    我懷疑是不是剛才啟動的程式版本有問題。於是,我讓同事重新執行應用程式,顯示的介面仍然不是最新資料,問題依舊

   好吧,解決問題要緊!我重新執行了一次匯入指令碼,指令碼先對所有表執行truncate操作,然後執行imp進行資料匯入。沒想到執行imp操作時再次報錯,提示“ORA-28000: the account is locked”。

    HOEGH使用者被鎖定了,again

    沒想明白。

    再次使用“alter user HOEGH account unlock”語句把HOEGH使用者解鎖,重新執行匯入指令碼,這次資料順利匯入成功。

    這次總該沒問題了吧。讓同事第三次啟動應用程式,問題依舊!!!

    通常來說,程式不會出錯,肯定有其他問題。

    果然,過了一會,同事不好意思的告訴我,密碼不小心配錯了,改過來就OK了。

    這個原因我還真沒想到,問題弄清楚了就好,誰都有打盹的時候嘛。

    可是,為什麼HOEGH使用者會被一而再地鎖定呢?估計也和錯誤密碼有關,最直接的就是Oracle資料庫的安全策略。於是,我執行以下語句來查詢:

點選(此處)摺疊或開啟

  1. SQL>

  2. SQL> select * from dba_profiles where resource_name like 'FAILED_LOGIN_ATTEMPTS%';


  3. PROFILE RESOURCE_NAME RESOURCE LIMIT

  4. ------------------------------ -------------------------------- -------- --------------------------------


  5. DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 10

  6. MONITORING_PROFILE FAILED_LOGIN_ATTEMPTS PASSWORD UNLIMITED


  7. SQL>
 

    其中,FAILED_LOGIN_ATTEMPTS引數被設定為10,也就是說當輸錯密碼登陸超過次10次,使用者就會自動被鎖定。結合我們應用程式的設計思路,它會定時去連線資料庫以監視資料庫連線狀態;導致這個錯誤的原因就是由於客戶端由於沒有使用正確的密碼,連線次數超過資料庫預設安全策略中定義的FAILED_LOGIN_ATTEMPTS引數大小。至於為什麼會一直顯示老版本資料,是因為Oracle資料庫連不上,本地資料無法更新,介面顯示只好去讀老版本的本地資料。
    另外,在Oracle10g中,FAILED_LOGIN_ATTEMPTS引數預設值為10,這個設定其實是有隱患的。如果有一個使用者不停嘗試錯誤口令,那就會導致使用者被鎖。如果要恢復之前無限制,可以透過一條命令解決:
    alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;


    今天解決這個故障得到以下啟示:
1.一定要細心,抓住一切可以利用的資源去進行trouble-shooting;因為,我們的應用程式介面就有資料庫連線狀態的提示(字比較小),當時竟給忽略了;
2.規範專案開發管理,降低類似配置檔案出錯的機率;

hoegh
15.8.17
-- The End --

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

相關文章