【网络配置】小结

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
         (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
         (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
         (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

来自:http://www.itpub.net/thread-1170687-1-1.html

时间: 2024-08-04 01:47:16

【网络配置】小结的相关文章

linux下网络配置总结

对于linux高手看似简单的网络配置问题,也许要说出所以然来也并不轻松,因此仍然有太多的初学者徘徊在门外就不奇怪了, 这里,老男孩老师花了一些时间总结了这个文档小结,也还不够完善,欢迎大家补充,交流.谢谢大家!20120827补充: http://oldboy.blog.51cto.com/2561410/974194 深入浅出route命令小结 目录: 1)配置修改主机名hostname 2)网卡配置文件说明: 3)配置修改ip地址 4)配置修改网关gateway 5) 配置修改DNS 6)查

Ubuntu 10.1 server 网络配置

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/466326 背景: 今天(2010.12.28)刚给机器安装了ubuntu 10.1 server .因为网络配置是需要在安装过程中配置,安装完成后就不再容易配置.而有时候管理员难免要修改IP地址,域名服务器( DNS ),网关(GATEWAY)等!而事实是server一般没有安装Xserver,故进入不了GUI,也

linux一些基本命令以及初级网络配置方法

  基本命令 uname -a -s hostname显示主机名 若是要永久生效,则编辑以下文件 #vim /etc/sysconfig/network ssh远程登录 #ssh 10.1.1.54 (是以root用户登录的) #ssh tom@10.1.1.54(是以tom身份登录) #ssh -Y 10.1.1.54(可以启动图形界面的远程登陆) scp远程拷贝 #scp 10.1.1.54:/etc/passwd /tmp/test(将目的地址10.1.1.54上的/etc/passwd文

利用备份文件快速切换网络配置

移动办公是现代社会的趋势,利用笔记本电脑的网卡接口连入局域网,马上就可以进入工作状态.但是每个局域网的设置是不相同的,例如IP地址.网关等等,那么每到一个新的局域网中,你就需要重新进行设置,这样还是显得有些麻烦. 其实我们可以将不同环境下的网络设置备份下来,当你需要在某个网络环境中使用时,调入相应的备份文件即可完成网络的相关设置,这样就免去了手工设置的烦恼 ,非常方便快捷. 首先当然是进行网络配置的备份.例如你在家中和单位里所使用的网络配置是不同的,需要分别对其进行备份.先将电脑的网络设置为家中

Solaris 10的基础网络配置

Solaris 基础网络配置命令记录如下: 1. 配置ssh允许root登录 vi /etc/sshd/sshd_config PermitRootLogin yes 重启ssh服务 svcadm restart ssh 2. 网络配置 1) 配置IP地址及主机名 # vi /etc/hosts # ::1     localhost           127.0.0.1       localhost           192.168.50.200  vmtest  loghost 2)配

linux系统的基本网络配置

一.Linux 基本网络配置 1. 使用ifconfig命令查看网络接口信息 eth:第一块网卡的名称 lo:loopback的缩写,"回环"网路接口 查看网卡基本配置信息: 1.) HWaddr: 网路接口的物理MAC地址 2.) Inet addr: IP地址 3.) Bcast: 广播地址 4.) Mask: 网路接口的掩码 使用ifconfig 查看网络接口信息 使用ifconfig eth0查看指定网络接口信息 使用ifconfig –a 查看所有网络接口信息 2. 使用Pi

Linux网络配置的基础配置

1 linux网络配置介绍 网络是属于内核的功能,给linux的 主机网卡配置地址的时候,地址是属于内核的,而不是网卡 1.1 DNS 解析其他主机的主机名.一般需要两个,另一个备用(备用DNS的使用不是当第一个服务器解析不成功时使用备用,而是当第一个服务器连不上时时才使用,所以一般都是把响应快的放在第一位 1.2 网络接口类型 Loopback本地回环接口,本地回环接口存在的意义:即本机既做服务器端又做客户端时,自己跟自己联系时所用到的,这个数据报文在自身的内存中就能够完成,不用发布到网络 以

linux的ifconfig、ip和route网络配置命令

一.作为一个linux的疯狂热爱者,我们首先需要掌握的就是在linux系统下怎么配置IP.路由和主机名基本的linux网络配置,当然如果要我们接入互联网基本的IP地址配置还是不够的,访问网络的话我们需要配置我们的域名解析服务器DNS,下面作为菜鸟的我就把我们平常用到的基本网络配置命令来和大家介绍一下,写的不好的话,还请见谅~~~~~ 本篇主要介绍linux下网络查看.配置的基本命令:ifconfig.ip.route,然后捎带介绍下DNS.主机名等信息的配置! 二.我们在配置网络之前,首先我们来

Ubuntu通过修改配置文件进行网络配置的方法

  Ubuntu系统进行网络配置有的时候用图形界面不起作用,这种情况下可以直接修改某些启动脚本或配置文件 Ubuntu系统进行网络配置涉及到几个配置文件1./etc/network/interfaces 2./etc/resolv.conf 操纵步骤: 1. 打开ubuntu的/etc/network/interfaces文件默认的内容如下: 代码如下: auto lo iface lo inet loopback 动态获取的配置方法: 代码如下: auto eth0 iface eth0 in

解决Win7/Win8网络配置引起的无法上网问题

相信大家在使用Win7或者Win8操作系统的电脑上网的时候有时候会遇到上不去网,在电脑右下角的网络小图标有个小叹号,出现这样的情况,大家通常回去看自家的路由器是否出现问题,看看上面的灯是否正常亮着,最后重启路由器,可结果还是上不去网,这时有的人会想是不是自己的电脑出现了什么问题呢? 对于这样的问题,其实不是这样,电脑有时会很顽皮,你只要设置一下电脑的网络配置,然后就可以轻松的上网了.下面给大家介绍一下,如何快速处理这方面的问题,让你也成为一名电脑工程师. 1. 右键点击桌面的右下角网络小图标.