1. 程式人生 > >監聽器listener.ora中HOST引數配置

監聽器listener.ora中HOST引數配置

Oracle Net是我們使用Oracle過程中不可缺少的元件環節。對於初學者而言,三個配置檔案tnsname.oralistener.orasqlnet.ora是最容易混亂的部分。而且,由於採用ASCII文字格式編輯,非常容易出現配置錯誤。

監聽器控制檔案listener.oraOracle伺服器端管理重要元件檔案。監聽器監聽埠、動靜態註冊等行為,與這個檔案配置內容有千絲萬縷的關係。其中的配置引數,如HOSTPort等,也是非容易混淆的內容。

本篇通過一系列的實驗,來介紹HOST引數的使用配置方法,以及Oracle Net在處理Host時採用的演算法模式。

1Host解析

我們在Listener.oraTnsname.ora中,都可以遇到Host引數。直觀的看,這個引數作用就是指定連線的主機地址。在服務端,監聽器listener.ora中的Host就是指定了監聽器在哪些地址上進行監聽動作。

監聽器執行守候三個關鍵要素:伺候IP地址(一臺主機可能有多個網絡卡、進而有多個IP地址)、連線協議(預設為TCP,但是很多時候處於安全考量會使用其他協議)、埠物件(在哪個埠進行連線等待)。

Host引數而言,我們可以在服務端listener.ora檔案中選擇IP地址和主機伺服器名稱。兩種方法下,Oracle監聽器是採用不同的策略方法的。

2、環境準備

準備一個多

IP網絡卡的主機環境。實驗機器上安裝兩個網絡卡物件,配置不同的IP地址。

[[email protected] network-scripts]# ifconfig

eth0Link encap:EthernetHWaddr 08:00:27:C2:AB:D2

inet addr:192.168.0.100Bcast:192.168.0.255Mask:255.255.255.0

inet6 addr: fe80::a00:27ff:fec2:abd2/64 Scope:Link

UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1

eth1Link encap:EthernetHWaddr 08:00:27:61:80:AF

inet addr:192.168.0.101Bcast:192.168.0.255Mask:255.255.255.0

inet6 addr: fe80::a00:27ff:fe61:80af/64 Scope:Link

兩個IP地址被繫結在一臺主機上,分別為192.168.0.100192.168.0.101。如果使用名稱解析,還要講IP地址和伺服器名稱繫結在DNS或者本地/etc/hosts檔案中。

[[email protected] network-scripts]# cat /etc/hosts

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1SimpleLinux.localdomain SimpleLinux localhost.localdomain localhost

::1localhost6.localdomain6 localhost6

192.168.0.100SimpleLinux SimpleLinux.localdomain

192.168.0.101SimpleLinux SimpleLinux.localdomain

3Host連線繫結主機名

如果HOST引數使用主機名,在進行連線監聽的時候,Oracle會檢索這個主機上所有的網路名稱對映,將監聽動作繫結在所有的IP地址上。落實到我們這個案例,就意味著對兩個IP地址都存在監聽行為。

[email protected] admin]$ ls -l

total 16

-rw-r--r-- 1 oracle oinstall357 Sep9 08:49 listener.ora

drwxr-xr-x 2 oracle oinstall 4096 Sep9 08:39 samples

-rw-r--r-- 1 oracle oinstall205 May 112011 shrept.lst

-rw-r----- 1 oracle oinstall322 Sep9 09:01 tnsnames.ora

[[email protected] admin]$ cat listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/network/admin/listener.ora

# Generated by Oracle configuration tools.

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = SimpleLinux.localdomain)(PORT = 1521))

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)

)

ADR_BASE_LISTENER = /u01/app

注意:當前使用的就是主機名稱。啟動監聽器進行監聽動作。

[[email protected] admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 02-JAN-2014 15:00:17

Listener Parameter File/u01/app/oracle/network/admin/listener.ora

Listener Log File/u01/app/diag/tnslsnr/SimpleLinux/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=SimpleLinux.localdomain)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

從遠端伺服器進行連線測試。

D:\>tnsping ora11g

TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 02-1 -

2014 15:00:51

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

已使用的引數檔案:

D:\app\Administrator\product\11.2.0\client_1\network\admin\sqlnet.ora

已使用 TNSNAMES 介面卡來解析別名

嘗試連線 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ora11g)))

OK (210 毫秒)

D:\>tnsping ora11g_101

TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 02-1 -

2014 15:02:21

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

已使用的引數檔案:

D:\app\Administrator\product\11.2.0\client_1\network\admin\sqlnet.ora

已使用 TNSNAMES 介面卡來解析別名

嘗試連線 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.101)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ora11g)))

OK (10 毫秒)

使用sqlplus連線成功。

SQL> conn scott/[email protected]

已連線。

SQL> conn scott/[email protected]_101

已連線。

說明:當我們使用HOST主機名的時候,Oracle監聽器會對該計算機上所有的IP地址開啟監聽動作。

4Host使用IP地址

下面使用IP地址配置Host的情況,修改listener.ora檔案。

[[email protected] admin]$ cat listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/network/admin/listener.ora

# Generated by Oracle configuration tools.

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)

)

ADR_BASE_LISTENER = /u01/app

啟動監聽器。

[[email protected] admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 02-JAN-2014 15:06:15

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.100)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

The listener supports no services

The command completed successfully

注意,這個過程中出現一些問題。原有的動態註冊動作失效。服務不能註冊到IP192.168.0.100的伺服器上。

此時的解決方法有兩個,一個是轉而使用靜態註冊方法,使用SID_LIST引數進行檔案註冊。另一種是使用local_listener引數直接配置註冊物件。

SQL> alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.100)(PORT=1521))';

System altered.

SQL> show parameter local_list

NAMETYPEVALUE

------------------------------------ ----------- ------------------------------

local_listenerstring(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.100)(PORT=1521))

SQL> alter system register;

System altered.

檢查註冊情況。

[[email protected] trace]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 02-JAN-2014 15:35:44

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.100)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Services Summary...

Service "ora11g" has 1 instance(s).

Instance "ora11g", status READY, has 1 handler(s) for this service...

Service "ora11gXDB" has 1 instance(s).

Instance "ora11g", status READY, has 1 handler(s) for this service...

The command completed successfully

測試連線。

D:\>tnsping ora11g_101

TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 02-1 -2014 15:30:34

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

已使用的引數檔案:

D:\app\Administrator\product\11.2.0\client_1\network\admin\sqlnet.ora

已使用 TNSNAMES 介面卡來解析別名

嘗試連線 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.101)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ora11g)))

TNS-12541: TNS: 無監聽程式

D:\>tnsping ora11g

TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 02-1 -2014 15:30:38

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

已使用的引數檔案:

D:\app\Administrator\product\11.2.0\client_1\network\admin\sqlnet.ora

已使用 TNSNAMES 介面卡來解析別名

嘗試連線 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ora11g)))

OK (60 毫秒)

SQL> conn scott/[email protected]

已連線。

SQL> conn scott/[email protected]_101

ERROR:

ORA-12541: TNS: 無監聽程式

警告您不再連線到 ORACLE

Oracle只能訪問到位於192.168.0.100監聽程式,101IP位置沒有監聽行為。

結論:如果Host配置IP地址,監聽程式只能訪問到所在的單獨IP地址。其他網絡卡位置不能訪問到。

5、結論

通過上面的實驗,我們證明了在listener.ora檔案中使用HOST配置主機名稱和IP地址的差異,這個主要是由Oracle Net行為差異造成的。

最後說說客戶端Host。對單例項而言,我們比較喜歡直接寫IP地址在tnsname.ora裡面。但是對於RAC環境,特別是11gR2RAC,引入SCAN的情況下,一些主機名稱需單獨配置在DNS中。

Oracle Net配置是我們經常遇到問題的環節,需要多多重視。