Oracle最早是依赖Unix/Linux为基础成长起来,很多时候环境配置中带有一些文本配置的痕迹。我们在进行配置和更改时,一定要注意细节、注意方法,否则可能会引发的一些故障问题。
下午一个开发组同事来找我帮忙,说连接数据库失败。不知道什么问题?笔者到本地机器上看,发现故障现象如下。
故障现象
连接数据库服务Orcl,本地NET服务名为orcl。
1、使用客户端连接失败
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 5月 14 15:19:19 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn scott/tiger@orcl;
ERROR:
ORA-12154: TNS: 无法解析指定的连接标识符
2、tnsping错误
尝试使用底层的配置连接tnsping工具。
//连接orcl服务
C:\Documents and Settings\Administrator>tnsping orcl
TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 14-5月2011 15:11:59
Copyright (c) 1997, 2005, Oracle. All rights reserved.
已使用的参数文件:
D:\oracle\network\admin\sqlnet.ora
TNS-03505: 无法解析名称
3、Net Configuration Assistant工具工作错误
开启neca工具,发现能够开启,但是点击next无反应。
故障分析
从tnsping工具不能正确解析orcl服务名称,认为至少是客户端连接的配置出现问题,而且从其他机器上连接服务器没有任何问题。所以是判定tnsnames.ora文件的故障。
tnsnames.ora和listener.ora是Oracle Net Service的两个核心文件。Listener.ora负责进行服务端监听器的配置。其中定义了Oracle数据库服务器的监听器监听端口等信息。在静态注册时代,listener.ora中甚至包括了监听器中注册的数据库实例服务。
Tnsnames.ora中配置的本地客户端上的名称映射。包括了连接特定IP地址上的特定端口上监听器的地址,还有希望连接的服务Service名称。
和同事沟通之后,得知是之前手工修改过tnsnames.ora文件。所以猜想问题就出现在此处。
打开位于$ORACLE_HOME/NETWORK/ADMIN上的tnsnames.ora文件,发现如下片段。
//tnsnames.ora文件片段
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
开头的ORCL命名出现问题,前方出现空格。这个是违反tnsnames.ora中定义的格式要求的。
Tnsnames.ora中定义的内容,根据Oracle的要求是不允许直接书写的。而是要求使用相关专用工具来进行配置。配置本地NET服务是有对应的规则的,就目前研究出的结果,包括两条:
ü 本地Net名称必须要顶行头书写。就是定义的Net名称必须为所在行的第一个字符,不能有空格;
ü 配置信息的嵌套括号中,只有最外层的括号允许顶头书写,其他不允许顶头书写。注意:最外层括号是允许不顶头书写的;
参考两条规则,可以发现该片段明显是违反了第一条规则。
修改故障
发现了问题,就容易解决了。将orcl前面的空格去掉,保存文件。
//修改之后内容
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))
)
之后验证连接信息。
C:\Documents and Settings\Administrator>tnsping orcl
TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 14-5月 -2011 15:55: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 = xxx.xxx.xxx.xxx)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl)))
OK (70 毫秒)
解析成功,验证登录。
SQL> conn scott/tiger@orcl;
已连接。
SQL>
故障解决!
结论:
oracle的配置规则是比较复杂的,涉及到数据库、网络、安全等等多方面。一般情况下,我们尽可能要使用提供的GUI工具进行配置,特别是一些不熟悉的配置内容。当然,GUI并不能够解决所有的问题,在一些特殊的情况下,比如没有UI界面、或者进行比较复杂的配置内容时,我们是可以进行手工的配置的。但是一定要注意保存备份文件和熟悉配置项,避免出现故障。