oracle service_name参数,彻底理解初始化参数SERVICE_NAMES和客户端TNS中的SERVICE_NAME

本文详细探讨了Oracle 9i中初始化参数SERVICE_NAMES的作用,解释了如何自动注册服务到监听器,并通过实验展示了客户端TNS配置中SERVICE_NAME的使用。文中指出,后台进程PMON会自动将SERVICE_NAMES参数定义的服务名注册到监听器,客户端可以通过设置TNS中的SERVICE_NAME连接到服务器,即使多个TNS配置,只要匹配到SERVICE_NAMES中的任一服务名,都能成功连接。

彻底理解初始化参数SERVICE_NAMES和客户端TNS中SERVICE_NAME

Author:husthxd

msn:husthxd@hotmail.com

1.        SERVICE_NAMES与LISTENER

初始化参数SERVICE_NAMES默认为db_name.db_dimain,后台进程PMON自动在服务器监听器中注册该SERVICE_NAMES。实验如下:

sidb@GDSI-HYQL> show parameter service_

NAME                                 TYPE        VALUE

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

service_names                        string      simis

sidb@GDSI-HYQL> show parameter instance_name

NAME                                 TYPE        VALUE

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

instance_name                        string      simis

首先监听器配置文件手工配置了数据库服务,listener.ora的配置信息为:

# LISTENER.ORA Network Configuration File: D:\oracle\ora90\network\admin\listener.ora

# Generated by Oracle configuration tools.

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

)

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = sb-hyk)(PORT = 1521))

)

)

)

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(SID_NAME = PLSExtProc)

(ORACLE_HOME = D:\oracle\ora90)

(PROGRAM = extproc)

)

(SID_DESC =

(GLOBAL_DBNAME = simis)

(ORACLE_HOME = D:\oracle\ora90)

(SID_NAME = simis)

)

)

lsnrctl service显示的信息如下:

LSNRCTL for 32-bit Windows: Version 9.0.1.1.1 - Production on 14-10月-2004 10:32

:18

Copyright (c) 1991, 2001, Oracle Corporation.  All rights reserved.

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))

服务摘要..

服务 "PLSExtProc" 包含 1 个例程。

例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

处理程序:

"DEDICATED" 已建立:0 已被拒绝:0

LOCAL SERVER

服务 "simis" 包含 2 个例程。

例程 "simis", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

处理程序:

"DEDICATED" 已建立:0 已被拒绝:0

LOCAL SERVER

例程 "simis", 状态 READY, 包含此服务的 1 个处理程序...

处理程序:

"DEDICATED" 已建立:4 已拒绝:0 状态:ready

LOCAL SERVER

命令执行成功

通过如下实验可以证明服务状态为READY表示PMON自动注册的服务名,而UNKNOWN则表示该服务是手工在LISTENER.ORA中配置的数据库服务。

把listener.ora配置文件中的数据库服务信息去掉,更改为:

# LISTENER.ORA Network Configuration File: D:\oracle\ora90\network\admin\listener.ora

# Generated by Oracle configuration tools.

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

)

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = sb-hyk)(PORT = 1521))

)

)

)

下面再看看lsnrctl service的显示信息:

LSNRCTL> reload

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))

命令执行成功

LSNRCTL> service

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))

服务摘要..

服务 "simis" 包含 1 个例程。

例程 "simis", 状态 READY, 包含此服务的 1 个处理程序...

处理程序:

"DEDICATED" 已建立:0 已拒绝:0 状态:ready

LOCAL SERVER

命令执行成功

这里显示的simis就是初始化参数中SERVICE_NAMES设置的参数值,由PMON自动注册到监听器上。下面不妨修改初始化参数SERVICE_NAMES来证明这一观点:

alter system set service_names='simis,hyk,hyb' scope=memory

/

在当前实例上修改sevice_names对监听器不起作用:

LSNRCTL> reload

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))

命令执行成功

LSNRCTL> service

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))

监听器不支持服务

命令执行成功

修改参数,关闭数据库

SQL> alter system set service_names='simis,hyk,hyb' scope=both

2  /

系统已更改。

-- 平台是windows,901,这里不得不提一下的是901真的非常垃圾,还会出现如下的bug

SQL> shutdown immediate;

ORA-03113: 通信通道的文件结束

SQL>

SQL>

SQL> conn / as sysdba

已连接到空闲例程。

SQL> startup

ORACLE 例程已经启动。

Total System Global Area  114061244 bytes

Fixed Size                   282556 bytes

Variable Size              79691776 bytes

Database Buffers           33554432 bytes

Redo Buffers                 532480 bytes

数据库装载完毕。

数据库已经打开。

SQL>

SQL> show parameter service_

NAME                                 TYPE        VALUE

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

service_names                        string      simis,hyk,hyb

下面看看lsnrctl service的输出:

LSNRCTL> service

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))

服务摘要..

服务 "hyb" 包含 1 个例程。

例程 "simis", 状态 READY, 包含此服务的 1 个处理程序...

处理程序:

"DEDICATED" 已建立:0 已拒绝:0 状态:ready

LOCAL SERVER

服务 "hyk" 包含 1 个例程。

例程 "simis", 状态 READY, 包含此服务的 1 个处理程序...

处理程序:

"DEDICATED" 已建立:0 已拒绝:0 状态:ready

LOCAL SERVER

服务 "simis" 包含 1 个例程。

例程 "simis", 状态 READY, 包含此服务的 1 个处理程序...

处理程序:

"DEDICATED" 已建立:0 已拒绝:0 状态:ready

LOCAL SERVER

命令执行成功

我们看到SERVICE_NAMES设置的服务参数simis、hyk、hyb均在监听器中自动注册。

2.        SERVICE_NAMES与客户端的TNS配置

在客户端配置tnsnames.ora:

test1 =

(DESCRIPTION =

(ADDRESS_LIST =

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

)

(CONNECT_DATA =

(SERVICE_NAME = SIMIS)

)

)

test2 =

(DESCRIPTION =

(ADDRESS_LIST =

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

)

(CONNECT_DATA =

(SERVICE_NAME = hyk)

)

)

test3 =

(DESCRIPTION =

(ADDRESS_LIST =

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

)

(CONNECT_DATA =

(SERVICE_NAME = hyb)

)

)

下面分布尝试用这三个tns来连接:

SQL> conn system/manager@test1

已连接。

SQL> /

INSTANCE_NAME    HOST_NAME

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

simis            SB-HYK

SQL> conn system/manager@test2

已连接。

SQL> /

INSTANCE_NAME    HOST_NAME

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

simis            SB-HYK

SQL> conn system/manager@test3

已连接。

SQL> /

INSTANCE_NAME    HOST_NAME

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

simis            SB-HYK

SQL>

我们看到配置的SERVICE_NAME不管是simis、hyk、hyb均可以成功连接到服务器上。

下面看看如果SERVICE_NAMES中如果不包含INSTANCE_NAME的时候能不能通过INSTANCE_NAME进行连接,事实证明连接不成功:

SQL> alter system set service_names='hyb,hyk' scope=both;

系统已更改。

SQL> shutdown abort;

ORACLE 例程已经关闭。

SQL> startup

ORA-03113: 通信通道的文件结束

SQL> conn / as sysdba

已连接到空闲例程。

SQL> startup

ORACLE 例程已经启动。

Total System Global Area  114061244 bytes

Fixed Size                   282556 bytes

Variable Size              79691776 bytes

Database Buffers           33554432 bytes

Redo Buffers                 532480 bytes

数据库装载完毕。

数据库已经打开。

SQL>

SQL> conn system/manager@test1

ERROR:

ORA-12514: TNS: 监听进程不能解析在连接描述符中给出的 SERVICE_NAME

3.        结论

从oracle9i开始,后台进程PMON自动在监听器中注册初始化参数SERVICE_NAMES中定义的服务名,SERVICE_NAMES默认为db_name.db_dimain。客户端tns配置中SERVICE_NAME的名称必须是SERVICE_NAMES或其中的一个NAME。

感谢biti的指正.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值