您的位置:首页 > 其它

网路配置相关内容总结!

2011-10-18 14:31 232 查看
1、listener

首先对初学者要明确一下listener是在db server上配置,凡是在client端要

连接db都需要通过listener,就像非本单位员工要想进入该单位所在的办公大楼

必须去保安那里登记一下自己的信息(亮名自己的身份同时说出来要找谁、办什么事儿),

之后保安打电话和你要找的人进行确认和求证。

这里不打算介绍lsnrctl中的内容,这个doc上有,而且也比较简单,重点

介绍一下pub上经常人们问到的一些和net相关的或者说可能是困扰初学者

的一些不太容易掌握的问题:

a)静态注册的监听配置时到底在"全局数据库"一项中输入什么?

这里再次明确一下输入什么都可以,举例:

listener文件配置如下:

LISTENER1 =

(DESCRIPTION =

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

)

SID_LIST_LISTENER1 =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = test)

(ORACLE_HOME = E:\oracle\product\10.2.0\db_1)

(SID_NAME = test)

)

(SID_DESC =

(GLOBAL_DBNAME = a) --a是一个和我操作的db无关的信息

(ORACLE_HOME = E:\oracle\product\10.2.0\db_1)

(SID_NAME = test)

)

)

--==========================

status信息如下:

LSNRCTL> status listener1

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xys)(PORT=1521)))

LISTENER 的 STATUS

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

别名 listener1

版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ

ction

启动日期 31-5月 -2009 20:35:44

正常运行时间 0 天 0 小时 1 分 29 秒

跟踪级别 off

安全性 ON: Local OS Authentication

SNMP OFF

监听程序参数文件 e:\oracle\product\10.2.0\db_1\network\admin\listener.o

ra

监听程序日志文件 e:\oracle\product\10.2.0\db_1\network\log\listener1.lo

g

监听端点概要...

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

服务摘要..

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

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

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

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

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

命令执行成功

LSNRCTL>

--========================================

从listener的status我们发现存在[服务 "a"]和[服务 "test"]两项信息,

其中[例程 "test", 状态 UNKNOWN],[例程 "test", 状态 UNKNOWN]就是通过读取

listener.ora文件中我们静态登记的信息来注册listener的:

这里[服务 "a"]和[服务 "test"]中的a和test就是listener.ora中的GLOBAL_DBNAME(再次声明

写什么都可以),

[例程 "test"]中的test是指listener.ora中的sid,这里一定不能写错,写错了,配置listener肯定没有

问题不会出错,但是肯定不能通过其配置的net service连上db,因为其对应的instance根本就不存在。

b)从上面listener的status信息中我们还发现了[服务 "test"]下面还包括了

[例程 "test", 状态 READY]信息,这里的ready表示的是后台进程pmon通过读取参数

service_names在listener上进行了动态注册:

SQL> show parameter service_name

NAME TYPE VALUE

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

service_names string TEST

SQL> alter system set service_names=b,c;

系统已更改。

SQL> alter system set instance_name=instance_test;

alter system set instance_name=instance_test

*

第 1 行出现错误:

ORA-02095: 无法修改指定的初始化参数

SQL> alter system set instance_name=instance_test scope=spfile;

系统已更改。

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

ORACLE 例程已经启动。

Total System Global Area 167772160 bytes

Fixed Size 1247900 bytes

Variable Size 67110244 bytes

Database Buffers 96468992 bytes

Redo Buffers 2945024 bytes

数据库装载完毕。

数据库已经打开。

SQL> show parameter service_name

NAME TYPE VALUE

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

service_names string B, C

SQL>

--==================================

修改了service_names和instance_name之后再来看listener的status信息:

LSNRCTL> status

正在连接到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

LISTENER 的 STATUS

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

别名 listener1

版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ

ction

启动日期 31-5月 -2009 20:35:44

正常运行时间 0 天 0 小时 15 分 25 秒

跟踪级别 off

安全性 ON: Local OS Authentication

SNMP OFF

监听程序参数文件 e:\oracle\product\10.2.0\db_1\network\admin\listener.o

ra

监听程序日志文件 e:\oracle\product\10.2.0\db_1\network\log\listener1.lo

g

监听端点概要...

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

服务摘要..

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

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

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

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

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

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

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

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

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

命令执行成功

LSNRCTL>

--=====================================

我们发现pmon自动提取service_names的值进行了动态注册,同时注意到

动态注册信息中显示的[例程 "INSTANCE_TEST"],这里的INSTANCE_TEST是instance_name,

另外要注意的是不管参数service_names是否有值,pmon始终会把db_name动态注册到listener

上(红色部分)

说到这里listener这部分应该差不多了,接下来看看在client端配置的tns

3、tns

tns是一定要在本地client端配置的:

下面是配好的一个tns,其网络服务名是ABC

ABC =

(DESCRIPTION =

(ADDRESS_LIST =

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

)

(CONNECT_DATA =

(SERVICE_NAME = test)

)

)

这里的ABC就是网络服务名,随便写什么都可以,重要的是=后面的每一项信息

都不能写错,host和port很好理解,不多赘述,重要的是这个SERVICE_NAME到底是

指什么?这里明确说明一下,它就是我们在listener status信息中显示的那些

服务 "X",这里的X=B,C,a,TEST(看上面的listener status信息),这里如果

SERVICE_NAME=B|C,那么通过这个tns连接所对应的session它使用的就是动态注册

的listener连接db的;如果SERVICE_NAME=a,那么通过这个tns连接所对应的session

它使用的就是静态注册的listener连接db的;如果SERVICE_NAME=test的话,

那么通过这个tns连接所对应的

session它使用的到底是通过动态还是静态listener连接db的呢?

接下来我们看一下:

首先使用B,C,a,TEST创建4个tns:

tnsB =

(DESCRIPTION =

(ADDRESS_LIST =

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

)

(CONNECT_DATA =

(SERVICE_NAME = B)

)

)

tnsC =

(DESCRIPTION =

(ADDRESS_LIST =

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

)

(CONNECT_DATA =

(SERVICE_NAME = C)

)

)

tnsa =

(DESCRIPTION =

(ADDRESS_LIST =

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

)

(CONNECT_DATA =

(SERVICE_NAME = a)

)

)

tns_test =

(DESCRIPTION =

(ADDRESS_LIST =

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

)

(CONNECT_DATA =

(SERVICE_NAME = test)

)

)

测试一下这4个tns是否能通:

C:\>tnsping tnsb

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -

2009 21:11:52

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

已使用的参数文件:

e:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

已使用 TNSNAMES 适配器来解析别名

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)

(HOST = xys)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = B)))

OK (30 毫秒)

--=========================================

C:\>tnsping tnsc

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -

2009 21:11:54

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

已使用的参数文件:

e:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

已使用 TNSNAMES 适配器来解析别名

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)

(HOST = xys)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = C)))

OK (10 毫秒)

--=========================================

C:\>tnsping tnsa

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -

2009 21:11:56

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

已使用的参数文件:

e:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

已使用 TNSNAMES 适配器来解析别名

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)

(HOST = xys)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = a)))

OK (10 毫秒)

--=========================================

C:\>tnsping tns_test

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -

2009 21:12:00

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

已使用的参数文件:

e:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

已使用 TNSNAMES 适配器来解析别名

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)

(HOST = xys)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = test)))

OK (30 毫秒)

C:\>

--=========================================

很显然都是通的

4、连接db时使用在client端配置的网络服务名

接下来看看通过上面4个tns分别连接db,看看其对应的

session到底是使用静态还是动态注册的listener信息来连接db的:

SQL> connect test/test@tnsb

已连接。

SQL> select sid,service_name from v$session where sid=(select sid from v$mystat

where rownum=1);

SID SERVICE_NAME

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

153 B

--========================================

SQL> connect test/test@tnsc

已连接。

SQL> select sid,service_name from v$session where sid=(select sid from v$mystat

where rownum=1);

SID SERVICE_NAME

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

153 C

--========================================

SQL> connect test/test@tnsa

已连接。

SQL> select sid,service_name from v$session where sid=(select sid from v$mystat

where rownum=1);

SID SERVICE_NAME

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

153 SYS$USERS

--========================================

SQL> connect test/test@tns_test

已连接。

SQL> select sid,service_name from v$session where sid=(select sid from v$mystat

where rownum=1);

SID SERVICE_NAME

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

153 TEST

--========================================

SQL>

通过上面查询中的SERVICE_NAME我们就能清楚的知道这个session连接db使用的

是静态还是动态注册的listener信息,很显然SERVICE_NAME=SYS$USERS其对应的tnsa使用的

service_name=a是静态注册的信息

可以通过如下视图查看db活动的service_name:

SQL> select name from v$active_services;

NAME

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

C

B

TEST

SYS$BACKGROUND --后台进程对应的session的service_name都看作SYS$BACKGROUND

SYS$USERS --oracle统一把静态注册到listener的globaldb_name信息对应的service_name都看作SYS$USERS

--=====================================

以上db是运行在专用模式下,当然我们配置的tns使用的都是专用模式,下面看看

db运行在共享模式时的情况:

5、首先要保证db运行在mts模式下:

SQL> alter system set dispatchers='(PROTOCOL=TCP)';

系统已更改。

SQL> select count(*) from v$shared_server;

COUNT(*)

----------

0

SQL> select count(*) from v$dispatcher;

COUNT(*)

----------

1

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

ORACLE 例程已经启动。

Total System Global Area 167772160 bytes

Fixed Size 1247900 bytes

Variable Size 67110244 bytes

Database Buffers 96468992 bytes

Redo Buffers 2945024 bytes

数据库装载完毕。

数据库已经打开。

SQL> select count(*) from v$shared_server;

COUNT(*)

----------

1

SQL> select count(*) from v$dispatcher;

COUNT(*)

----------

1

下面是listener的status信息:

LSNRCTL> services

正在连接到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

服务摘要..

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

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

处理程序:

"D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready

DISPATCHER <machine: XYS, pid: 3524>

(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=2758))

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

LOCAL SERVER

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

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

处理程序:

"D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready

DISPATCHER <machine: XYS, pid: 3524>

(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=2758))

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

LOCAL SERVER

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

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

处理程序:

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

LOCAL SERVER

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

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

处理程序:

"D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready

DISPATCHER <machine: XYS, pid: 3524>

(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=2758))

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

LOCAL SERVER

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

处理程序:

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

LOCAL SERVER

命令执行成功

LSNRCTL>

通过上面的service显示出来的信息发现了什么?

如果想在client端配置tns通过shared mode连接db,那么

在配置tns时service_name必须是通过动态注册到listener中的service

_names信息,通过静态注册的listener信息是不能通过共享模式连接db的,

如果通过静态注册的信息连接db:

先配置一个tns:

TNS_MTS =

(DESCRIPTION =

(ADDRESS_LIST =

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

)

(CONNECT_DATA =

(SERVER = SHARED)

(SERVICE_NAME = a)

)

)

验证一下是否能通:

C:\>tnsping tns_mts

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -

2009 21:59:34

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

已使用的参数文件:

e:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

已使用 TNSNAMES 适配器来解析别名

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)

(HOST = xys)(PORT = 1521))) (CONNECT_DATA = (SERVER = SHARED) (SERVICE_NAME = a)

))

OK (30 毫秒)

--===================================

其实这里的通只是一个假相

看看具体的连接情况:

C:\>sqlplus test/test@tns_mts

SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 5月 31 21:59:55 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.

ERROR:

ORA-12523: TNS: 监听程序无法找到适用于客户机连接的例程

请输入用户名:

--=====================================

就这个问题,pub上n多人在不停的问,根本就连接不上,什么原因我想不用解释了吧

6、在配置网络相关内容时可能有些人会关注的一些参数:

SQL> show parameter db_name

NAME TYPE VALUE

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

db_name string TEST

SQL> show parameter instance_name

NAME TYPE VALUE

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

instance_name string INSTANCE_TEST

SQL> show parameter service_names

NAME TYPE VALUE

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

service_names string B, C

SQL> select instance_name sid from v$instance;

SID

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

test


SQL> select * from global_name;

GLOBAL_NAME

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

TEST

SQL>

From:

http://www.itpub.net/thread-1170687-1-1.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: