范美卉,張俊萌
(大連康復療養中心,遼寧 大連 116013)
想要使用Oracle 數據庫,首先需要用戶與數據庫建立連接,而怎么在兩者之間建立連接,Oracle使用了一個叫網絡服務的概念,從而客戶端或者中間層的應用服務器與數據庫服務器能建立連接,并能在兩者之間傳遞數據。在客戶端,網絡服務作為后臺運行的進程,在數據庫服務器端,網絡服務則通過一個叫“監聽器”的組件接收來自客戶端的連接請求。監聽器(LISTENER)是位于服務器端的、獨立運行的一個后臺進程,運行在服務器端,但獨立于數據庫服務器單獨運行,在數據庫沒有啟動的時候,監聽器也能獨立運行。
Oracle 監聽負責監聽客戶端傳入的連接請求,同時也負責調整服務器的連接負荷??蛻舳嗽噲D連接數據庫服務器時,監聽器將接收到客戶端的請求并將其傳遞給服務器進行處理。一旦客戶端與服務器建立連接,它們之后將直接進行通信,而不再需要監聽器的介入,監聽器將保持空閑狀態。dbca建庫后一般會有默認配置好的監聽,默認服務端口是1521,通常一個庫一個監聽就足夠,但如果需要處理大量并發請求數,就可能需要配置多個監聽,非默認監聽的端口號設置成大于1024,不同監聽之間服務名和端口號不能一樣[1]。
配置監聽器有兩種方法。
如圖1所示,選中圖中的Oracle Net配置下的本地樹形目錄中的監聽程序項,再點擊左側綠色的“+”按鈕添加監聽程序,點擊監聽程序目錄,新加的監聽器名稱默認為LISTENER。選中該名稱,窗口右側欄的下拉選項中含有四個選項:一般參數、監聽位置、數據庫服務、其他服務,選中“監聽位置”,點擊添加地址按鈕。在出現的網絡地址欄的協議下拉選項中選中“TCP/IP”,主機文本框中輸入主機名稱或IP地址(如果主機即用作服務端也作為客戶端,輸入兩項之一均有效;如果主機作為服務端并需要通過網絡連接,建議輸入IP地址),端口文本框中輸入數字端口,默認是1521,也可以自定義任意有效數字端口[2]。

圖1 Net Manager
在對監聽器配置文件進行任何修改之前,先備份原始的listener.ora 文件,以防出現意外情況導致配置錯誤。
ORA-12541:TNS:無監聽程序報錯常見原因是監聽程序未啟動或已停止。如果監聽程序未運行,那么客戶端就無法與數據庫建立連接,從而導致ORA-12541錯誤的出現。此外,還可能存在網絡故障、防火墻設置不正確或數據庫實例未正確注冊到監聽程序等問題。除了這些普遍的報錯原因,有一種情況是我們日常里經常忽略的,是因為系統的監聽日志文件(listener.log)的大小超過了4GB,導致在監聽程序往日志文件里面寫日志時寫入不成功,從而使監聽不能正常運行,客戶端連接不上服務器,不能正常登錄。
監聽器日志(listener.log)是一個存儲關于監聽器工作和錯誤信息的記錄庫,用于記錄和描述監聽器的工作過程和錯誤情況。通過仔細研究日志的內容,就能夠發現一些當前監聽器所存在的問題,從而解決相關連接故障,并更加深入地理解監聽器的工作原理。監聽器日志是通過監聽器自動創建的純文本文件,如果日志文件丟失,系統會自動重新生成一個同名的文件,與告警日志文件相類似。監聽器日志文件的尺寸會不斷自動增長,占用額外的存儲空間,超過4GB會導致LISTENER 監聽器無法處理新的連接,超過2GB 給寫入、查看帶來的一些性能問題,所以通常過2GB時就應該將其備份。
首先找到監聽器日志所在目錄,一般在$ORACLE_HOME/network/log 的目錄下,如果數據庫是Oracle 11g則位于$ORACLE_BASE/diag/tnslsnr/$hostname/listener/listener.log。Oracle 監聽器在運行時由于無法對日志文件進行一些刪除、重命名操作,所以只能先將監聽服務停了再操作。先停止Oracle監聽服務,然后對日志文件進行備份,將文件重命名,再重新打開監聽服務,這時就能在原日志文件位置處看到一個新的listener.log文件生成了。
ORA-12516:TNS:監聽程序找不到符合協議堆棧要求的可用處理程序,當Oracle數據庫的請求量超過監聽程序的處理能力時,就會出現這個錯誤。優化數據庫性能:如果ORA-12516錯誤是由于數據庫負載過重引起的,可以通過優化數據庫的性能來減輕負載,比如調整SQL 查詢、增加數據庫緩存等措施。增加監聽程序的處理能力:可以通過增加監聽程序的最大連接數或者調整其他相關參數來增加其處理能力。即session進程數不夠,超過連接最大進程數值從而導致無法登錄,即使用sys as dba 也登錄不上,首先需要先斷開正在占用的procress,即停掉幾個tomcat即可釋放連接,接下來就可以正常登錄了[3]。
1)先把電腦重啟,這樣后臺會釋放一些連接數,但這個方法很明顯只是階段性解決了連接故障,治標不治本,暫時性的緩解數據庫壓力,一段時間后仍然會出現這個問題。
2)直接修改Oracle數據庫的最大連接數與最大進程數。
①打開運行界面輸入cmd回車進入數據庫服務器dos界面。
sqlplus/nolog
conn/as sysdba --以sysdba 管理員身份登錄數據庫
select count(*)from v$process --查看數據庫當前進程數
select count(*)from v$session --查看數據庫當前連接數
select value from v$parameter where name ='processes' --查看數據庫允許的最大連接數
select value from v$parameter where name='sessions' --查看數據庫允許的最大進程數
alter system set processes=800 scope=spfile --修改最大進程數為800
alter system set sessions=335 scope=spfile --修改最大連接數:為885(ORACLE 的連接數與其進程數關系最好為sessions=(1.1*process+5))
shutdown immediate --關閉數據庫
startup --啟動數據庫[4];
②關閉cmd 命令窗口,打開”任務管理器”,點擊“服務”選項,找到oracleoradb11g_home1TNSListener,OracleServiceORCL 服務鼠標右鍵選擇“重新啟動”。
出現如上報錯情況,最大可能是在配置Oracle 客戶端時,步驟上有些錯誤被人忽略掉了。1)服務名或SID 錯誤:檢查listener.ora 文件中的配置,確保在連接描述符中指定了正確的服務名或SID。2)監聽程序未啟動:如果監聽程序未運行或未正確配置,那么它將無法識別連接請求的服務。確認監聽程序是否已經啟動,并且監聽器配置文件listener.ora 中是否包含了正確的監聽地址和端口。3)防火墻或網絡問題:防火墻或網絡配置問題可能會導致監聽程序無法正常工作。確保網絡連接沒有被阻塞,并且防火墻允許通過監聽程序使用的端口進行通信。4)監聽程序故障:有時候監聽程序可能會出現故障或停止工作。你可以嘗試重新啟動監聽程序來解決此問題。若是第一次連接報錯,大概率是因為在你安裝完之后未配置監聽或者監聽失效了,就需要重新配置監聽。打開監聽程序和網絡服務配置助手,如圖2所示。

圖2 監聽程序和網絡服務配置助手
選擇監聽程序配置,點擊下一步,先把失效的監聽刪除,之后再在配置助手里重新添加,在圖3界面進行添加和刪除操作,監聽名默認為LISTENER。也可能之前雖配置了監聽但是系統未寫入listener.ora 文件中,所以只需要在該文件中寫入配置參數就可以了。當務之急是需要重新啟動Oracle數據庫的服務器,重啟后再進行連接,此時我們就能連接上數據庫了,同時發現連接PL/SQL 也成功了。若是突然連接不上,則查看Oracle服務是否開啟,即OracleServiceORCL重啟一下。

圖3 監聽程序的添加與刪除
在Oracle 數據庫安裝完成后,程序都正常運行了一段時間,但突然某日發現數據庫就無法登錄了,在Oracle 安裝服務器本地cmd 中執行sqlplus as sysdba,結果就提示:ORA-12560,協議適配器錯誤。
報錯原因及解決方法出現ORA-12560: TNS: 協議適配器錯誤的問題的原因,總結如下。
1)Oracle監聽服務沒有啟動起來或者監聽服務失效、database instance數據庫實例沒有啟動起來。下面都以Windows操作系統作為示例,進行操作說明:點擊開始運行,輸入services.msc,打開服務面板,重新啟動OracleOraDb11g_home1TNSListener 服務(以Oracle11g數據庫為例)。同樣的在服務面板,重新啟動oracleserviceXX,XX是自己設置的database SID,例如我的服務OracleServiceORCL,ORCL就是配置的實例名。
2)注冊表問題,數據庫實例名存在更改情況。點擊運行,輸入regedit,進入注冊表文件,找到KEY_LOCAL_MACHINE 文件夾下的SOFTWARE 下的ORACLE的HOME0,將里面的ORACLE_SID這個環境變量設置為自己設置的database SID。然后右擊我的電腦,點擊屬性,選中高級選項欄,點擊環境變量,對系統變量進行配置,新建系統變量,編輯變量名為oracle_sid,變量值為自己設置的database SID。
3)核實本地環境變量path的值。值為C:appAdministratorproduct11.2.0client1in;
D:appClient64Administratorproduct11.2.0client 64in%JAVA_HOME%in;%JAVA_HOME%jrein。在此處可以看出兩個問題:第一,path配置了兩個客戶端的client的oracle變量,沒有配置數據庫服務端的路徑;第二,數據庫服務端的路徑沒有單獨配置oracle_home 環境變量[5]。解決方案:添加獨立的oracle_home環境變量,變量值為路徑:C:appAdministratorproduct11.2.0dbhome_1。修改path環境變量值,修改后值為:%ORACLE_HOME%in;
C:appAdministratorproduct11.2.0client_1in;D:appClient64Administratorproduct11.2.0client_64in;%JAVA_HOME%in;%JAVA_HOME%jrein也就是在原來的path 路徑中添加了一個引用oracle_home的路徑:%ORACLE_HOME%in。
數據庫管理者與維護人員在與數據庫打交道的日常工作中,會遇到很多連接故障問題,如何快速排除數據庫故障需要不斷探索、學習。當連接Oracle 數據庫遇到監聽錯誤時,應該首先確定具體的錯誤代碼,并根據錯誤信息采取相應的解決方法。通過仔細檢查監聽程序配置、網絡連接和數據庫性能等方面的問題,可以解決大多數的Oracle監聽錯誤。本文以監聽相關的4種常見連接報錯為例,分析了報錯的原因并給出了相應的解決方法,為技術人員在遇到Oracle 監聽常見報錯時提供了解決的參照方法。