注意:本文内容基本无sqlnet.ora的情况。关于sqlnet.ora,详见:监听中sqlnet.ora的作用
一.监听涉及的几个文件示例:
1.本机上的/etc/hosts文件
[oracle@racdg ~]$ cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.1.211 racdg racdg.bys.com
/etc/hosts文件中的格式是:IP----主机名.域名,比如 localhost.localdomain-----主机名--也叫主机名别名
这个文件的作用就是DNS的简化版,做域名与IP的转换的。
比如这个文档里,使用ping来测试,ping 192.168.1.211或 racdg 或racdg.bys.com这三者之一都将被定位到192.168.1.211
2.监听状态
[oracle@racdg ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 15-AUG-2013 14:43:28
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=racdg.bys.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 14-AUG-2013 17:55:32
Uptime 0 days 20 hr. 47 min. 56 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/diag/tnslsnr/racdg/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=
tcp)(HOST=
racdg)(PORT=
1521)))
Services Summary...
Service "racdg" has 2 instance(s).
Instance "racdg", status READY, has 1 handler(s) for this service...
从这里可以看到,监听使用TCP协议正常运行。
在racdg主机的1521端口,服务名叫racdg,racdg这个服务包含一个实例叫racdg。
这一点从监听配置文件中也可以得到验证。
3.监听配置文件:
[oracle@racdg admin]$ cat listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL =
TCP)(HOST =
racdg.bys.com)(PORT =
1521))
)
)
4.tnsnames.ora文件内容:
[oracle@racdg admin]$ cat tnsnames.ora
racdg =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =
racdg)(PORT =
1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME =
racdg)
)
)
这个文件里定义了一个racdg的名,指向的是racdg主机的TCP协议的1521端口,在最下面语句还定义了服务名叫racdg。
这里还可以再写入一个字段,来指定instance名,比如用在RAC环境时。----这里我未使用。
关于(SERVER = DEDICATED): 这里是以DEDICATED
专用模式连接 racdg实例。
----不写此字段也可以正常连接到数据库
写上 (SERVER = SHARED) 则是使用共享服务器模式,但是这时服务器的shared_server_process需要打开,要不然会出错连不上oracle。
要是这段放空没写,那么系统会根据服务器模式自动调节,不过根据实测结果,就算服务器是定义成共享服务器模式,shared_server_process没打开的情况下,在v$session中查到的连接依然是SERVER = DEDICATED。
在数据库启动的时候,如果没有指定shared_servers,但是设置了dispatchers,那么ORACLE就认为启动了shared server ,并且设置shared_servers为1.
在数据库启动的时候,没有设置shared_servers,没有设置dispatchers,即使以后修改了dispatchers,也不能启动shared server,必须从新启动数据库。
另外,Background process ,以及通过本地连接进来的,只能是DEDICATED .比如说sqlplus user/pass形式。
如果数据库没有配置共享服务器,那么客户端只能以DEDICATED方式连接数据库.--
----建议写上此字段
二、 监听器和使用服务名登陆的过程解析
下面的描述根据我的环境来讲的。
sqlplus sys/oraclesys@racdg as sysdba语句解析
所以要想通过sqlplus sys/oraclesys@racdg as sysdba这种使用@racdg 这个服务名来连接上数据库,这条语句需要做这些动作:
1.首先在本机的$ORACLE_HOME/network/admin/tnsnames.ora文件中找到racdg = 开头的这个字符段。
2.根据/tnsnames.ora文件中找到racdg = 开关的这个字符段中描述,连接到racdg主机的TCP协议1521端口。
这里如果tnsnames.ora文件中ADDRESS字段的HOST = 指定的是主机名,就需要用到
/etc/hosts中的IP与主机的对应关系来将主机名转换为IP。
因为主机间通过是通过IP。
3.从监听的lsnrctl status状态中可以查询到监听已经运行在在racdg主机的1521端口,服务名叫racdg,racdg这个服务包含一个实例叫racdg。
所以第2步时,根据tnsnames.ora文件中字符串的描述就可以连接到监听器的racdg服务的racdg实例。
4.连接到实例后SYS用户的话就用到了密码文件验证。如果是普通用户使用数据库认证-要求数据库打开状态。
监听器中各参数
1.监听器的配置文件位置$ORACLE_HOME/network/admin/listener.ora
这个文件可以使用NETCA来创建,也可以手动写入。文件内的格式之类这里不讨论。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL =
TCP)(HOST =
racdg.bys.com)(PORT =
1521))
)
)
这里面监听器名称叫LISTENER(增加删除监听器时会用到,使用NETCA时能看到)
ADDRESS字段指定了主机地址
racdg.bys.com,协议TCP,端口1521
2.监听器启动时,会启动在ADDRESS字段指定的主机的相应协议的相关端口。
这时
HOST = 可以写上IP或主机名。如IP,则直接启动在相应IP的对应端口
如果是主机名,从lsnrctl status中可以看到未显式的转换为IP。
但是事实上是转换的,这个转换就用到了/etc/hosts中的IP与主机的对应关系。
三、下面是测试监听是否可用的一般排查步骤:
1.测试主机名是否能正常转换为IP--使用PING
[oracle@racdg ~]$ ping 192.168.1.211
PING 192.168.1.211 (192.168.1.211) 56(84) bytes of data.
64 bytes from 192.168.1.211: icmp_seq=1 ttl=64 time=0.186 ms
^C
--- 192.168.1.211 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.186/0.186/0.186/0.000 ms
[oracle@racdg ~]$ ping racdg
PING racdg (192.168.1.211) 56(84) bytes of data.
64 bytes from racdg (192.168.1.211): icmp_seq=1 ttl=64 time=0.107 ms
64 bytes from racdg (192.168.1.211): icmp_seq=2 ttl=64 time=0.139 ms
^C
--- racdg ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.107/0.123/0.139/0.016 ms
[oracle@racdg ~]$ ping racdg.bys.com
PING racdg (192.168.1.211) 56(84) bytes of data.
64 bytes from racdg (192.168.1.211): icmp_seq=1 ttl=64 time=0.192 ms
^C
--- racdg ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 0.192/0.192/0.192/0.000 ms
2.在主机上做tnsping 这里tnsping后跟的是这个名称:tnsnames.ora文件中找到racdg = 开头即是:racdg
[oracle@racdg ~]$ t
nsping racdg
TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 15-AUG-2013 15:49:20
Copyright (c) 1997, 2009, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = racdg)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = racdg)))
OK (10 msec)
3.在上机配置完成后使用服务名做登陆测试
[oracle@racdg ~]$
sqlplus sys/oraclesys@racdg as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Thu Aug 15 14:50:50 2013
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SYS@racdg>