天天看點

Oracle資料庫重新開機後密碼失效的問題(r12筆記第91天)

Oracle資料庫重新開機後密碼失效的問題(r12筆記第91天)

  前幾天,我和系統運維的同僚處理一個看似詭異的問題,他找到我說應用伺服器啟動的時候報了DB的Error,但是錯誤資訊有限,他也沒法完全定位到錯誤的原因,是以就希望我來幫忙看看這個問題是怎麼回事,怎麼解決。

   從應用服務啟動的日志來看,錯誤資訊是連接配接池的地方有了問題。

Error: 2017-06-09 10:04:59 init connpool:one or more conn open error.

Error: 2017-06-09 10:12:50 init connpool:one or more conn open error.

帶着疑問我根據他提供的基本資訊定位到了資料庫服務端的端口,檢視監聽器的日志,發現下面的一段内容:

09-JUN-2017 10:06:46 * <unknown connect data> * 12537

TNS-12537: TNS:connection closed

 TNS-12560: TNS:protocol adapter error

  TNS-00507: Connection closed

   Linux Error: 115: Operation now in progress

09-JUN-2017 10:06:54 * <unknown connect data> * 12537

這是一個12c的環境,這個CDB裡面有大概8個PDB,是以我得定位到具體的PDB繼續測試。

 如果說是CDB級别的資料庫層面有問題,我可以看到有幾個PDB的連接配接數大概有300多個。而出問題的PDB連接配接數确實為0,這一點也确實有些怪異。

 是這個PDB有問題嗎,我看PDB的狀态是READ WRITE,連接配接沒有任何限制,而且我使用已有的一個使用者名和密碼做連接配接測試是沒有問題的。況且在這位同僚範酷IDE那個時間點,我們也沒有做什麼操作,這樣想來就很奇怪了。

  而問題的分析一下子陷入了僵局,系統運維的同學找不到更多的資訊,而我也得不到很多明确的資訊。當然問題既然回報,還是可能存在的,于是我開始逐個梳理這些資訊,當查到這個關聯使用者的狀态時,我感覺應該是哪裡出了問題。SQL> SELECT USERNAME,ACCOUNT_STATUS FROM CDB_USERS WHERE USERNAME LIKE 'SH_USER';

USERNAME                       ACCOUNT_STATUS      

SH_USER                        EXPIRED(GRACE)    

     這個使用者的狀态竟然是expired(grace),這樣一個狀态該怎麼了解呢。這個使用者為什麼會失效呢,如果這樣想來,這個問題就有了一個基本的思路。

  為什麼會失效,預設11g的資料庫中的profile為DEFAULT時,其中一個屬性PASSWORD_LIFE_TIME 是 180,也就是半年的樣子,密碼就會失效。

那麼問題來了,這個業務是個長連接配接的場景,哪怕失效了,在目前的會話裡面還是能夠保持連接配接的,這個問題我就可以回答了,因為前一天晚上碰到了一個PGA的報警,我做了重新開機,而應用層面有了重連機制,是以大部分的會話連接配接都沒有問題,而這個PDB的profile設定保持了預設值,在斷開連接配接之後重連就會碰到賬戶失效的問題。

   這樣一來解決方法就相對簡單,因為應用端是加密的密碼,我也無從得知原來的明文密碼,是以我們就可以重置密碼,有個小技巧。

SQL>  select name,password from user$ where name='USER_SH';

NAME                           PASSWORD

------------------------------ ---------------------------

USER_SH                    E2E9010EA87D283F

然後直接重置即可。

alter user USER_SH identified by values 'E2E9010EA87D283F';

這樣密碼沒有改變,賬戶的狀态就為open了,這樣一來問題就引刃而解了。

Oracle資料庫重新開機後密碼失效的問題(r12筆記第91天)