【学习目标】
Oracle 监听器是一个服务器端程序,用于监听所有来自客户端的请求,并为其提供数
据库服务。因此对监听器的管理与维护相当重要。
本章主要内容是描述对Oracle 监听器的配置与管理。
【本章要点】
- • 配置监听
• 区分独占、共享模式
• 区分动态、静态注册
【关键术语】
- Listener 监听Tnsname 服务名
Dedicated Server 独占服务Shared Server 共享服务
为了方便对Oracle 数据库进行管理,一般以下情况应该对Oracle进行网络配置。
- • 在客户端对服务器端数据库进行管理(网络客户端管理)
• 在一台服务器上管理多个数据库(本地管理)
在客户端上管理,只需要安装客户端管理软件即可。客户端为了连接特定的服务器和数
据库,需要对网络进行配置,通过网络可以连接到不同的Oracle 数据库服务器。
如图1-1所示,首先需要在数据库服务器端配置侦听程序,然后需要在客户端配置网络
服务名。
一、原理解析
这里我们借腾讯软件来打个比方。
二、配置侦听器(LISTENER)
网络配置可以使用网络配置管理器Net Manager 来完成。Net Manager 用于网络连接
服务名、侦听器等的创建和设置。
在同一台服务器上可以配置多个侦听器,但侦听的端口号不能相同。不同的侦听器可以
侦听对同一个数据库的请求,同一个侦听器也可以侦听对不同数据库的请求。这样当一个侦
听器忙时,另外的侦听器仍然可以为客户端请求提供服务,减少用户连接的等待时间。
侦听器的配置信息存入对应的配置文件listener.ora(注:使用Net Manager工具配置侦
听器相当于修改该文件),该文件的默认路径为$ORACLE_HOME/network/admin,其中
$ORACLE_HOME代表服务器软件的安装目录。另外通过设置环境变量TNS_ADMIN可以改
变侦听器配置文件的位置(.bash_profile文件中设置)。
侦听器的设置主要包括侦听位置和对应的数据库服务,侦听位置包括主机、端口和使用
的通讯协议,Oracle 默认的标准端口是1521,通常采用的协议是TCP/IP。1. 启动Net Manager
2 [oracle@oracle ~]$ netmgr2. 通过面板左侧的“+”、“×”按钮,可以增加和删除侦听器。
3. 点击“+”增加一个监听器,并且输入监听名称。
- • 协议:用于指定监听程序要使用的网络协议,监听程序可以使用多种网络协议,但 最常用的是“TCP/IP”协议。
• 主机:用于指定Oracle 服务器所在机器的主机名或IP 地址。因为侦听器和Oracle 服务器位于同一台机器,主机名在这里也可以输入LOCALHOST。//和/etc/hosts保持一致。
• 端口号:用于指定监听程序所要使用的TCP/IP 端口号,默认监听端口号为1521。如果要指定其他端口号,则必须是操作系统未占用的端口。
为了区别于LISTENER与LISTENER1,将LISTENER1 端口号改为1522。注意:如果网络客户端想要通过LISTENER1 连接数据库,其用于连接数据库的网络服
务名配置,也要使用同样的端口号。
- • 全局数据库名:一般设置为DB_NAME.DB_DOMAIN(DB_NAME 和DB_DOMAIN为 初始化参数),这里设为orcl。
• Oracle 主目录:应该设置为Oracle 软件的安装路径。
• SID:设置为数据库的SID,这里设置为orcl。
三、配置客户端网络服务名
通过客户端访问服务器端的数据库,就需要进行网络配置。客户端通过提供必要的参数,
包括要连接的服务器名称、连接的端口号、使用的通讯协议等连接到服务器端。
对于普通用户,这些参数不便于理解和记忆。通过网络配置,可以把网络服务名同配置
联系起来,一旦配置完成,以后就可以使用该网络服务名进行数据库的连接,使连接过程得
到简化。
当安装Oracle 数据库产品时,系统会自动在服务器端为数据库配置相应的网络服务名,
默认网络服务名与实例标识(SID)相同。为了便于访问同一台服务器上的多个Oracle 数据
库,应该为新数据库配置相应的网络服务名。
网络服务名对应的配置文件名称为tnsnames.ora,该文件的默认路径为
$ORACLE_HOME/network/admin。同样,通过设置环境变量TNS_ADMIN可以改变该配置
文件的位置。
配置网络服务名也可以使用工具Net Manager 来完成。1. 填写客户端网络服务名
2. 选择协议
3. 填写主机名
4. 填写数据库的服务名(Service_names)
5. 点击“Finish”完成配置
四、关于注册
1. 什么是注册
注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例 名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。
在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启 动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务。) 相当于是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序 中,会记录相应数据库对应的服务名(一个数据库可能对应有多个服务名),当客户端需要 连接数据库时,只需要提供服务名,就可以建立客户端和服务器之间的连接。2. 两个参数
1) instance_name:
注册到监听器中的实例值从参数文件中的instance_name 参数取得。如果该参数没有设 定值,那么它将取参数文件中的db_name 的值。如果在RAC 中配置,您必须将集群中每个 实例的instance_name 参数设置为一个唯一的值。
2) service_names:
注册到监听器中的服务值从参数文件中的参数service_names 取得。如果该参数没有设 定值,数据库将拼接参数文件中的db_name 和db_domain 的值来注册自己。
1 --//修改参数service_names
2 SQL> alter system set service_names='orcl,aaa';
3 System altered.
4 SQL> show parameter service_names;
5 NAME TYPE VALUE
6 ---------------------------------- ------- ----------------
7 service_names string orcl,aaa
8 --//查看监听状态
9 [oracle@oracle admin]$ lsnrctl stat
10 LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 09-NOV-2013 17:23:10
11 Copyright (c) 1991, 2005, Oracle. All rights reserved.
12 Connecting to
13 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle.example.com)
14 (PORT=1521)))
15 STATUS of the LISTENER 19 Alias LISTENER
20 Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
21 Start Date 09-NOV-2013 16:46:42
22 Uptime 0 days 0 hr. 36 min. 28 sec
23 Trace Level off
24 Security ON: Local OS Authentication
25 SNMP OFF
26 Listener Parameter File
27 /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
28 Listener Log File
29 /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
30 Listening Endpoints Summary...
31 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle.example.com)(PORT
32 =1521)))
33 Services Summary...
34 Service "aaa" has 1 instance(s).
35 Instance "orcl", status READY, has 1 handler(s) for this service...
36 Service "orcl" has 1 instance(s).
37 Instance "orcl", status READY, has 1 handler(s) for this service...
38 Service "orclXDB" has 1 instance(s).
39 Instance "orcl", status READY, has 1 handler(s) for this service...
40 Service "orcl_XPT" has 1 instance(s).
41 Instance "orcl", status READY, has 1 handler(s) for this service...
42 The command completed successfully
43 --//查看listener.ora 内容
44 [oracle@oracle admin]$ more listener.ora
45 # listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
47 # Generated by Oracle configuration tools.
48 LISTENER =
49 (DESCRIPTION =
50 (ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT = 1521))
52 )
53 --//没有写list,动态注册
54
55
56 --//查看tnsnames.ora 内容
57 [oracle@oracle admin]$ more tnsnames.ora
58 ORCL_S =
59 (DESCRIPTION =
60 (ADDRESS_LIST =
61 (ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT = 1521)) )
64 (CONNECT_DATA = (SERVICE_NAME = orcl) )
67 )
68 AAA_S =
69 (DESCRIPTION =
70 (ADDRESS_LIST =
71 (ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT = 1521)) )
74 (CONNECT_DATA =
75 (SERVICE_NAME = aaa)
76 )
77 )
78 --//验证能否通过orcl_s 成功登录
79 [oracle@oracle admin]$ sqlplus sys/oracle@orcl_s as sysdba
80 SQL*Plus: Release 10.2.0.1.0 - Production on Sat Nov 9 17:22:05 2013
81 Copyright (c) 1982, 2005, Oracle. All rights reserved.
82 Connected to:
83 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
84 With the Partitioning, OLAP and Data Mining options
85 --//验证能否通过aaa_s 成功登录
86 [oracle@oracle admin]$ sqlplus sys/oracle@aaa_s as sysdba
87 SQL*Plus: Release 10.2.0.1.0 - Production on Sat Nov 9 17:22:10 2013
88 Copyright (c) 1982, 2005, Oracle. All rights reserved.
89 Connected to:
90 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
91 With the Partitioning, OLAP and Data Mining options
92
93 --//验证oracle 注册service_names 的值
94 SQL> alter system set service_names='bbb';
95 System altered.
96 --//aaa_s 无法正常连接
97 [oracle@oracle admin]$ sqlplus sys/oracle@aaa_s as sysdba
98 SQL*Plus: Release 10.2.0.1.0 - Production on Sat Nov 9 17:35:11 2013
99 Copyright (c) 1982, 2005, Oracle. All rights reserved.
100 ERROR:
101 ORA-12514: TNS:listener does not currently know of service requested in connect
102 descriptor
103 Enter user-name:
104 --//orcl_s 仍然可以正常连接(oracle 会自动注册)
105 [oracle@oracle admin]$ sqlplus sys/oracle@orcl_s as sysdba
106 SQL*Plus: Release 10.2.0.1.0 - Production on Sat Nov 9 17:41:10 2013
107 Copyright (c) 1982, 2005, Oracle. All rights reserved.
108 Connected to:
109 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
110 With the Partitioning, OLAP and Data Mining options
111 --//测试service_names 参数的值
112 SQL> show parameter db_name
113 NAME TYPE VALUE
114 ------------------------------------ ----------- -----------
115 db_name string orcl
116 --//当前db_domain 的值为空
117 SQL> show parameter domain
118 NAME TYPE VALUE
119 ------------------------------------ ----------- ------------
120 db_domain string
121 --//当前servcie_names 的值为非默认值
122 SQL> show parameter service_names
123 NAME TYPE VALUE
124 ------------------------------------ ----------- -----------
125 db_name string bbb
126 --//定义db_domain 的值
127 SQL> alter system set db_domain='oracle.com' scope=spfile;
128 System altered.
129 --//重置service_names 的值
130 SQL> alter system reset service_names scope=spfile sid='*';
131 System altered.
132
133
134 --//重启数据库
135 SQL> shutdown immediate;
136 Database closed.
137 Database dismounted.
138 ORACLE instance shut down.
139 SQL> startup;
140 ORACLE instance started.
141 Total System Global Area 285212672 bytes
142 Fixed Size 1218992 bytes
143 Variable Size 92276304 bytes
144 Database Buffers 188743680 bytes
145 Redo Buffers 2973696 bytes
146 Database mounted.
147 Database opened.
148 SQL> show parameter domain
149 NAME TYPE VALUE
150 ------------------------------------ ----------- ---------------
151 db_domain string oracle.com
152 SQL> show parameter service
153 --//验证service_names 的值为db_name+db_domain
154 NAME TYPE VALUE
155 ------------------------------------ ----------- --------------------
156 service_names string orcl.oracle.com3. 动态注册
动态注册是在instance 启动的时候PMON 进程根据参数文件中的instance_name,
service_names 两个参数将实例和服务动态注册到listener 中。
首先要在参数文件中指定instance_name,service_names 两个参数的值。在sqlplus 下
通过show parameter service_names 和show parameter instance_name 可以查看这两个
参数的值。
可选择的是,您可以在service_names 参数中指定多个服务值,值之间用逗号格开,
这对于共享服务器配置是很有用的。
动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是
TCP),因为pmon 只会动态注册port 等于1521的监听,否则pmon 不能动态注册listener,
如果需要向非默认监听注册,则需要配置local_listener 参数!1) Pmon 进程注册(默认端口):
1 //为方便实验,将db_domain 参数改回来
2 SQL> alter system set db_domain='' scope=spfile;
3 System altered.
4 //重启数据库使参数生效
5 SQL> shutdown immediate;
6 Database closed.
7 Database dismounted.
8 ORACLE instance shut down.
9 SQL> startup;
10 ORACLE instance started.
11 Total System Global Area 285212672 bytes
12 Fixed Size 1218992 bytes
13 Variable Size 92276304 bytes
14 Database Buffers 188743680 bytes
15 Redo Buffers 2973696 bytes
16 Database mounted.
17 Database opened.
18 //验证参数
19 SQL> show parameter service_names
20 NAME TYPE VALUE
21 ------------------------------------ ----------- --------------
22 service_names string orcl
23 //查看listener.ora
24 [oracle@oracle admin]$ more listener.ora
25 # listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/n
26 etwork/admin/listener.ora
27 # Generated by Oracle configuration tools.
28 LISTENER =
29 (DESCRIPTION =
30 (ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT =
31 1521))
32 )
33 //查看监听器状态
34 [oracle@oracle admin]$ lsnrctl stat
35 LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 09-NOV-2013 18:20:37
36 Copyright (c) 1991, 2005, Oracle. All rights reserved.
37 Connecting to
38 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle.example.com)(PORT=15
39 21)))
40
42 STATUS of the LISTENER
43 ------------------------
44 Alias LISTENER
45 Version TNSLSNR for Linux: Version 10.2.0.1.0 -
46 Production
47 Start Date 09-NOV-2013 16:46:42
48 Uptime 0 days 1 hr. 33 min. 54 sec
49 Trace Level off
50 Security ON: Local OS Authentication
51 SNMP OFF
52 Listener Parameter File
53 /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
54 Listener Log File
55 /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
56 Listening Endpoints Summary...
57 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle.example.com)(POR
58 T=1521)))
59 Services Summary...
60 Service "orcl" has 1 instance(s).
61 Instance "orcl", status READY, has 1 handler(s) for this service...
62 Service "orclXDB" has 1 instance(s).
63 Instance "orcl", status READY, has 1 handler(s) for this service...
64 Service "orcl_XPT" has 1 instance(s).
65 Instance "orcl", status READY, has 1 handler(s) for this service...
66 The command completed successfully
67 //查看tnsnames.ora
68 [oracle@oracle admin]$ more tnsnames.ora
69 ORCL_S =
70 (DESCRIPTION =
71 (ADDRESS_LIST =
72 (ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT
73 = 1521))
74 )
75 (CONNECT_DATA =
76 (SERVICE_NAME = orcl)
77 )
78 )
79
81 //尝试连接
82 [oracle@oracle admin]$ sqlplus sys/oracle@orcl_s as sysdba
83 SQL*Plus: Release 10.2.0.1.0 - Production on Sat Nov 9 18:09:52 2013
84 Copyright (c) 1982, 2005, Oracle. All rights reserved.
85 Connected to:
86 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
87 With the Partitioning, OLAP and Data Mining options2) 修改参数注册(非默认端口):
1 //查看listener.ora
2 [oracle@oracle admin]$ more listener.ora
3 # listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/n
4 etwork/admin/listener.ora
5 # Generated by Oracle configuration tools.
6 LISTENER =
7 (DESCRIPTION =
8 (ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT =
9 1521))
10 )
11 LISTENER1 =
12 (DESCRIPTION =
13 (ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT =
14 1522))
15 )
16 //查看tnsnames.ora
17 [oracle@oracle admin]$ more tnsnames.ora
18 # tnsnames.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/n
19 etwork/admin/tnsnames.ora
20 ORCL_S =
21 (DESCRIPTION =
22 (ADDRESS_LIST =
23 (ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT =
24 1521))
25 )
26 (CONNECT_DATA =
27 (SERVICE_NAME = orcl)
28 )
29 )
30
31 ORCL_S1 =
32 (DESCRIPTION =
33 (ADDRESS_LIST =
34 (ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT =
35 1522))
36 )
37 (CONNECT_DATA =
38 (SERVICE_NAME = orcl)
39 )
40 )
41 //修改参数
42 [oracle@oracle admin]$ sqlplus / as sysdba
43 SQL*Plus: Release 10.2.0.1.0 - Production on Sat Nov 9 18:05:21 2013
44 Copyright (c) 1982, 2005, Oracle. All rights reserved.
45 Connected to:
46 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
47 With the Partitioning, OLAP and Data Mining options
48 SQL> show parameter local
49 NAME TYPE VALUE
50 ------------------------------------ ----------- ------------------------------
51 local_listener string
52 SQL> alter system set local_listener='orcl_s1';
53 System altered.
54 SQL> alter system register;
55 System altered.
56 SQL> exit
57 Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -
58 Production
59 With the Partitioning, OLAP and Data Mining options
60 //测试连接
61 [oracle@oracle admin]$ sqlplus sys/oracle@orcl_s1 as sysdba
62 SQL*Plus: Release 10.2.0.1.0 - Production on Sat Nov 9 18:09:52 2013
63 Copyright (c) 1982, 2005, Oracle. All rights reserved.
64 Connected to:
65 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
66 With the Partitioning, OLAP and Data Mining options
67 //或者
68 SQL> alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL =
69 TCP)(HOST = oracle.example.com)(PORT = 1522))';4. 静态注册
静态注册就是实例启动时读取listener.ora 文件中实例和服务的配置,将实例和服务注
册到监听程序。1 --示例:
2 SID_LIST_LISTENER =
3 (SID_LIST =
4 (SID_DESC =
5 (GLOBAL_DBNAME = orcl)
6 (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
7 (SID_NAME = orcl)
8 )
9 (SID_DESC =
10 (GLOBAL_DBNAME = emrep)
11 (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
12 (SID_NAME = emrep)
13 )
14 )
15 --List 列表中的即是需要静态注册的服务
五、查询某服务是静态还是动态注册
可以使用命令lsnrctl status 来查看某服务是静态注册还是动态注册。
- • 实例状态为UNKNOWN 值时表明此服务是静态注册的。这时监听器用来表明它不 知道关于该实例的任何信息,只有当客户发出连接请求时,才检查该实例是否存在。
• 实例状态为READY 或BLOCKED(数据库nomount 时)表明是此服务是动态注 册的。