一、用戶密碼即將過期,導致autotrace無法打開
如果用戶密碼即將過期,在登錄數據庫時會收到如下提示:
ERROR:
ORA-28002: the password will expire within 7 days
當然,此時密碼還未真正過期,用戶在收到錯誤提示后依然可以登錄數據庫。但是,如果當收到密碼即將過期的提示,想要開啟autotrace就會有問題。
- SQL> conn darren/darren
- ERROR:
- ORA-28002: the password will expire within 7 days
- Connected.
- SQL> set autotrace on;
- ERROR:
- ORA-28002: the password will expire within 7 days
SP2-0611: Error enabling STATISTICS report
既然出現了密碼即將過期的提示,說明profile中的PASSWORD_LIFE_TIME參數肯定沒有設置成unlimited,可以查看dba_profiles進行驗證:
- SQL> select profile,resource_name,limit from dba_profiles where resource_name='PASSWORD_LIFE_TIME';
- PROFILE RESOURCE_NAME LIMIT
- ---------- -------------------------------- ----------
- DEFAULT PASSWORD_LIFE_TIME 1
如果生產環境沒有對密碼過期的特殊限制,可以把該參數修改為unlimitd:
- ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED
此時再嘗試打開autotrace:
- SQL> select profile,resource_name,limit from dba_profiles where resource_name='PASSWORD_LIFE_TIME';
- PROFILE RESOURCE_NAME LIMIT
- ---------- -------------------------------- ----------
- DEFAULT PASSWORD_LIFE_TIME UNLIMITED
- SQL> conn darren/darren
- ERROR:
- ORA-28002: the password will expire within 7 days
- Connected.
- SQL> set autotrace on;
- ERROR:
- ORA-28002: the password will expire within 7 days
- SP2-0619: Error while connecting
- SP2-0611: Error enabling STATISTICS report
還是同樣的錯誤,說明在用戶密碼即將過期時,再修改profile是不會對密碼即將過期的用戶生效的。應該采用重設用戶密碼(密碼可以與之前的密碼一樣)的方法。
- SQL> alter user darren identified by darren;
- User altered.
- SQL> conn darren/darren
- Connected.
- SQL> set autotrace on;
此時成功開啟autotrace功能。
再嘗試另外一種情景,在用戶登錄后修改用戶密碼,但不重新登錄,嘗試開啟autotrace。
- SQL> alter user darren identified by darren
- 2 ;
- User altered.
- SQL> set autotrace on;
- ERROR:
- ORA-01017: invalid username/password; logon denied
- SP2-0619: Error while connecting
- SP2-0611: Error enabling STATISTICS report
同樣的錯誤又出現了。
到此,我們得出一個結論,在開啟autotrace功能的時候,數據庫會再創建一個會話,用新創建的會話來跟蹤當前會話。所以,當用戶密碼即將過期時,開啟autotrace功能時,創建新的會話時會因為返回ORA-2802而產生異常。
二、11g新特性,密碼延遲認證
11g中,加入了用戶密碼延遲認證的特性,即用戶如果在登錄是輸入了錯誤的密碼,那么這個用戶的登錄驗證會隨着輸入錯誤密碼的次數的增加而增加,直到正確登錄后重新計數。如下:
- SQL> set time on
- 13:32:45 SQL>
- conn darren/xxxxxx
- conn darren/xxxxxx
- conn darren/xxxxxx
- conn darren/xxxxxx
- conn darren/xxxxxx
- conn darren/xxxxxx
- conn darren/xxxxxx
- ERROR:
- ORA-01017: invalid username/password; logon denied
- Warning: You are no longer connected to ORACLE.
- 13:32:59 SQL> ERROR:
- ORA-01017: invalid username/password; logon denied
- 13:32:59 SQL> ERROR:
- ORA-01017: invalid username/password; logon denied
- 13:32:599 SQL> ERROR:
- ORA-01017: invalid username/password; logon denied
- 13:33:00 SQL> conn gyl/xxxxxx
- ERROR:
- ORA-01017: invalid username/password; logon denied
- 13:33:02 SQL>
- ERROR:
- ORA-01017: invalid username/password; logon denied
- 13:33:05 SQL>
- ERROR:
- ORA-01017: invalid username/password; logon denied
- 13:33:10 SQL>
- ERROR:
- ORA-01017: invalid username/password; logon denied
可以看到,驗證的時間越來越長,如果繼續增加錯誤的登錄次數,驗證的時間還會繼續加長。如果是多個會話同時不斷的用錯誤的密碼來連接數據庫,那么將會導致該用戶的登錄HANG住。如果想關閉這個特性,可以設置如下事件:
- SQL> ALTER SYSTEM SET EVENT = ‘28401 TRACE NAME CONTEXT FOREVER, LEVEL 1’ SCOPE = SPFILE;
三、sys用戶是不受PASSWORD_LIFE_TIME參數限制的
四、在用戶密碼過期后,用戶的狀態(dba_user.account_status)不會立即更新為expired,只有當用戶嘗試連接到數據庫的時候,才會對用戶狀態進行更新
五、用戶密碼相關的一些參數
- SQL> select * from dba_profiles where resource_name like '%PASSWORD%';
- PROFILE RESOURCE_NAME RESOURCE LIMIT
- ---------- -------------------------------- -------- ----------
- DEFAULT PASSWORD_LIFE_TIME PASSWORD UNLIMITED
- DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED
- DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
- DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL
- DEFAULT PASSWORD_LOCK_TIME PASSWORD 1
- DEFAULT PASSWORD_GRACE_TIME PASSWORD 7
PASSWORD_LIFE_TIME:
設定口令的有效時間(天數),一旦超過這一時間,必須重新設口令。缺省為180天(11g,10gUNLIMITED).
PASSWORD_REUSE_TIME:
許多系統不許用戶重新啟用過去用過的口令。該資源項設定了一個失效口令要經過多少天,用戶才可以重新使用該口令。缺省為UNLIMITED.
PASSWORD_REUSE_MAX:
重新啟用一個先前用過的口令前必須對該口令進行重新設置的次數(重復用的次數)。
PASSWORD_LOCK_TIME:
設定帳戶被鎖定的天數(當登錄失敗達到FAILED_LOGIN_ATTEMPTS時)。
PASSWORD_GRACE_TIME:
設定在口令失效前,給予的重新設該口令的寬限天。當口令失效之后回,在登錄時會出現警告信息顯示該天數。如果沒有在寬限天內修改口令,口令將失效。
PASSWORD_VERITY_FUNCTION:
該資源項允許調用一個PL/SQL 來驗證口令。Oracle公司已提供該應用 的腳本,但是只要願意的話,用戶可以制定自己的驗證腳本。該參數的設定就是PL/SQL函數的名稱。缺省為NULL.
FAILED_LOGIN_ATTEMPTS:
設定登錄到Oracle 數據庫時可以失敗的次數。一旦某用戶嘗試登錄數據庫的達到該值時,該用戶的帳戶就被鎖定,只能由DBA能解鎖。