ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 客户端连接故障检查流程手段

客户端连接故障检查流程手段

原创 Linux操作系统 作者:realkid4 时间:2011-12-22 21:52:33 0 删除 编辑

 

最近帮同事解决了几个TNS连接故障,觉得很有代表性。所以打算把一帮常用的处理思路记录下来,权当记录。

 

每个Oracle的学习者在安装完数据库、客户端之后,对服务器、实例、监听器、本地服务名和服务名Service Name这些概念不容易弄清楚。在Windows下,经常出现连接失败的问题。

 

这些困惑笔者也都经历过,也曾经无下手之处。其实,处理这样的问题思路,就是:从客户端开始,一个环节一个环节进行检验。发现故障点,排除故障点。

 

下面,我们分别进行查看。

 

1、安装一个的客户端

 

客户端安装和配置故障,是我们遇到连接故障中最大的比例。经常是我们自己配置和安装客户端程序有问题,引起的连接故障。

 

在企业或者项目组开发环境下,我们是没有必要在自己机器上专门安装数据库服务器的。一般,我们只需要安装一个客户端就可以了。

 

Oracle官方网站上,我们是可以免费下载到Oracle客户端程序。目前,客户端提供的是11g。通常客户端是向下兼容,也就是高版本的客户端可以连接到低版本服务器上。不过,笔者在实际使用中,发现低版本客户端连接高版本服务器通常也没有什么大问题。

 

这里,我们要注意一个问题:Oracle服务器上,实际也是默认安装了客户端核心组件的。如果你的机器上已经有数据库服务器,就不要在机器上额外安装一个客户端了。

 

当一台机器上有多个服务器或者客户端的时候,配置和相关的内容是很多的。我们调用哪一个客户端,使用哪个连接配置文件,都是通过系统的环境变量,如ORACLE_HOMEORACLE_BASEPATH等内容进行定位的。而其中的关系,是初学者需要投入精力去理解的。很多朋友在调用sqlplus或者netca的时候,可能没有意识到自己调用的究竟是哪个客户端。

 

同时,多个客户端并存,很多时候会引起冲突。笔者的一个朋友就遇到过机器上同时存在9i10g客户端。PATH环境变量中包括了两个客户端的bin目录,结果启动sqlplus不成功,但是启动sqlplusw却成功。

 

出现这种问题,单纯通过Oracle客户端程序检测是不容易解决的。只能一点点的分析和抽丝剥茧。所以,为了避免不必要的麻烦,如果我们没有把握进行调试,还是保留一份客户端就好。

 

2、安装操作系统位数合适的客户端

 

这个故障笔者在工作中和QQ群里面都遇到过。现在个人PC容量惊人,超4G内存比比皆是。于是乎个人客户端上64位操作系统也就不是什么新鲜事。

 

经常有朋友问这样的问题:我的64OS上面,安装了64位的Oracle Client。配置本地命名都是没有问题,使用SQLPLUS连接没有问题。但是安装上pl/sql developer之后,就连接不上,报错信息有时候还看不清楚。

 

其实,这个问题还是操作系统位数兼容的问题。Windows环境下,64位操作系统是兼容32位的程序的。在64位机器上安装64Oracle Client是没有问题的。但是,问题出在pl/sql developer上。目前我们常用的pl/sql developer都是32位版本的,其工作原理是需要调用Oracle客户端的OCI接口文件。这个文件pl/sql developer也需要32位的。所以,才出现客户端连接没问题,而pl/sql developer连接有问题的情况。

 

解决的方法也容易,就是安装32位的客户端。

 

3、客户端命名配置

 

客户端本地命名是另一个出现问题的方面,同时也是解决问题的一个入手点。

 

 

C:\Documents and Settings\Administrator>sqlplus /nolog

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 12 22 21:10:51 2011

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

 

SQL> conn scott/tiger@ora11g;

ERROR:

ORA-12170: TNS: 连接超时

 

 

首先,需要判断连接的本地命名ora11g是否解析成功。这里可以使用tnsping命令进行检查。TNSPING命令是Oracle提供的网络ping命令。

 

 

 

C:\Documents and Settings\Administrator>tnsping ora11g

 

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 22-12-

2011 21:17:16

 

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

 

已使用的参数文件:

D:\oracle\network\admin\sqlnet.ora

 

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

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

(HOST = 192.168.0.89)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ora11g)))

TNS-12535: TNS: 操作超时

 

 

TNSPING命令的结果有三个重要意义:

 

ü        判断当前使用的TNS配置文件位置。

 

 

已使用的参数文件:

D:\oracle\network\admin\sqlnet.ora

 

 

这部分内容很有意义。当客户端所在OS上安装多个客户端时候,我们可以从这里判断出使用的TNS究竟是哪个。同时,虽然提示的sqlnet.ora,但是重要的tnsnames.ora文件是和它在相同的目录下的。

 

如果这部分有问题,比如定位的客户端不是希望的。那么就请检查环境变量,特别是path变量的配置。

 

ü        本地命名解析

 

 

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

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

(HOST = 192.168.0.89)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ora11g)))

 

 

第二部分有益的信息是关于命名的解析。我们在tnsnames.ora中配置了本地命名。但是,有时候这些信息名称是不会正确解析的,如使用粘帖方法、关键字书写等。这部分,可以让我们知道Oracle Net Service组件是如何解析ora11g的。其中的IP地址,服务名,端口等内容是否正确?是我们检查的项目。

 

如果这部分不能解析,或者解析有误。建议去检查或者重新生成一些tnsnames.ora文件。

 

ü        远程监听器情况

 

最后,tnsping会去检查一下远程服务器上的监听器状态。如果发现指定端口没有监听程序守候,就会提示错误。那么,我们起码知道监听器配置上存在一些问题。

 

当客户端配置没有问题的时候,我们就需要考虑一下是否是服务器的问题了。下面,我们讨论一下简单的服务器端问题。

 

4、监听器故障

 

监听器是Oracle服务器的一个重要组件。监听器主要职责就是为实例和client建立请求连接。

 

这个环节我们就需要使用lsnrctl控制组件。

 

 

[oracle@oracle11g ~]$ lsnrctl

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 19-DEC-2011 22:25:39

Copyright (c) 1991, 2009, Oracle.  All rights reserved.

Welcome to LSNRCTL, type "help" for information.

 

LSNRCTL>

 

 

首先,我们需要检查一下监听器状态。

 

 

LSNRCTL> status 

Connecting to (DESCRIPTION= (ADDRESS= (PROTOCOL=TCP) (HOST=oracle11g) (PORT=1521)))

TNS-12541: TNS:no listener

 TNS-12560: TNS:protocol adapter error

  TNS-00511: No listener

   Linux Error: 111: Connection refused

 

 

里面的连接信息首先说明了监听器程序的配置信息,包括端口号。显然,这个监听器没有启动。需要启动之后才可能接受到远程的请求。

 

 

LSNRCTL> start

Starting /u01/oracle/bin/tnslsnr: please wait...

 

TNSLSNR for Linux: Version 11.2.0.1.0 - Production

System parameter file is /u01/oracle/network/admin/listener.ora

Log messages written to /u01/diag/tnslsnr/oracle11g/listener/alert/log.xml

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g)(PORT=1521)))

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle11g)(PORT=1521)))

STATUS of the LISTENER

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

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date                19-DEC-2011 22:27:23

Uptime                    0 days 0 hr. 0 min. 0 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /u01/oracle/network/admin/listener.ora

Listener Log File         /u01/diag/tnslsnr/oracle11g/listener/alert/log.xml

Listening Endpoints Summary...

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

The listener supports no services

The command completed successfully

 

 

注意,此时虽然监听器启动,但是并没有服务注册进监听器。也就是说,监听器并不知道注册的服务名称Service Name是什么,更不要说对应实例Instance的信息了。

 

这里,就牵扯到实例的启动和动静态注册问题了。

 

5、数据库实例的动静态注册

 

监听器启动之后,下面确认的环节就是实例是否启动了。这个过程我们需要登录到数据库服务器所在主机,进行确认和启动。

 

 

[oracle@oracle11g ~]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.1.0 Production on Mon Dec 19 22:30:20 2011

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

 

SQL> conn / as sysdba

Connected to an idle instance.

 

 

显然,上面的数据库是没有启动。

 

 

SQL> startup

ORACLE instance started.

 

Total System Global Area  414298112 bytes

Fixed Size                  1336904 bytes

Variable Size             327158200 bytes

Database Buffers           79691776 bytes

Redo Buffers                6111232 bytes

Database mounted.

Database opened.

 

 

注册过程就是数据库实例要让监听器知道自己的目录位置和服务名称Service Name。注册过程有动态注册和静态注册两种类型,现在最常用的就是动态注册。

 

所谓动态注册,就是实例的pmon进程每隔一段时间,就自动访问一次监听器程序,告知自己状态。动态注册的意义有两个,一个是让监听程序可以获取到服务信息,另一个更加有意义的方面是让监听器可以知道实例的健康状态,便于进行failover

 

我们启动实例之后,就可以查到注册状态了。

 

 

Listening Endpoints Summary...

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

Services Summary...

Service "wilson" has 1 instance(s).

  Instance "wilson", status READY, has 1 handler(s) for this service...

The command completed successfully

 

 

如果我们发现实例启动之后,没有发生主动的动态注册。可以手工的调用语句强制进行注册。

 

 

SQL> alter system register;

System altered.

 

 

 

 

6、结论

 

TNS NameOracle Net Service是初学Oracle毕竟的一个关口。笔者从最常出问题的环节出发,介绍了检测方法,便需要的朋友共享。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-713802/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7566264