參考官方文檔Net Services Reference的7 Oracle Net Listener Parameters (listener.ora)1 監聽概念oracle監聽,是個伺服器端進程,負責監聽客戶端發來的請求監聽器可以不必駐留在資料庫主機上,即可以把實例註冊到遠程主機上的監聽監聽是o... ...
參考官方文檔Net Services Reference的7 Oracle Net Listener Parameters (listener.ora)
1 監聽概念
oracle監聽,是個伺服器端進程,負責監聽客戶端發來的請求
監聽器可以不必駐留在資料庫主機上,即可以把實例註冊到遠程主機上的監聽
監聽是oracle自帶的軟體或者說組件
本地連接可以不用監聽,但是遠程連接必須要
oracle監聽收到user process發出的request後,派生出server process來提供服務,server進程根據資料庫的配置有2種模式:專有模式和共用模式
專有模式:每個客戶端進程都有單獨的server進程來建立session提供服務,絕大部分超過99%的資料庫都是這種模式
共用模式:有個分配器叫dispatch,監聽把請求放入請求隊列中,dispatch會不停的查詢請求隊列,當發現有請求時候就把請求轉給server進程,再通過server進程提供服務,處理完後反饋給響應隊列,dispatch再把響應隊列中的轉發給用戶進程。類似與飯館吃飯,server進程相當於廚師,dispatch相當於服務員,服務員接受請求並轉發給相應的空閑廚師提供服務,廚師做好的菜放在哪兒,服務員再端給客戶;這種模式用的不多
dbca建庫後一般會有預設監聽,不用再配置,監聽的服務埠預設1521
一般的庫一個監聽就夠了,但是併發量太大的話可能需要配置多個監聽,非預設監聽的埠號大於1024即可,不同監聽之間服務名和埠號不能一樣
監聽如何區別不同的庫呢,所以需要把實例進行服務註冊,註冊到listen中,
註冊就是將主機上跑的實例添加到listen里,讓listen知道主機上有哪些實例
2 配置方法
2.1 動態註冊
服務註冊有2種,一種是動態註冊,是通過pmon進程主動的自動的把實例註冊到listen中
監聽和實例的啟動順序,當監聽先啟動,沒問題,如果監聽後啟動,那麼可以手工alter system register註冊下,或者不用管,pmon會隔一段時間就去註冊下
一般預設監聽是動態註冊
不需要listener.ora文件
服務狀態中有status READY(庫在mount或者open狀態)字樣
pmon給監聽提供實例名、服務名、服務處理程式的類型和地址
註冊的服務名叫 db_name.db_domain,db_nameXDB.db_domain
如果要pmon註冊到非預設監聽,就要配置local_listener參數了
配置監聽可以通過netca圖形配置,也可以命令配置
預設監聽的名稱LISTENER,配置如上,實際上沒有這個listener.ora,預設listen也是可以正常運行的
那麼下麵增加一個在1522埠的非預設動態監聽,名稱叫listener2
首先netmgr圖形添加一個監聽
或者編輯listener.ora來添加監聽也行
然後修改tnsnames.ora添加一個listener2的字元串,以便修改local_listener參數,(就是把監聽中的那一段複製到tnsnames.ora中)
設置下local_listener參數並手工註冊下即可,
[oracle@study admin]$ sql SQL*Plus: Release 11.2.0.1.0 Production on Thu Sep 19 17:07:41 2019 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 17:07:42 SYS@study> show parameter local_list NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ local_listener string 17:08:19 SYS@study> alter system set local_listener='LISTENER2'; System altered. Elapsed: 00:00:00.04 17:09:03 SYS@study> alter system register; System altered. Elapsed: 00:00:00.00 17:09:21 SYS@study> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@study admin]$ lsnrctl status listener2 LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 19-SEP-2019 17:10:22 Copyright (c) 1991, 2009, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=study.localdomain)(PORT=1522))) STATUS of the LISTENER ------------------------ Alias listener2 Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production Start Date 19-SEP-2019 16:38:16 Uptime 0 days 0 hr. 32 min. 6 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/study/listener2/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=study.localdomain)(PORT=1522))) Services Summary... Service "study" has 1 instance(s). Instance "study", status READY, has 1 handler(s) for this service... Service "studyXDB" has 1 instance(s). Instance "study", status READY, has 1 handler(s) for this service... The command completed successfully [oracle@study admin]$
不過這樣的話預設,pmon就不會往預設監聽中註冊了,也就是從1521訪問不到了,如果要1521 1522同時提供服務,可以刪除預設監聽,配置改為
LISTENER2 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = study.localdomain)(PORT = 1522)) (ADDRESS = (PROTOCOL = TCP)(HOST = study.localdomain)(PORT = 1521)) )
由於動態監聽依賴於PMON,刪除監聽配置文件,預設監聽依然有效,監聽依舊監聽localhost:1521,LOCAL_LISTENER這個參數控制實例將自身動態註冊到哪兒,LOCAL_LISTENER 這個參數的預設值是(ADDRESS = (PROTOCOL=TCP)(HOST=hostname)(PORT=1521)),PMON依舊主動註冊實例到監聽,dbca建庫後預設就是這樣的註冊方式
看的出來動態監聽要求監聽和local_listener參數配置是一致的,都是預設的空的配置即預設監聽,非預設就顯示配置這兩個地方即可
tnsnames
.ora在動態監聽中不是必須的,只是為了配置個本地的字元串方便local_listener的配置命令而已,直接配置如下形式也ok
alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=study.localdomain)(PORT=1521))';
等同於alter system set local_listener='';
配置註冊到多個監聽,可以如下
alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=study.localdomain)(PORT=1521))','(ADDRESS=(PROTOCOL=TCP)(HOST=study.localdomain)(PORT=1522))';
或者先在tnsnames.ora中配置多個地址的字元串
再設置alter system
set
local_listener=
'LISTENER2'
;
在共用伺服器模式下,可以配置listener的一個參數叫做dispatchers,把這個分派器註冊到一個非預設監聽
ALTER SYSTEM SET DISPATCHERS=”(PROTOCOL=tcp)(LISTENER=lsnr2)”;
select service_id,name from v$active_services可以查出,前面2個服務是註冊到監聽的,後面2個是Oracle有兩個內部的服務,SYS$BACKGROUND是後臺進程使用的,SYS$USERS提供給沒有指定服務的用戶會話使用
service_names是服務名,如果為空,會把db_name.db_domain 註冊到監聽
2.2 靜態註冊
另一種是靜態註冊,服務的狀態一般是status UNKNOWN字樣,靜態註冊是監聽程式根據配置文件listener.ora裡面的配置去監聽指定的地址埠和實例,是oem和其他服務所需要的
靜態註冊不是實例主動去監聽處註冊,而是監聽自己管理一個埠和服務的列表,監聽根據這個列表來將請求轉發到具體的實例
比如如下配置
LISTENER2 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = study.localdomain)(PORT = 1522)) ) SID_LIST_LISTENER2= (SID_LIST= (SID_DESC= (GLOBAL_DBNAME=STUDY) (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1) (SID_NAME=STUDY) ) ) ADR_BASE_LISTENER2 = /u01/app/oracle
GLOBAL_DBNAME即服務名,看service_names參數即可,如果為空,就是db_name.db_domain,或者先動態註冊看一下服務名
SID_NAME需要大寫,否則安裝EM會有影響,如果不確定也可以先動態註冊觀察下
註意命名格式是LISTENER_NAME 和 SID_LIST_LISTENER_NAME
當資料庫關閉的時候,靜態註冊的監聽依舊可以連接,動態監聽就不行了,所以遠程啟動資料庫這樣的操作就一定需要靜態監聽
[oracle@study admin]$ sqlplus sys/[email protected]:1521/study as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Fri Sep 20 10:59:06 2019 Copyright (c) 1982, 2009, Oracle. All rights reserved. ERROR: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor Enter user-name: ^C [oracle@study admin]$ sqlplus sys/[email protected]:1522/study as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Fri Sep 20 10:59:15 2019 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to an idle instance. 10:59:15 [email protected]:1522/study> startup ORACLE instance started. Total System Global Area 1536602112 bytes Fixed Size 2213616 bytes Variable Size 922749200 bytes Database Buffers 603979776 bytes Redo Buffers 7659520 bytes Database mounted. Database opened. 10:59:25 [email protected]:1522/study>
好了,對oracle監聽有個大概的瞭解