1. 程式人生 > >密碼過期導致Oracle process耗盡問題

密碼過期導致Oracle process耗盡問題

oracle忽然連不上!

大致是報這樣的錯:

ORA-12516: TNS: 監聽程式找不到符合協議堆疊要求的可用處理程式
ORA-12520: TNS: 監聽程式無法為請求的伺服器型別找到可用的處理程式

但又不是全部時間都報錯,有時候又正常,尤其是將資料庫剛重啟之後。

用oracle管理員sys進去看,直接原因是oracle的程序數process爆表了:

SQL> show parameter processes;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------
aq_tm_processes integer 1 db_writer_processes integer 1 gcs_server_processes integer 0 global_txn_processes integer 1 job_queue_processes integer 1000 log_archive_max_processes integer 4
processes integer 300

可知processes的限定值為300;而當前使用數量為

SQL> select count(*) from v$process;

  COUNT(*)
----------
        299

所以連線不進去。那為啥process用了這麼多?以前又沒發現有這個問題。
檢視會話數,發現與process嚴重不對等,只有區區30多個:

SQL> select count(*) from v$session where status='ACTIVE';

  COUNT(*)
---------- 34

所謂的會話,就是已經連線到資料庫了,我的oracle是DEDICATED(專用)模式,通常process與session是一對一關係。所以這裡process比session多出來那麼多,除去oracle本身的開銷,說明引起oracle資源耗盡的原因,不是資料庫裡面的操作,而是在外面。

再看是啥佔用process最多:

SQL> select count(*),program from v$process group by program having count(*) > 1
;

  COUNT(*) PROGRAM
---------- ----------------------------------------------------------------
        255 ORACLE.EXE (SHAD)

這個ORACLE.EXE (SHAD)與oracle連線有關。所以,最有可能是有個東西在連線我們的oracle,但又連不上,於是不停地嘗試,oracle不斷建立process進行響應,最後導致資源耗盡,死翹翹了

那個鬼東西是啥?我逐一排查。停掉一些伺服器上的程式,沒啥效果,最後停掉arcgis,process一下子降下來了。罪魁禍首原來是arcgis!

為啥arcgis會不斷連線oracle呢?檢視它的錯誤日誌,發現有提示密碼過期!

The Layer:'****專案' in Map:'圖層' is invalid. The base table definition string "SDE.****" is invalid. User password has expired.

奇怪啊,咋會過期呢?我好奇地用連線串中指定的賬號登入oracle,結果真的提示密碼過期!

SQL> conn sde/sde@pdbhnhy;
ERROR:
ORA-28001: the password has expired


更改 sde 的口令
新口令:

我靠。幾天來的問題元凶終於找到了,我禁不住老淚縱橫。

還沒有結束。為啥密碼會過期?原來,oracle11g和之後(我的oracle是12C),預設賬號密碼期限是180天。

SQL> select * from dba_profiles where profile='DEFAULT' and resource_name='PASSWORD_LIFE_TIME';

PROFILE              RESOURCE_NAME        RESOURCE LIMIT                COM
-------------------- -------------------- -------- -------------------- -
DEFAULT              PASSWORD_LIFE_TIME   PASSWORD 180            NO

為一勞永逸,將密碼改為沒有期限限制:

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

修改之後不需要重啟動資料庫,會立即生效。

修改後,還沒有被提示ORA-28002警告的帳戶不會再碰到同樣的提示; 已經被提示的帳戶必須再改一次密碼,舉例如下:

$sqlplus / as sysdba
sql> alter user smsc identified by <原來的密碼> ----不用換新密碼

網上有文章說遇到這種錯誤,可以將process的限定值設大一點,我認為這是沒有搞清錯誤根源的應對之道。像我這種情況,就算你將process設得再大,也經不起損耗。更何況,修改oracle的系統引數,風險太大了,搞不好整個資料庫都起不來,到時哭都沒有眼淚。我上次就是因為看了網上一篇文章的指引,想著調大一點記憶體設定,結果資料庫再也沒能啟動過。要不是有備份,我都不知道怎麼交代。

不過,oracle12C號稱支援外掛資料庫,幾個外掛資料庫(PDB)共用一個容器資料庫(CDB),也就是例項了,但是這個process數量也是共用的。所以PDB數量一多,process也有可能出現不夠的問題。這時的話,或許也可以將proess設大一點。不過,竊以為,新增一個例項會更合適。

另外,oracle為啥要不斷新增process來響應這種無謂的連線請求呢?豈不是很容易被飽和攻擊?也太遜了點吧,這就是號稱資料庫頭把交椅的oracle?我估計,如果是賬號密碼不對的請求,oracle是不會有什麼迴應的;但對於密碼過期,可能比較特殊:有反應,能連,但操作不了,造成客戶端不斷的去請求?

=================================
如果系統已經提示密碼過期,或即將過期,則修改配置檔案還是不夠的。仍然要修改一次密碼。