近期有一個生產數據庫用戶總是被鎖,導致生產環境有些應用的訪問數據庫連接失敗,造成生產事故,針對用戶被鎖的問題進行如下記錄說明。
首先將被鎖用戶解鎖,然後排查具體原因。
解鎖方式:
1.使用dba角色用戶登錄,查看用戶是否被鎖。
select username,lock_date from dba_users;
2.查看用戶如果lock_date有值則說明該用戶被鎖,需要進行解鎖。
alter user username account unlock;
排查問題的流程如下:
用戶被鎖原因:
1.頻繁登陸oracle該用戶密碼錯誤,並超過一定的數目。
1)一般默認的用戶密碼錯誤數量爲10。可以通過dba角色進行查看。
其中FAILED_LOGIN_ATTEMPTS的值爲錯誤數量。默認爲10。
select * from dba_profiles;
2)進行修改爲30次
alter profile default limit FAILED_LOGIN_ATTEMPTS 30;
3)修改爲無限次(不推薦,會造成數據庫資源安全問題)
alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;
注:通過修改密碼錯誤的允許次數這種方式只能治標不治本。真正還是需要查看是什麼應用將該賬戶鎖定。
故障排查:
如我此次出的問題爲維護方將TongWeb中間件的服務停掉,但是未正確停掉該服務的java線程,由於維護方認爲線程已經停止,因此在修改oracle用戶的密碼後,沒有按照規定將該服務原有數據源密碼修改,認爲沒有影響,但是恰恰該服務的一個線程還是啓動並在嘗試鏈接該用戶,因此導致頻繁密碼錯誤將用戶鎖定。
可以通過查看數據庫所在安裝目錄的監聽日誌進行時間點定位到應用(由於我們無法遠程到生產方的數據庫,無法查看他們的監聽日誌,因此如下是樣例,不是真正的生產情況)
查看$ORACLE_HOME/network/admin/log/listener.log日誌
10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49434)) * establish * lhoms * 0
10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49435)) * establish * lhoms * 0
這樣可知是上面10.69.1.11的ip嘗試多次失敗登陸造成的被鎖
由於我這邊沒有如此便利條件,因此我是將所有可能鏈接該數據庫的服務器上的進程逐條查看並查看每個應用的數據庫配置才找到原因。
2.第二個原因是該用戶過期,默認的用戶過期時間爲180天,如果用戶時間超過180天,則也會鎖定用戶。
使用dba角色用戶登錄,處理該問題。
1)查看該用戶的profile,一般爲default
select username,profile from dba_users;
2)查看指定概要文件找到用戶的權限所代表的時間,如default
select * from dba_profiles where profile = 'DEFAULT' and resource_name = 'PASSWORD_LIFE_TIME';
3)修改該字段爲unlimited,將默認180天修改成‘無限制’
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
修改結束後不需要重啓數據庫直接生效。
4)之後需要將密碼激活,使用dba角色登陸
alter user username identified by <原來的密碼>。