ORACLE監聽理解


參考官方文檔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參數了

image


配置監聽可以通過netca圖形配置,也可以命令配置

image默認監聽的名稱LISTENER,配置如上,實際上沒有這個listener.ora,默認listen也是可以正常運行的


那么下面增加一個在1522端口的非默認動態監聽,名稱叫listener2

首先netmgr圖形添加一個監聽

image

或者編輯listener.ora來添加監聽也行

image

然后修改tnsnames.ora添加一個listener2的字符串,以便修改local_listener參數,(就是把監聽中的那一段復制到tnsnames.ora中)

image設置下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中配置多個地址的字符串

image

再設置alter system set local_listener='LISTENER2';


在共享服務器模式下,可以配置listener的一個參數叫做dispatchers,把這個分派器注冊到一個非默認監聽

ALTER SYSTEM SET DISPATCHERS=”(PROTOCOL=tcp)(LISTENER=lsnr2)”;


image

select service_id,name from v$active_services可以查出,前面2個服務是注冊到監聽的,后面2個是Oracle有兩個內部的服務,SYS$BACKGROUND是后台進程使用的,SYS$USERS提供給沒有指定服務的用戶會話使用


imageservice_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監聽有個大概的了解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM