Oracle一個實例配置多個監聽


要想給一個Oracle實例配置多個監聽,首先要定義多個監聽器,因為是多個監聽,勢必會有一些監聽端口不是1521.

現在服務端的listener.ora文件中定義如下監聽器:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
    )
  )

L2000 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 2000))
    )
  )

一個監聽1521端口的默認監聽器,一個監聽2000端口的監聽器L2000. 到現在我們還沒有給這兩個監聽器配置相應的Oracle服務.

監聽器與Oracle服務關聯有兩種方式,靜態注冊和動態注冊.

  • 動態注冊

 動態注冊只能注冊到默認的1521端口,而這里我們需要一次性的動態注冊到兩個端口,因為需要使用local_listener.

先在服務端的tnsnames.ora文件里加入一個描述對象ALL_LISTENER,具體叫什么其實都無所謂的.

然后會把它賦值給local_listner,這樣Pmon才知道往那些指定的IP和端口發送注冊請求.

動態注冊的時候,PMon會到tnsnames.ora里面查找描述對象的具體信息,會用到紅色的部分信息,藍色的信息這個時候沒有任何用處,但是稍微會講這個在什么時候使用.

ALL_LISTENER =
(    
DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 2000)) ) (
CONNECT_DATA = (SERVICE_NAME = orcl.getpaid) ) )

SQL> alter system set local_listener=ALL_LISTENER;

系統已更改。

SQL> alter system register;

系統已更改。

其實local_listener也接受直接的地址描述或者地址描述列表.

SQL> alter system set local_listener='(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1522)))';--更改local_listener后原來注冊的服務會取消,然后PMON每隔一分鍾重參試注冊到新地址.下面我們手動觸發注冊.

系統已更改。

SQL> alter system register; --注冊到新的local_listener

系統已更改。

SQL> alter system set local_listener='(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 2000))))'; --同時注冊到1521 和2000 端口.

系統已更改。

SQL> alter system register;

系統已更改。

下面是默認監聽器的狀態,這里看到注冊了兩個服務L2000.getpaid 和orcl.getpaid

LSNRCTL> status
正在連接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
LISTENER 的 STATUS
------------------------
別名                      LISTENER
版本                      TNSLSNR for 32-bit Windows: Version 11.2.0.1.0 - Production
啟動日期                  18-7月 -2014 02:01:29
正常運行時間              0 天 0 小時 0 分 14 秒
跟蹤級別                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
監聽程序參數文件          D:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora
監聽程序日志文件          d:\app\administrator\diag\tnslsnr\pricnessd\listener\alert\log.xml
監聽端點概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
服務摘要..
服務 "CLRExtProc" 包含 1 個實例。
  實例 "CLRExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程序...
服務 "L2000.getpaid" 包含 1 個實例。
  實例 "orcl", 狀態 READY, 包含此服務的 6 個處理程序...
服務 "orcl.getpaid" 包含 1 個實例。
  實例 "orcl", 狀態 READY, 包含此服務的 6 個處理程序...
命令執行成功

動態注冊的服務名為service_name.db_domain, 而我配置了db_domain=getpaid , service_names=ORCL,L2000 ,所以最后動態注冊了兩個服務.

SQL> show parameter db_domain

NAME                                             TYPE                VALUE
------------------------------------ ---------------------- ----------------
db_domain                                      string                getpaid
SQL> show parameter service_name

NAME                                             TYPE                 VALUE
------------------------------------ ---------------------- ----------------
service_names                                string                ORCL, L2000

  • 靜態注冊

在服務端的listener.ora里對監聽器L2000配置靜態的服務名稱和實例名,下面沒有列出默認監聽器的配置.

此時的默認監聽器還是監聽在1521端口的,而且沒有設置local_listener(alter system reset local_listener 可以把local_listener還原成默認值).

所以Pmon會默認注冊到默認監聽器的.

因此我們只需要在給監聽在2000端口的L2000配置靜態服務,這樣就有兩個監聽器為我們的實例服務了.

L2000 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 2000))
)
)

SID_LIST_L2000 =
 (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl.getpaid)
      (ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
      (SID_NAME = orcl)
    )
  )

這里的GLOBAL_DBNAME=service_name.db_domain,和自動注冊是在lsnrclt里看到的服務是一樣的.

LSNRCTL> start l2000
啟動tnslsnr: 請稍候...

TNSLSNR for 32-bit Windows: Version 11.2.0.1.0 - Production
系統參數文件為D:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora
寫入d:\app\administrator\diag\tnslsnr\pricnessd\l2000\alert\log.xml的日志信息
監聽: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=2000)))

正在連接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=2000)))
LISTENER 的 STATUS
------------------------
別名 l2000
版本 TNSLSNR for 32-bit Windows: Version 11.2.0.1.0 - Production
啟動日期 18-7月 -2014 02:36:54
正常運行時間 0 天 0 小時 0 分 1 秒
跟蹤級別 off
安全性 ON: Local OS Authentication
SNMP OFF
監聽程序參數文件 D:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora
監聽程序日志文件 d:\app\administrator\diag\tnslsnr\pricnessd\l2000\alert\log.xml
監聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=2000)))
服務摘要..
服務 "CLRExtProc" 包含 1 個實例。
實例 "CLRExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程序...
服務 "orcl.getpaid" 包含 1 個實例。
實例 "orcl", 狀態 UNKNOWN, 包含此服務的 1 個處理程序...
命令執行成功

  • 至此服務器端的監聽配置就完成了,客服端的tnsnames.ora 配置文件里加入如下描述符.

ORCL描述符會把請求發到1521端口的默認監聽器,L2000會把請求發到監聽2000端口的L2000監聽器.

ORCL =
(    DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = orcl.getpaid)
)
)

L2000 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 2000))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl.getpaid)
)
)

先用tnsping來測試描述符對應的地址能否連接上,tnsping 只能測試出描述符里對應的地址和端口是否能連上,但是不能判斷描述符里的Servie_name是否正確或正常.

[D:\app\Administrator\product\11.2.0\dbhome_1]tnsping orcl

TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 18-7月 -
2014 02:22:13

Copyright (c) 1997, 2010, Oracle. All rights reserved.

已使用的參數文件:
D:\app\Administrator\product\11.2.0\dbhome_1\network\admin\sqlnet.ora


已使用 TNSNAMES 適配器來解析別名
嘗試連接 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)
) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl.getpaid)))
OK (30 毫秒)

[D:\app\Administrator\product\11.2.0\dbhome_1]tnsping l2000

TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 18-7月 -
2014 02:22:17

Copyright (c) 1997, 2010, Oracle. All rights reserved.

已使用的參數文件:
D:\app\Administrator\product\11.2.0\dbhome_1\network\admin\sqlnet.ora


已使用 TNSNAMES 適配器來解析別名
嘗試連接 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0
.0)(PORT = 2000))) (CONNECT_DATA = (SERVICE_NAME = L2000.getpaid)))
OK (0 毫秒)

用描述符來時間測試連接數據庫

SQL> conn /@l2000 as sysdba
已連接。
SQL> conn /@orcl as sysdba
已連接。

 在我們的tnsnames.ora文件里有個ALL_LISTENER ,當被用來賦值給local_listener的時候,只有ADDRESS_LIST有效,代表要向那些地址的監聽器注冊.

當被作為描述符用在客服端的連接請求里是,它會按順序請求對應的地址上的監聽器的對應SERVICE_NAME的服務,如果第一個失敗,會參試后面的地址.

ALL_LISTENER =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 2000))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl.getpaid)
)
)


免責聲明!

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



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