ORA-28002觸發對概要檔案的理解

賀子_DBA時代發表於2016-10-10
關於ORA-28002和ORA-28001的故障處理思路和過程:
收到報錯:ORA-28002 :the password will expire within 7 days  提示使用者密碼7天之後將要過期,經查詢可知:這個問題是由於Oracle 11G的新特性所致, Oracle 11G建立使用者時預設密碼過期限制是180天, 如果超過180天使用者密碼未做修改則該使用者無法登入。可透過SELECT * FROM dba_profiles WHERE profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME'語句查詢密碼的有效期設定,LIMIT欄位是密碼有效天數,並且這個新特性是概要檔案控制的,
解決辦法:
1:重新修改使用者密碼:
alter  user  hezi  identified by oracle;   ##這樣之後hezi這個使用者的密碼重新計算過期時間。
如果您想永久解決那麼你可以按著下面的方式操作:
先查出使用者使用的概要檔案,如下所示使用的是預設的概要檔案。
SQL> select  USERNAME,PROFILE from  dba_users where USERNAME='HEZI';

USERNAME                       PROFILE
------------------------------ ------------------------------
HEZI                                 DEFAULT
修改概要檔案的密碼有效天數的屬性,改成無限,需要注意的是,如果資料庫的某個使用者已經報錯ORA-28002或者ORA-28001,那麼你修改概要檔案,也不起作用了,最後會演示實驗。
alter profile default limit PASSWORD_LIFE_TIME  unlimited;
這樣操作之後,所有使用default概要檔案的使用者都不會過期了,其實你可以為某個使用者單獨建立一個概要檔案,如下:
SQL> create profile hezi_profile limit PASSWORD_LIFE_TIME  unlimited;
Profile created.
SQL> alter user frank profile hezi_profile;
User altered.
如下檢視結果,hezi這個使用者已經是使用前面新建立的概要檔案了。
SQL>select username ,profile from dba_users where username ='HEZI'
USERNAME                       PROFILE
------------------------------ ------------------------------
HEZI                                 HEZI_PROFILE
現在討論下概要檔案相關內容:
oracle概要檔案主要兩方面內容:
1,管理某個使用者使用伺服器的資源,
2,管理帳戶狀態和口令屬性的限制。
 
注:只有將RESOURCE_LIMIT設定為TRUE,概要檔案才能強制執行資源限制。但是針對口令的限制不受這個引數影響,總是強制實施概要檔案對使用者口令的限制。概要檔案儲存在資料字典中,由oracle自己管理維護。
概要檔案是用於限制資料庫用法和例項資源的一組已命名的資源限制條件。透過概要檔案還可管理帳戶狀態並對使用者的口令進行限制(長度、失效時間等)。每個使用者都分配有一個概要檔案,而且該使用者在指定時間只屬於一個概要檔案。如果在更改使用者概要檔案時使用者已經登入,則所做更改只在使用者下一次登入時才生效。
DEFAULT概要檔案用作其它所有概要檔案的基礎。

除非RESOURCE_LIMIT初始化引數設定為TRUE,否則不能透過概要檔案強行設定使用者的資源限制。
如果RESOURCE_LIMIT使用預設值FALSE,則忽略概要檔案資源限制。總是強制實施概要檔案口令設定

Oracle系統為了合理分配和使用系統的資源提出了概要檔案的概念。所謂概要檔案,就是一份描述如何使用系統的資源(主要是CPU資源)的配置檔案。將概要檔案賦予某個資料庫使用者,在使用者連線並訪問資料庫伺服器時,系統就按照概要檔案給他分配資源,概要檔案儲存在資料字典中,由oracle自己管理維護,
概要檔案裡面包含的內容很多,其中就包含了很多關於使用者口令的一些限制,
在有的書中將其翻譯為配置檔案,其作用包括。
1、管理資料庫系統資源。
利用Profile來分配資源限額,必須把初始化引數resource_limit設定為true
ALTER SYSTEM SET resource_limit=TRUE SCOPE=BOTH;
2、管理資料庫口令及驗證方式。
預設給使用者分配的是DEFAULT概要檔案,將該檔案賦予了每個建立的使用者。但該檔案對資源沒有任何限制,因此管理員常常需要根據自己數
據庫系統的環境自行建立概要檔案,下面介紹如何建立及管理概要檔案。
示例:
CREATE PROFILE pro_test LIMIT CPU_PER_SESSION 1000
--cpu每秒會話數
任意一個會話所消耗的量(時間量為1/100秒)
CPU_PER_CALL 1000
--cpu每秒呼叫數
任意一個會話中的任意一個單獨資料庫呼叫所消耗的量(時間量為1/100秒)
CONNECT_TIME 30
--允許連線時間
任意一個會話連線時間限定在指定的分鐘數內
IDLE_TIME DEFAULT
--允許空閒時間
SESSIONS_PER_USER 10
--使用者最大並行會話數(指定使用者的會話數量)
LOGICAL_READS_PER_SESSION 1000 --讀取數/會話(單位:塊)
LOGICAL_READS_PER_CALL 1000 --讀取數/呼叫(單位:塊)
PRIVATE_SGA 16K --專用sga
COMPOSITE_LIMIT 1000000 --組合限制(單位:單元)
FAILED_LOGIN_ATTEMPTS 10 --登入幾次後
PASSWORD_LOCK_TIME 10 --鎖定時間(單位:天)
PASSWORD_GRACE_TIME 120 --多少天后鎖定
PASSWORD_LIFE_TIME 60 --口令有效期(單位:天)
PASSWORD_REUSE_MAX UNLIMITED --保留口令歷史記錄:保留次數(單位:次)
PASSWORD_REUSE_TIME 120 --保留口令歷史記錄:保留時間(單位:天)
PASSWORD_VERIFY_FUNCTION DEFAULT --啟用口令複雜 ......
create profile xxx limit ...;LIMIT後面是各種資源限定
alter user lyn profile xxx;是將使用者lyn交給xxx這個PROFILE限制
create user lyn profile xxx;是在建立使用者的時候指定XXX這個概要檔案而不是預設的default
oracle profile儲存在的資料字典中. 由資料庫自己維護.
SQL> desc dba_profiles
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
PROFILE                                   NOT NULL VARCHAR2(30)
RESOURCE_NAME                             NOT NULL VARCHAR2(32)
RESOURCE_TYPE                                      VARCHAR2(8)
LIMIT                                              VARCHAR2(40)
SQL> select * from dba_profiles where profile='DEFAULT';
PROFILE    RESOURCE_NAME                    RESOURCE LIMIT
---------- -------------------------------- -------- ----------------------------------------
DEFAULT    COMPOSITE_LIMIT                  KERNEL   UNLIMITED    //
DEFAULT    SESSIONS_PER_USER                KERNEL   UNLIMITED //每個使用者名稱所允許的並行會話數
DEFAULT    CPU_PER_SESSION                  KERNEL   UNLIMITED //一個會話一共可以使用的CPU時間,單位是百分之一秒
DEFAULT    CPU_PER_CALL                     KERNEL   UNLIMITED //一次SQL呼叫(解析、執行和獲取)允許使用的CPU時間 
DEFAULT    LOGICAL_READS_PER_SESSION        KERNEL   UNLIMITED //限制會話對資料塊的讀取,單位是塊 
DEFAULT    LOGICAL_READS_PER_CALL           KERNEL   UNLIMITED //限制SQL呼叫對資料塊的讀取,單位是塊
DEFAULT    IDLE_TIME                        KERNEL   UNLIMITED //允許空閒會話的時間,單位是分鐘
DEFAULT    CONNECT_TIME                     KERNEL   UNLIMITED //限制會話連線時間,單位是分鐘
DEFAULT    PRIVATE_SGA                      KERNEL   UNLIMITED //限制會話在SGA中Shared Pool中私有空間的分配 
DEFAULT    FAILED_LOGIN_ATTEMPTS            PASSWORD 10  //指定鎖定使用者的登入失敗次數

DEFAULT    PASSWORD_LIFE_TIME               PASSWORD UNLIMITED //密碼可以被使用的天數,單位是天,預設值180天
DEFAULT    PASSWORD_REUSE_TIME              PASSWORD UNLIMITED //密碼可重用的間隔時間(結合PASSWORD_REUSE_MAX)
DEFAULT    PASSWORD_REUSE_MAX               PASSWORD UNLIMITED //密碼的最大改變次數(結合PASSWORD_REUSE_TIME)
DEFAULT    PASSWORD_VERIFY_FUNCTION         PASSWORD NULL  
DEFAULT    PASSWORD_LOCK_TIME               PASSWORD UNLIMITED //超過錯誤嘗試次數後,使用者被鎖定的天數,預設1天
DEFAULT    PASSWORD_GRACE_TIME              PASSWORD UNLIMITED //當密碼過期之後還有多少天可以使用原密碼

刪除PROFILE:
drop profile [資原始檔名] [CASCADE] ;
若建立的PROFILE已經授權給了某個使用者,使用CASCADE級聯收回相應的限制,收回限制資訊後將以系統預設的PROFILE對該使用者進行限制。
設定PROFILE引數的生效時間
1、使用者所有擁有的PROFILE中有關密碼的限制立即生效,不受限制。從這個可看出Oracle對使用者密碼的重視程度。
2、使用者所有擁有的PROFILE中有關資源的限制與resource_limit引數的設定有關,當為TRUE時生效,當為FALSE時(預設值)設定任何值都無效。
SQL> show parameter resource_limit
NAME                 TYPE        VALUE
-------------------- ----------- -------
resource_limit       boolean     FALSE
 
修改profile:
alter profile default RESOURCE_NAME 1000;
如:
alter profile default limit failed_login_attempts 1000;
alter profile default limit failed_login_attempts unlimited;
我們可以手動的建立一個profile,並指定限制:
SQL> create profile frank_profile limit
  2  SESSIONS_PER_USER  5
  3  IDLE_TIME  2
  4  FAILED_LOGIN_ATTEMPTS 5;
Profile created.
SQL> alter user frank profile frank_profile;
User altered.

如果使用者密碼即將過期,在登入資料庫時會收到如下提示:
           ERROR:
            ORA-28002: the password will expire within 7 days
 當然,此時密碼還未真正過期,使用者在收到錯誤提示後依然可以登入資料庫。但是,如果當收到密碼即將過期的提示,想要開啟autotrace就會有問題。

  1. SQL> conn darren/darren
  2.       ERROR:
  3.       ORA-28002: the password will expire within 7 days
  4.       Connected.
  5.       SQL> set autotrace on;
  6.       ERROR:
  7.       ORA-28002: the password will expire within 7 days
        SP2-0619: Error while connecting
       SP2-0611: Error enabling STATISTICS report
           既然出現了密碼即將過期的提示,說明profile中的PASSWORD_LIFE_TIME引數肯定沒有設定成unlimited,可以檢視dba_profiles進行驗證:
           
  1. SQL> select profile,resource_name,limit from dba_profiles where resource_name='PASSWORD_LIFE_TIME';
  2. PROFILE RESOURCE_NAME         LIMIT
  3. ---------- -------------------------------- ----------
  4. DEFAULT PASSWORD_LIFE_TIME         180
            如果生產環境沒有對密碼過期的特殊限制,可以把該引數修改為unlimitd:

  1. ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED
            此時再嘗試開啟autotrace:

  1. SQL> select profile,resource_name,limit from dba_profiles where resource_name='PASSWORD_LIFE_TIME';
  2. PROFILE RESOURCE_NAME         LIMIT
  3. ---------- -------------------------------- ----------
  4. DEFAULT PASSWORD_LIFE_TIME         UNLIMITED
  5. SQL> conn darren/darren
  6. ERROR:
  7. ORA-28002: the password will expire within 7 days
  8. Connected.
  9. SQL> set autotrace on;
  10. ERROR:
  11. ORA-28002: the password will expire within 7 days
  12. SP2-0619: Error while connecting
  13. SP2-0611: Error enabling STATISTICS report
 還是同樣的錯誤,說明在使用者密碼即將過期時,再修改profile是不會對密碼即將過期的使用者生效的。應該採用重設使用者密碼(密碼可以與之前的密碼一樣)的方法。

總結:當你收到ORA-28002或者ORA-28001報錯資訊後,你應該清楚這個使用者使用的概要檔案中PASSWORD_LIFE_TIME引數肯定沒有設定成unlimited,這時候你的處理思路就是重新設定一下密碼(仍然使用原來的密碼),這樣是最快速的,當然你也可以重新建立一個PASSWORD_LIFE_TIME曹氏是limit的概要檔案,並指定給該使用者。

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

相關文章