1. 程式人生 > 其它 >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 TNS-12537: TNS:connection closed TNS-12560: TNS:protocol adapter error

TNS-00507: Connection closed Linux Error: 115: Operation now in progress

這是一個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了,這樣一來問題就引刃而解了。