參考官方文檔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/oracle@10.0.0.10: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/oracle@10.0.0.10: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 SYS@10.0.0.10: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 SYS@10.0.0.10:1522/study>
好了,對oracle監聽有個大概的了解