1、整體概述linux
Oracle RAC 監聽器的配置與單實例稍有不一樣,但原理和實現方法基本上是相同的。在Oracle服務端中 tns進程用於爲指定網絡地址上的一個或多個Oracle 實例提供服務註冊,並響應來自客戶端對該服務提出的鏈接請求。一旦鏈接請求到達,並派生出一個服務器進程創建服務器與用戶端之間的鏈接(專有服務器dedicated server)或轉發服務請求(共享服務器模式shared server)。若是監聽器知道多於一個實例提供所請求的服務,則可能會根據客戶端與服務器端相關配置將請求定位到較低負載的實例爲其提供服務。所以合理正確配置監聽器以及tnsnames是Oracle RAC實現負載均衡以及failover的前提,本文將描述基於 CentOS 6.5 + Oracle 10g RAC 下監聽器的配置。數據庫
1、節點上監聽信息服務器
一、兩個節點及主機配置信息(racdbp,racdbs)
oracle@racdbp:/u01/oracle/db/network/admin> cat /etc/hosts
127.0.0.1 localhost.yeung.com localhost
# Public
192.168.7.51 racdbp.yeung.com racdbp
192.168.7.52 racdbs.yeung.com racdbs
#Private
10.10.7.51 racdbp-priv.yeung.com racdbp-priv
10.10.7.52 racdbs-priv.yeung.com racdbs-priv
#Virtual
192.168.7.61 racdbp-vip.yeung.com racdbp-vip
192.168.7.62 racdbs-vip.yeung.com racdbs-vip
二、節點racdbp上的listener.ora
oracle@racdbp:/u01/oracle/db/network/admin> more listener.ora
# listener.ora.racdbp Network Configuration File: /u01/oracle/db/network/admin/listener.ora.racdbp
# Generated by Oracle configuration tools.
LISTENER_RACDBP =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = racdbp-vip.yeung.com)(PORT = 1521)(IP = FIRST))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.51)(PORT = 1521)(IP = FIRST))
)
)
SID_LIST_LISTENER_RACDBP =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/oracle/db)
(PROGRAM = extproc)
)
)
三、節點racdbp上的tnsnames.ora
oracle@bo2dbp:/u01/oracle/db/network/admin> more tnsnames.ora
#對於鏈接字符串RAC1A,RAC1B,RAC1在此處能夠省略
#這些字符串一般用於客戶端鏈接到數據庫
RAC1B =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.62)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = RAC1)
(INSTANCE_NAME = RAC1B)
)
)
RAC1A =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.61)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = RAC1)
(INSTANCE_NAME = RAC1A)
)
)
RAC1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.61)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.62)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = RAC1)
)
)
#下面是幾個重要的用於設置local_listener 以及remote_listener參數的定義信息
LISTENER_RACDB =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.61)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.62)(PORT = 1521))
)
LISTENER_RACDBP =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.61)(PORT = 1521))
)
LISTENER_RACDBS =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.62)(PORT = 1521))
)
四、節點racdbp上監聽器的信息
#能夠看出只有實例 RAC1A 註冊到監聽器 LISTENER_RACDBP
oracle@racdbp:/u01/oracle/db/network/admin> lsnrctl status LISTENER_RACDBP
LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 25-FER-2016 21:12:04 二月
Copyright (c) 1991, 2006, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=racdbp-vip.yeung.com)(PORT=1521)(IP=FIRST)))
STATUS of the LISTENER
------------------------
..............
Listener Parameter File /u01/oracle/db/network/admin/listener.ora
Listener Log File /u01/oracle/db/network/log/listener_racdbp.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.61)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.51)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
Instance "+ASM1", status BLOCKED, has 1 handler(s) for this service...
Service "+ASM_XPT" has 1 instance(s).
Instance "+ASM1", status BLOCKED, has 1 handler(s) for this service...
Service "RAC1" has 1 instance(s).
Instance "RAC1A", status READY, has 1 handler(s) for this service...
Service "RAC1XDB" has 1 instance(s).
Instance "RAC1A", status READY, has 1 handler(s) for this service...
Service "RAC1_XPT" has 1 instance(s).
Instance "RAC1A", status READY, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
五、節點racdbs上的listener.ora
oracle@racdbs:/u01/oracle/db/network/admin> more listener.ora
# listener.ora.racdbs Network Configuration File: /u01/oracle/db/network/admin/listener.ora.racdbs
# Generated by Oracle configuration tools.
LISTENER_RACDBS =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = racdbs-vip.yeung.com)(PORT = 1521)(IP = FIRST))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.52)(PORT = 1521)(IP = FIRST))
)
)
SID_LIST_LISTENER_RACDBS =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/oracle/db)
(PROGRAM = extproc)
)
)
#因爲節點racdbs上的tnsnames.ora與節點racdbp內容相同,再也不列出
六、節點racdbs上的監聽器狀態
#一樣能夠看到只有一個 instance,即RAC1B註冊到了監聽器 LISTENER_RACDBS
oracle@racdbs:/u01/oracle/db/network/admin> lsnrctl status LISTENER_RACDBS
LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 25-fFER-2012 19:24:37
Copyright (c) 1991, 2006, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=racdbs-vip.yeung.com)(PORT=1521)(IP=FIRST)))
STATUS of the LISTENER
------------------------
.......................
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.62)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.52)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
Instance "+ASM2", status BLOCKED, has 1 handler(s) for this service...
Service "+ASM_XPT" has 1 instance(s).
Instance "+ASM2", status BLOCKED, has 1 handler(s) for this service...
Service "RAC1" has 1 instance(s).
Instance "RAC1B", status READY, has 1 handler(s) for this service...
Service "RAC1XDB" has 1 instance(s).
Instance "RAC1B", status READY, has 1 handler(s) for this service...
Service "RAC1_XPT" has 1 instance(s).
Instance "RAC1B", status READY, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
#經過上面的觀察可知,當前的兩個實例都是在各自所在主機上的監聽器進行了註冊。網絡
2、設置remote_listener參數oracle
一、在節點racdbp上執行下列的命令
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string RAC1A
-->爲節點racdbp設置遠程監聽器
-->這意味着能夠將實例RAC1A上提供的服務能夠註冊到LISTENER_RACDBS定義的監聽器中
SQL> alter system set remote_listener='LISTENER_RACDBS' sid='RAC1A';
System altered.
-->執行 register 實現註冊
SQL> alter system register;
System altered.
#再次查看節點racdbs監聽器狀態,實例RAC1A已經註冊到racdbs節點
Oracle@racdbs:/u01/oracle/db/network/admin> lsnrctl status LISTENER_RACDBS
LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 25-FER-2016 20:11:06
Copyright (c) 1991, 2006, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=racdbs-vip.yeung.com)(PORT=1521)(IP=FIRST)))
STATUS of the LISTENER
------------------------
..............
Listener Parameter File /u01/oracle/db/network/admin/listener.ora
Listener Log File /u01/oracle/db/network/log/listener_racdbs.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.62)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.52)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
Instance "+ASM2", status BLOCKED, has 1 handler(s) for this service...
Service "+ASM_XPT" has 1 instance(s).
Instance "+ASM2", status BLOCKED, has 1 handler(s) for this service...
Service "RAC1" has 2 instance(s).
Instance "RAC1A", status READY, has 1 handler(s) for this service...
Instance "RAC1B", status READY, has 1 handler(s) for this service...
Service "RAC1XDB" has 2 instance(s).
Instance "RAC1A", status READY, has 1 handler(s) for this service...
Instance "RAC1B", status READY, has 1 handler(s) for this service...
Service "RAC1_XPT" has 2 instance(s).
Instance "RAC1A", status READY, has 1 handler(s) for this service...
Instance "RAC1B", status READY, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
二、節點racdbs上設置local_listener,remote_listener
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
RAC1B
SQL> show parameter listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string
remote_listener string
-->按照節點racdbp上的操做方式將節點racdbs上的remote_listener只向節點racdbp
SQL> alter system set remote_listener='LISTENER_RACDBP' sid='RAC1B';
System altered.
SQL> alter system register;
System altered.
-->在racdbp節點上也能夠看到實例RAC1B也註冊到了第一個節點上
oracle@racdbp:/u01/oracle/db/network/admin> lsnrctl status LISTENER_RACDBP
LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 25-FER-2016 21:37:11
Copyright (c) 1991, 2006, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=racdbp-vip.yeung.com)(PORT=1521)(IP=FIRST)))
STATUS of the LISTENER
------------------------
............
Listener Parameter File /u01/oracle/db/network/admin/listener.ora
Listener Log File /u01/oracle/db/network/log/listener_racdbp.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.61)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.51)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
Instance "+ASM1", status BLOCKED, has 1 handler(s) for this service...
Service "+ASM_XPT" has 1 instance(s).
Instance "+ASM1", status BLOCKED, has 1 handler(s) for this service...
Service "RAC1" has 2 instance(s).
Instance "RAC1A", status READY, has 1 handler(s) for this service...
Instance "RAC1B", status READY, has 1 handler(s) for this service...
Service "RAC1XDB" has 2 instance(s).
Instance "RAC1A", status READY, has 1 handler(s) for this service...
Instance "RAC1B", status READY, has 1 handler(s) for this service...
Service "RAC1_XPT" has 2 instance(s).
Instance "RAC1A", status READY, has 1 handler(s) for this service...
Instance "RAC1B", status READY, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
3、總結(缺省1521端口)
一、RAC 監聽的配置當使用缺省的監聽器時則監聽器名字爲 LISTENER_${NODE}
二、如未設置remote_listener,本地實例只在本地的監聽器註冊。而當設置了正確的remote_listener,則本地實例能夠實現遠程註冊
三、缺省狀況下,PMON進程自動將instance_name和service_names等信息註冊到已啓動的缺省偵聽器
四、可使用alter system register 實現快速註冊負載均衡
Important:tcp
Do not set the GLOBAL_DBNAME parameter in the SID_LIST_listener_name section of the listener.ora.
A statically configured global database name disables connect-time failover.ide