新聞中心
專(zhuān)業(yè)的數(shù)據(jù)管理基礎(chǔ)設(shè)施及服務(wù)供應(yīng)商
技術(shù)棧|有了這三步,再也不擔(dān)心“ORA-00020:超出最大連接數(shù)”
發(fā)布日期:
2022-08-28

如果把數(shù)據(jù)中心建設(shè)比喻成西天取經(jīng),那旅途上的九九八十一難就是我們不得不躲閃、跨越、攻堅(jiān)的堡壘。希嘉推出“技術(shù)?!卑鍓K,集結(jié)數(shù)據(jù)治理BU團(tuán)隊(duì)的眾位技術(shù)大拿,將我們?cè)跀?shù)據(jù)治理與全域數(shù)據(jù)中心建設(shè)中跨越的溝溝坎坎做逐期分享,陪伴高校用戶(hù)共赴坦途。


高校中最為常見(jiàn)的數(shù)據(jù)庫(kù)就是Oracle Database了,各業(yè)務(wù)系統(tǒng)后臺(tái)數(shù)據(jù)庫(kù)、共享數(shù)據(jù)庫(kù)、數(shù)據(jù)倉(cāng)庫(kù)等,大部分均在使用9i、10G、11G、12C等版本的Oracle數(shù)據(jù)庫(kù)。隨著信息化建設(shè)日趨完善,業(yè)務(wù)部門(mén)之間的數(shù)據(jù)互通頻率增大、各自結(jié)合數(shù)據(jù)的管理創(chuàng)新也越來(lái)越多,隨之而來(lái)的是對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)頻率也越來(lái)越高,尤其是校級(jí)的共享數(shù)據(jù)庫(kù)或數(shù)據(jù)倉(cāng)庫(kù)。


但因?yàn)樾<?jí)數(shù)據(jù)平臺(tái)建設(shè)時(shí)重點(diǎn)關(guān)注的是數(shù)據(jù)集成范圍是否夠大、業(yè)務(wù)標(biāo)準(zhǔn)口徑是否統(tǒng)一、數(shù)據(jù)交換的技術(shù)手段是否豐富等,而忽略了數(shù)據(jù)平臺(tái)“性能”方面的問(wèn)題,一些數(shù)據(jù)庫(kù)的基礎(chǔ)架構(gòu)、性能參數(shù)往往不是最優(yōu),導(dǎo)致校級(jí)數(shù)據(jù)平臺(tái)在運(yùn)行階段頻頻出現(xiàn)故障。今天就來(lái)聊一聊“Oracle數(shù)據(jù)庫(kù)超出最大連接數(shù)”的故障如何解決以及預(yù)防。


數(shù)據(jù)庫(kù)的連接數(shù)是有限制的,超過(guò)這個(gè)限制,其就會(huì)拒絕新的訪問(wèn)請(qǐng)求,出現(xiàn)如下截圖錯(cuò)誤:

技術(shù)棧|有了這三步,再也不擔(dān)心“ORA-00020:超出最大連接數(shù)”

我們常說(shuō)的“ORA-00020:超出最大連接數(shù)”錯(cuò)誤


出現(xiàn)這個(gè)錯(cuò)誤怎么辦?如圖所示,連超級(jí)管理員用戶(hù)都登錄不上去,想去操作數(shù)據(jù)庫(kù)重啟或調(diào)整都沒(méi)有機(jī)會(huì)。此時(shí)需要考慮故障報(bào)錯(cuò)信息背后的原因:


● 當(dāng)前數(shù)據(jù)庫(kù)允許的最大連接數(shù)是多少?

●?是什么原因?qū)е鲁鲎畲筮B接數(shù)?

●?這個(gè)連接數(shù)是數(shù)據(jù)庫(kù)參數(shù)嗎?可以修改嗎?

●?應(yīng)用端著急上線某個(gè)軟件,怎么緊急處理?

●?處理完故障后續(xù)怎么預(yù)防?


順著上面的思路,我們來(lái)理解下。數(shù)據(jù)庫(kù)有一個(gè)數(shù)據(jù)庫(kù)參數(shù)processes,在安裝時(shí)如果不做特別設(shè)置,其默認(rèn)設(shè)置是processes=150,也就是數(shù)據(jù)庫(kù)允許150個(gè)進(jìn)程訪問(wèn)。如果上述問(wèn)題出現(xiàn),可以分為應(yīng)急處理、適當(dāng)優(yōu)化和后續(xù)預(yù)防三個(gè)步驟來(lái)處理。


01? 應(yīng)急處理

使用管理員用戶(hù)登錄上數(shù)據(jù)庫(kù)并進(jìn)行調(diào)整,首先查看以前是否有已登錄的管理員用戶(hù)窗口。如果有,使用該窗口進(jìn)行管理,如果沒(méi)有,則啟用特殊命令登錄數(shù)據(jù)庫(kù)。這里以上面后一種最極端的場(chǎng)景來(lái)說(shuō)明。


技術(shù)棧|有了這三步,再也不擔(dān)心“ORA-00020:超出最大連接數(shù)”

我們常說(shuō)的“ORA-00020:超出最大連接數(shù)”錯(cuò)誤


技術(shù)棧|有了這三步,再也不擔(dān)心“ORA-00020:超出最大連接數(shù)”

查看當(dāng)前數(shù)據(jù)庫(kù)設(shè)置的最大連接數(shù)是多少


技術(shù)棧|有了這三步,再也不擔(dān)心“ORA-00020:超出最大連接數(shù)”

使用sql語(yǔ)句查詢(xún)當(dāng)前的連接數(shù)

注:這里是測(cè)試環(huán)境,如果是故障環(huán)境,這里的連接數(shù)據(jù)應(yīng)該被占滿了


如果連接數(shù)事實(shí)上已經(jīng)達(dá)到了數(shù)據(jù)庫(kù)規(guī)定的上限,那么進(jìn)一步查找是哪些進(jìn)程一直占用數(shù)據(jù)庫(kù)連接而不釋放。


技術(shù)棧|有了這三步,再也不擔(dān)心“ORA-00020:超出最大連接數(shù)”


使用如圖語(yǔ)句查詢(xún)


上圖中查詢(xún)出終端應(yīng)用程序是PLSQL客戶(hù)端的連接進(jìn)程,其中SPID就是占用數(shù)據(jù)庫(kù)連接的數(shù)據(jù)庫(kù)服務(wù)器上的系統(tǒng)進(jìn)程號(hào)。明確問(wèn)題根源,使用sql語(yǔ)句拼接系統(tǒng)命令行批量執(zhí)行,殺掉導(dǎo)致連接數(shù)被占滿的進(jìn)程從而釋放連接數(shù)。


技術(shù)棧|有了這三步,再也不擔(dān)心“ORA-00020:超出最大連接數(shù)”


組裝系統(tǒng)命令的sql語(yǔ)句


復(fù)制這些命令,在數(shù)據(jù)庫(kù)服務(wù)器命令號(hào)執(zhí)行,殺掉占用過(guò)高的進(jìn)程。至此,故障基本排除,新的連接已經(jīng)可以連接進(jìn)數(shù)據(jù)庫(kù)了。


注意:這里要謹(jǐn)慎查找并根據(jù)實(shí)際經(jīng)驗(yàn)判斷“連接數(shù)被占滿的主要進(jìn)程”,千萬(wàn)不要盲目殺進(jìn)程,導(dǎo)致殺掉系統(tǒng)進(jìn)程或數(shù)據(jù)庫(kù)后臺(tái)進(jìn)程,進(jìn)而出現(xiàn)數(shù)據(jù)庫(kù)故障。


在高校場(chǎng)景中,大量終端用戶(hù)使用PLSQL等數(shù)據(jù)庫(kù)開(kāi)發(fā)工具做相關(guān)的數(shù)據(jù)查詢(xún)、調(diào)試和編碼,常常是一個(gè)PLSQL開(kāi)十?dāng)?shù)個(gè)窗口,而每一個(gè)窗口都是一個(gè)單獨(dú)的會(huì)話,一個(gè)單獨(dú)的會(huì)話就可能占用3-5個(gè)進(jìn)程。工程師如果長(zhǎng)期不關(guān)閉調(diào)試窗口,這樣算下來(lái)每個(gè)人將占用30-50個(gè)進(jìn)程資源,人數(shù)多了之后對(duì)數(shù)據(jù)庫(kù)的進(jìn)程資源造成了嚴(yán)重的占用。


實(shí)際環(huán)境中,常常需要根據(jù)經(jīng)驗(yàn)判斷應(yīng)該差殺掉哪些占用數(shù)據(jù)庫(kù)進(jìn)程數(shù)的會(huì)話,所以要結(jié)合一些條件進(jìn)行判斷。通常可以通過(guò)查詢(xún)v$session視圖,結(jié)合該視圖的數(shù)據(jù)進(jìn)行判斷。常用的判斷條件有下列幾個(gè):


●?USERNAME:數(shù)據(jù)庫(kù)用戶(hù)名

●?MACHINE:遠(yuǎn)端連接的PC名稱(chēng)

●?OSUSER:遠(yuǎn)端PC名及系統(tǒng)用戶(hù)名

●?PROGRAM:遠(yuǎn)端連接的軟件名稱(chēng)

●?MODULE:遠(yuǎn)端連接軟件的模塊名

●?LOGON_TIME:登錄時(shí)間


技術(shù)棧|有了這三步,再也不擔(dān)心“ORA-00020:超出最大連接數(shù)”


常用判斷字段


經(jīng)過(guò)上面的操作,基本可以使數(shù)據(jù)庫(kù)正常響應(yīng)新的連接請(qǐng)求。至此,可以說(shuō)“ORA-00020:超出最大連接數(shù)”故障已經(jīng)得到解決。但故障的背后往往隱藏著隱患。除了由于操作不規(guī)范造成故障,那么有沒(méi)有預(yù)防的方法呢?


02? 適當(dāng)優(yōu)化


如上所述,通過(guò)類(lèi)似windows任務(wù)管理器查殺占用過(guò)高的進(jìn)程的方法,殺掉Oracle數(shù)據(jù)庫(kù)中多余的進(jìn)程去消除故障。那么對(duì)于典型高校的校級(jí)數(shù)據(jù)平臺(tái)場(chǎng)景,是否有主動(dòng)預(yù)防的相關(guān)技術(shù)手段呢?當(dāng)然可以,可以通過(guò)修改數(shù)據(jù)庫(kù)系統(tǒng)參數(shù)來(lái)適當(dāng)擴(kuò)大數(shù)據(jù)庫(kù)允許連接進(jìn)程的上限數(shù)值。通過(guò)下述命令可以修改:

技術(shù)棧|有了這三步,再也不擔(dān)心“ORA-00020:超出最大連接數(shù)”


上圖顯示并沒(méi)有修改成功,因?yàn)樵搮?shù)需重啟數(shù)據(jù)庫(kù)生效


在高校中,可以選取一個(gè)合適的停機(jī)窗口重啟數(shù)據(jù)庫(kù)使這個(gè)參數(shù)生效,從而增加數(shù)據(jù)庫(kù)連接數(shù)被占滿的周期。


技術(shù)棧|有了這三步,再也不擔(dān)心“ORA-00020:超出最大連接數(shù)”


數(shù)據(jù)庫(kù)連接進(jìn)程數(shù)上限已經(jīng)修改生效


————————————————————————————————————————————


03? 后續(xù)預(yù)防


通過(guò)修改參數(shù)增加數(shù)據(jù)庫(kù)連接最大限制數(shù)參數(shù)就高枕無(wú)憂了?調(diào)試窗口、程序連接等操作如果長(zhǎng)時(shí)間不釋放,日積月累調(diào)整后的連接限制遲早也會(huì)被占滿。這里提供一種動(dòng)態(tài)監(jiān)控自動(dòng)釋放長(zhǎng)時(shí)間不用的數(shù)據(jù)庫(kù)連接的方式。


修改數(shù)據(jù)庫(kù)sqlnet配置,oracle 11g 默認(rèn)在/oracle/product/11.2.0/network/admin/下沒(méi)有sqlnet.ora文件,從samples目錄復(fù)制sqlnet.ora文件到/oracle/product/11.2.0/net-work/admin/路徑下,在復(fù)制的文件中添加配置SQLNET.EXPIRE_TIME=20并保存,設(shè)置非活動(dòng)會(huì)話超過(guò)20分鐘即自動(dòng)斷開(kāi)。通過(guò)這個(gè)配置,可以達(dá)到定期清理非活動(dòng)會(huì)話,從而減少會(huì)話產(chǎn)生的對(duì)進(jìn)程數(shù)上限的占用問(wèn)題。



總結(jié)



“ORA-00020:超出最大連接數(shù)”錯(cuò)誤可以從三個(gè)層面去解決:


●?首先,利用經(jīng)驗(yàn)和技術(shù)“查殺”不必要的數(shù)據(jù)庫(kù)進(jìn)程,解決當(dāng)務(wù)之急;

●?其次,從數(shù)據(jù)庫(kù)規(guī)模、使用范圍及日常壓力判斷,修改數(shù)據(jù)庫(kù)參數(shù)到一個(gè)合理的值;

●?最后,使用監(jiān)聽(tīng)技術(shù)來(lái)加固數(shù)據(jù)庫(kù)連接的持有條件,從而徹底避免數(shù)據(jù)庫(kù)連接“只增不減”的情況。



上述例子說(shuō)明,數(shù)據(jù)庫(kù)不是一經(jīng)部署就可以長(zhǎng)久使用的,就像一輛汽車(chē),在使用過(guò)程中需要不斷排障和保養(yǎng),數(shù)據(jù)庫(kù)需要在日常中不斷發(fā)現(xiàn)問(wèn)題、解決問(wèn)題。從應(yīng)急處理,到優(yōu)化技術(shù)再到建立動(dòng)態(tài)防護(hù)機(jī)制多個(gè)層面,關(guān)注數(shù)據(jù)庫(kù)的運(yùn)行情況,避免由于底層軟件錯(cuò)誤導(dǎo)致的上層業(yè)務(wù)中斷。