本文摘自《ORACLE数据库技术实用详解》和《成功之路:ORACLE 11g学习笔记》

配置网络环境

本文将介绍和Oracle相关的网络问题,Oracle网络建立在操作系统之上。配置操作系统网络是配置Oracle网络的第一步。在配置Oracle网络之前,我们需要确保操作系统的网络配置无误。

在Oracle数据库中,网络环境属于基础架构的配置,如果没有建立网络环境,则整个数据库无法被用户在客户端所使用。

Oracle的网络涉及两个方面,一个方面是Oracle的数据库服务器端;另外一个方面是Oracle的客户端。Oracle网络配置的路线图如下所示。

我们必须按照上面的步骤配置Oracle网络,只有在服务器端(监听器)配置成功的前提下,我们才可配置客户端。

为了更好地配置Oracle网络,Oracle公司提供了下面的工具,用于配置和诊断Oracle网络。[

  • 网络配置助手(OracleNet Configuration Assistant)是一款图形化的网络管理工具,利用它可以完成Oracle网络的配置,包括监听器的配置、命名方法的配置、网络服务名等的配置。
  • 网络管理器(Oracle Net Manager)也是一个图形化的网络管理工具,用于配置Oracle网络。
  • 监听器控件(Listener Control Utility)是一个命令行工具,用来管理监听器,包括监听器的启动、关闭,以及查看监听器的状态等。
  • 连接管理器控件(Oracle Connection Manager Control Utility)用来管理连接管理器。

1 用户与Oracle数据库服务器建立连接

任何一个用户要想使用Oracle数据库,首先要与数据库建立连接。为此,Oracle使用了 网络服务(Net Service) 的概念,从而能够从客户端或者中间层的应用服务器与数据库服务器建立连接,并且能够在客户端与数据库服务器端之间传递数据。

在客户端,网络服务作为后台运行的进程。在数据库服务器端,网络服务则通过名为监听器的进程来体现。 我们还可以通过配置网络服务,使得Oracle数据库能够与异构的数据库(比如IBM公司的DB2或微软公司的SQL Server等)进行通信。

在Oracle中,最常见的连接方式为专用连接方式。在这种方式下,服务器进程与用户进程为一一对应的关系。一旦用户进程中断,其对应的服务器进程也被终止。

我们先来看看什么是监听器

在Oracle数据库服务器中,通过一个叫“监听器”的组件接收来自客户端的连接请求。它是客户端和服务器端的中间组件。监听器(LISTENER)是位于服务器端的、独立运行的一个后台进程,它运行在服务器端,但是独立于数据库服务器单独运行,也就是说,当数据库没有启动的时候,监听器也能独立运行。它负责对客户端传入的连接请求进行监听,并且对服务器端的连接负荷进行调整。当客户端试图建立一个到服务器端的连接时,监听器接收到客户端的请求,然后再将它交给服务器进行处理,一旦客户端和服务器建立连接,客户端和服务器以后就直接进行通信,而不再需要监听器的参与(也就是监听器将处于空闲状态)。

下图显示了从客户端建立到数据库服务器端连接的过程,以及监听器在整个过程中所起到的作用。在这个过程中,我们使用了最常见的本地命名方法。

从图中,我们可以看到,建立连接的过程大致可以分为以下5个阶段。
1)客户端发起连接:通过在客户端提供连接用户名、用户密码、以及连接字符串等信息,从而建立与监听器的连接。连接字符串位于客户端的文件里,该文件默认为 $ORACLE_HOME/network/admin/tnsnames.ora。 连接字符串里就记录了监听器在哪台服务器上、采用哪种协议、在哪个端口进行监听、请求的是数据库服务名是什么等信息。

2)客户端一旦与监听器建立了连接,则在客户端生成用户进程。同时,监听器会判断,客户端所请求的数据库服务名是否为当前该监听器所管理的服务名。如果客户端传来的连接字符串里不包含服务名,则监听器产生没有服务名的错误信息;如果请求的服务名不是当前监听器所管理的,则报错并中断连接;如果请求的服务名是当前监听器所管理的,则监听器会在该服务名所在的数据库服务器上创建服务器进程

3)监听器在创建服务器进程以后,会将用户进程与服务器进程建立连接。之后,监听器退出与客户端的连接。

4)服务器进程根据用户进程提供的用户名和密码到数据字典里判断是否匹配

5)如果用户名密码不匹配,则报错;如果匹配,则分配PGA,并生成session

注意:监听器的职能只是负责建立客户端和服务器端的连接,它并不负责客户端和服务器端的直接通信。

例如,我们在客户端使用SQL*Plus登录数据库服务器以后,发出一条命令,这条命令被直接发送给数据库服务器(不通过监听器),数据库服务器处理完这条命令以后,直接把命令的执行结果返回给客户端(也不通过监听器)。

2 配置监听器

配置监听器有两种方法:
1)通过图形界面工具Net Manager
2)直接使用文本编辑器编辑监听器配置文件listener.ora
其实,Net Manager最终改变的也是监听器配置文件listener.ora的内容。以上两种方法有着异曲同工之处。

监听器启动时,需要参照监听器配置文件:$ORACLE_HOME/network/admin/listener.ora,这个文件即为“监听器配置文件”。该文件是个文本文件,可以手工编辑,也可以使用图形界面进行配置。
可通过如下命令启动一个叫做网络配置助手的图形界面工具:

 $ netca

一个典型的listener.ora文件的内容如下图所示,其中包含了对各字段的说明:

  • LISTENER:监听器的名字,也可以使用别的名字。
  • ORACLE_HOME:Oracle的主目录。
  • SID_NAME:监听器监听的数据库的实例名。本例中的实例是extproc。
  • PROTOCOL:监听器监听的协议。本例中使用的是TCP/IP。
  • HOST指定数据库服务器的主机名或者IP地址。本例中数据库服务器的主机名是book.us.oracle.com。
  • PORT指定监听器使用的端口号,默认的端口号是1521。

在了解了listener.ora文件以后,我们就可以手工添加新的监听器。也就是说,同一台服务器上,可以存在多个监听器。只不过要注意的是,每个监听器必须在不同的端口上进行监听。而且这些监听器都是通过同一个listener.ora文件进行配置的。

下面,我们添加一个名为my_listener的监听器:

my_listener =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = book.us.Oracle.com)(PORT = 1525))))

只要我们把这段内容添加到listener.ora文件里即可创建一个新的、名为my_listener的监听器。

前面我们讲到过,监听器在接收到客户端发来的连接请求时,会判断客户端所请求的服务名是否为该监听器所管理的服务名。那么在listener.ora文件里,我们并没有看到有关服务名的任何配置,这又是为什么呢?

在这里,我们先来了解服务名是什么。可以把服务理解为一组相似任务的逻辑组合。比如,对于一个典型的销售企业的业务系统来说,可以大致分为销售、采购、财务和人事这四大业务部门。那么从数据库的角度来说,就可以划分成对应的四个服务名:sales(销售)、pur(采购)、fin(财务)和hr(人事)。处理销售相关业务的人员全都连接到sales服务上进行操作,而处理采购业务的人员则全都连接到pur服务上进行操作,依此类推。通过这种方式,我们就对数据库的活动分了组,从而可以更好地进行跟踪和调优的工作。

那么服务是如何体现在监听器里的呢?Oracle通过将服务注册到监听器里来实现,有以下两种注册服务的方式。

2.1 动态注册

所谓动态注册,就是通过数据库实例里的PMON进程,将当前实例里的服务名注册到同一台服务器上的、默认的、并在1521端口上监听的监听器(也就是名为LISTENER的监听器)里。

而当前实例里的服务名由初始化参数:service_names决定。该参数默认为数据库名:

SQL> show parameter service_namesNAME TYPE VALUE-----------------------------------------------service_namesstring ora10g

该参数可以动态修改,并且可以指定多个值,也就是多个服务名,每个服务名之间用逗号隔开,如下所示:

SQL> alter system set service_names='ora10g,sales,pur,fin,hr';

这样,我们只需要等一段时间,PMON进程就会将这些服务名都注册到默认的监听器里去。

我们也可以不等待PMON进程自动注册服务名,而是执行下面的命令,从而立即将这些服务名进行注册:

SQL> alter system register;

如果需要将服务名动态注册到非默认的监听器上,比如我们希望注册到刚才新建立的名为my_listener的监听器上,是否可行呢?

答案是肯定的,只是配置上面要稍微复杂一些。我们还需要设置数据库实例的另一个初始化参数:local_listener。该参数说明了要动态注册的监听器的信息,如下所示:

SQL> alter system set local_listener='(ADDRESS_LIST =(ADDRESS = (PROTOCOL=TCP)(HOST=book.us.Oracle.com)(PORT=1525)))';

注意这里的local_listener参数值的写法,实际上就是把my_listener配置信息中description部分原封不动地复制过来即可。

2.2 静态注册

静态注册是相对于动态注册而言的。也就是说,将有关数据库服务名的信息手工写入了listener.ora文件里。其静态注册的服务名由SID_LIST_部分指定,比如我们为默认监听器静态注册一个服务名,如下图1所示。

我们在sid_list_listener部分添加一段sid_desc部分(上图中的阴影部分),即可为默认监听器静态注册一个新的服务名。其中,global_dbname表示对外公布的服务名,也就是用户连接数据库时所使用的名称。该服务名可以为任何名称;ORACLE_HOME表示Oracle软件的主目录;而SID_NAME则说明服务名所对应的数据库的实例名。也就是说,当用户连接到名为static_srv的服务名时,实际上是连入了名为ora10g的数据库实例里。我们可以添加多个sid_desc部分,从而为数据库定义多个服务名。

3 管理监听器

创建并配置了listener.ora文件以后,我们就可以对监听器进行管理。Oracle提供了命令行的工具lsnrctl对监听器进行管理。

3.1 监听器的启动

监听器的启动有两种方式。

1)在命令行直接启动监听器

登录操作系统(OS)

# su – oracle

启动监听器

$ lsnrctl start

如果执行lsnrctl start命令(没有指定监听器的名称),则该命令将启动默认的监听器。默认监听器的名字是LISTENER。

从启动过程我们还可以看出有关监听器的配置信息,这些信息包括监听器所在的主机(HOST)、监听器监听的端口(Port)、支持的协议等信息。

2)打开监听器管理控件后再启动监听器

登录操作系统(OS)

# su – oracle

登录监听器控件

[oracle@book ~]$ lsnrctlLSNRCTL>

进入lsnrctl交互界面以后,我们可以输入help命令显示所有lsnrctl工具所支持的命令:

LSNRCTL> helpThe following operations are availableAn asterisk () denotes a modifier or extended command:start stopstatusservicesversion reloadsave_config trace spawnchange_password quitexitset* show*

启动监听器控件

LSNRCTL> start

该命令表示启动默认的监听器,也就是启动名为LISTENER的监听器。我们也可以在后面跟上具体的监听器的名称,从而启动非默认的监听器。如下所示:

LSNRCTL> start my_listener

3.2 监听器的关闭

关闭监听器也有两种方式。

1)在命令行直接关闭监听器

登录操作系统(OS)

# su – oracle

关闭监听器

$ lsnrctl stop

如果执行lsnrctl stop命令(没有指定监听器的名称),则该命令将启动默认的监听器。默认监听器的名字是LISTENER。

2)登录监听器管理控件后再关闭监听器

登录操作系统(OS)

# su – oracle

登录监听器控件

[oracle@book ~]$ lsnrctlLSNRCTL>

关闭监听器

LSNRCTL> stop

该命令表示停止默认的监听器,也就是停止名为LISTENER的监听器。我们也可以在后面跟上具体的监听器的名称,从而停止非默认的监听器。如下所示:

LSNRCTL> stop my_listener

3.3 查看监听器的状态

查看监听器状态也有两种方式。

1)在命令行直接查看监听器状态

登录操作系统(OS)

# su – oracle

查看监听器状态

$ lsnrctl status

如果执行lsnrctl status命令(没有指定监听器的名称),则该命令将启动默认的监听器。默认监听器的名字是LISTENER。

2)登录监听器管理控件后再查看监听器状态

登录操作系统(OS)

# su – oracle

登录监听器控件

[oracle@book ~]$ lsnrctlLSNRCTL>

查看默认监听器当前的启动状态:

LSNRCTL> status……Service "fin" has 1 instance(s).Instance "ora10g", status READY, has 1 handler(s) for this service...Service "hr" has 1 instance(s).Instance "ora10g", status READY, has 1 handler(s) for this service...……Service "static_srv" has 1 instance(s).Instance "ora10g", status UNKNOWN, has 1 handler(s) for this service...

命令Status将会列出下面有关监听器的信息:

  • 监听器的名称,监听器的版本号、监听器的启动时间、运行时间、跟踪级别、监听器配置文件listener.ora的位置等。
  • 监听器的地址信息,包括主机名、端口号等。
  • 监听器的实例的状态信息,实例有下面几种状态:
    1)READY表示实例可以接受连接
    2)BLOCKED表示实例不能接受连接
    3)READY/SECONDARY表示这是群集(Real Application Cluster)的第二个实例,准备接受连接。
    4)UNKNOWN表示监听器是静态注册的(Registered Statically)

上例中我们可以看到所显示的Service部分,其中的fin、hr等就是数据库实例中service_names参数所指定的服务名。同时,我们应该注意到,fin、hr等服务名所指定的Instance部分的status字段为READY,而static_srv的status字段为UNKNOWN。这是因为,fin、hr等是由PMON进程动态注册到监听器的,因此PMON进程所在的数据库一定处于打开状态,所以说这些服务名所对应的实例已经准备(READY)好接受用户的连接请求了。而static_srv则是通过编辑listener.ora文件而静态注册的服务名,监听器并不确定该服务名所对应的实例是否已经打开了,因此其状态为未知(UNKNOWN)。

我们可以在status命令后面写上非默认的监听器名,比如查看my_listener的状态:

LSNRCTL> status my_listener

我们还可以不进入lsnrctl的交互式界面,而是在操作系统提示符下,执行lsnrctl命令:

[Oracle@book ~]$ lsnrctl start my_listener --启动监听器my_listener[Oracle@book ~]$ lsnrctl stop my_listener--关闭监听器my_listener[Oracle@book ~]$ lsnrctl status my_listener--查看监听器my_listener的状态

4 配置客户端

配置客户端网络时,必须确保客户端的配置信息(如IP地址或者主机名、实例名、协议、端口号)和服务器端的配置信息相同。

在客户端,使用Oracle的网络服务连接监听器时,我们一般采用两种方式:简单连接本地命名

4.1 简单连接(使用“连接字符串”登录远程数据库)

进行简单连接时,在客户端不需要进行任何的配置。连接方式如下所示:

SQL> connect hr/hr@book.us.oracle.com:1521/ora10g

其中,hr/hr为要连入的用户名和密码;book.us.oracle.com表示数据库实例所在的主机名称;1521表示端口号;ora10g表示要连入的数据库实例名。

如果发现简单连接失败,则应该检查$ORACLE_HOME/network/admin/sqlnet.ora文件。该文件中应该有如下的内容:

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

也就是说,如果sqlnet.ora文件中的names.directory_path部分不写ezconnect的话,则不能使用简单连接。

注 意: ezconnect的意思就是easy connect,表示简单连接。

简单连接尽管简单,但不支持连接的高级特性。比如连接时的负载均衡(load balance)以及连接时的故障转移(failover)等。

4.2 本地命名(使用“网络服务名”登录远程数据库)

另外一种我们更加常用的连接方式为本地命名方式。

在该方式下,我们需要配置一个本地命名解析文件。该文件默认为 $ORACLE_HOME/network/admin/tnsnames.ora。该文件位于客户端,可以使用netca的图形界面来帮助配置该文件。

文件内容以及各个字段的解释说明如下图所示:

Oracle的网络是基于操作系统的网络配置,在配置Oracle网络之前,我们必须安装和配置好操作系统(OS)的网络。TCP/IP是应用最广泛的通信协议,通常我们选择TCP/IP。

Oracle支持的协议有:

  • TCP/IP
  • TCP/IP with SSL(TCPS)
  • Named Pipes(NMP)
  • SDP
  • IPC

配置了tnsnames.ora文件以后,我们就可以使用本地连接,如下所示:

SQL> connect hr/hr@sales

可以看到,在了解了tnsnames.ora文件的内容以后,我们可以手工添加新的连接字符串。

比如,我们添加一个连接字符串,使其连到默认监听器里静态注册的服务名。如下所示:

newname =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = book.us.Oracle.com)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = static_srv)))

我们只需要修改service_name字段,使其为一个静态注册的服务名,并把sales改为另外一个字符串(在这里为newname)即可。

然后我们使用newname进行连接:

SQL> connect hr/hr@newname

上文我们提到了网络服务名,那么网络服务名是什么呢?
当我们访问远程数据的时候,都需要输入类似于下面的连接描述符,这些信息描述了我们要连接的数据库。

(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.202)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = zdb)))

这些信息非常冗长,如果用户每次访问远程数据库时都要输入那么冗长的信息,那将是生命的极度浪费。为此,DBA可以给这些冗长的字符串(连接描述符)起一个“别名”。在Oracle中,我们把这样的别名叫“网络服务名(Net Service Name)”。

如果配置好了网络服务名,当我们每次连接远程数据库时,无须输入那么冗长的信息,只需输入网络服务名,便可轻轻松松登录远程的数据库服务器。

网络服务名存储在名为tnsnames.ora的文件中,可以把该文件复制到网络中的所有客户机和服务器上。

5 测试客户端到服务器的连接

一般我们在配置了tnsnames.ora文件以后,会使用tnsping这个工具来判断从客户端到监听器的网络连接是否正常。tnsping是一个在操作系统命令行执行的命令,如下所示:

[oracle@book admin]$ tnsping newname……Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =book.us.Oracle.com)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = static_srv)))OK (10 msec)

如上面所示,如果客户端能够成功连接到服务器,tnsping命令的执行结果将会显示“OK”,并报告这个过程消耗了多少时间(本例中消耗10毫秒),则说明通过该连接字符串能够连接到指定的监听器上;如果不能成功连接到远程的服务器,tnsping命令将会返回详细的错误信息。

tnsping不会验证连接字符串所包含的服务名是否为监听器所管理的服务名,它只是验证网络连接是否正常。

我们也可以用tnsping来验证简单连接:

[oracle@book admin]$ tnsping book.us.oracle.com:1521/ora10g……Used EZCONNECT adapter to resolve the aliasAttempting to contact (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=ora10g))(ADDRESS=(PROTOCOL=TCP)(HOST=152.68.32.60)(PORT=1521)))OK (0 msec)

6 轻松搞定Oracle网络之——Oracle网络故障攻略

引起客户端不能访问数据库的原因很多,有软件问题,也有硬件问题;有操作系统本身的问题,也有应用程序的问题,也可能是防火墙的问题。但是,在多数情况下都是用户配置不当所致。无论什么网络错误,我们都可以按照下面的顺序和原则去侦测网络问题。

6.1 ping目标主机

用操作系统命令ping目标主机,看看目标主机是否存在。

C:\Documents and Settings\Administrator>ping 192.168.200.38Pinging 192.168.200.38 with 32 bytes of data:Request timed out.Ping statistics for 192.168.200.38:Packets: Sent = 4, Received = 0, Lost = 4 (100% loss)

一般情况下,我们基本上可以从这里断定问题是否与操作系统有关。

如果ping的结果是“Request timed out”,表示客户端到目标主机(192.168.200.38)的网络不通。这时候,需要解决操作系统这一层的网络连接问题。如果不是操作系统的网络问题,接下来,我们可以执行tnsping命令查看问题是否出在Oracle配置这一层。

ping不通可能有下面的原因:

  • 客户端的网卡物理故障
  • 客户端的网卡设置不当
  • 客户端的防火墙限制
  • 网线断裂
  • 服务器端的网卡物理故障
  • 服务器端的网卡设置不当
  • 服务器端的防火墙限制
  • 。。。。。。

6.2 执行tnsping命令

tnsping 网络服务名

tnsping命令主要用于测试客户端是否能够连接到监听器。

如果tnsping命令报告错误,我们需要执行3)。

6.3 查看监听器状态

$ lsnrctl status

从这里,我们可以知道监听器的运行状态。如果监听器运行不正常,或者客户端设置的参数与监听器的参数不匹配,都会导致网络故障。

6.4 查看监听器配置文件(listener.ora)

监听器启动的时候,会读取一个名叫listener.ora的文件,这个文件即为“监听器配置文件”,它指定监听器所在的主机、监听器监听的实例名、监听的端口号、监听的协议等信息。这个文件的内容类似于下面的内容:

SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(GLOBAL_DBNAME = zdb)(ORACLE_HOME = C:\app\Administrator\product\11.1.0\db_3)(SID_NAME = zdb)))LISTENER =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.202)(PORT = 1521)))
  • LISTENER是监听器的名字,我们也可以使用别的名字
  • ORACLE_HOME是Oracle的主目录。
  • SID_NAME是监听器监听的数据库的实例名。
  • PROTOCOL是监听器监听的协议。
  • HOST指定数据库服务器的主机名或者IP地址。
  • PORT指定监听器使用的端口号,默认的端口号是1521。

需要仔细比对客户端的参数是否和这些参数匹配。在确定服务器端配置无误后,我们需要查看客户端的配置。

6.5 查看客户端网络配置文件tnsnames.ora

客户端网络配置文件tnsnames.ora的样例如下所示(这个文件定义了网络服务名MYZDB):

MYZDB =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.202)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = zdb)))
  • PROTOCOL用于指定使用的协议。
  • HOST指定数据库服务器的主机名或者IP地址。
  • PORT指定监听器使用的端口号,默认的端口号是1521。
  • SERVICE_NAME指定请求的数据库的实例名。

需要仔细比对这些参数与监听器的参数是否匹配。

6.6 查看Oracle网络的日志文件

如果完成上述步骤,仍然不能诊断出网络故障,我们可以查看Oracle网络的日志文件,从这些文件中,我们能够获得更多的信息,这些文件如下:

  • listener.log Listener(监听器日志文件)
  • sqlnet.log Client or Database Server(存在于客户端和服务器端)
  • instance-name_pid.log Oracle Connection Manager Listener(有关连接管理器的日志文件)
  • 。。。。。。