Orlace 数据库连接的那些事儿:客户端(二)

客户端 TNS (sqlnet) 的基本设置

 

    继续上一篇《Orlace 数据库连接的那些事儿:客户端(一)》的讨论,本篇计划是,按其可能的发生顺序,逐个深入研究一下可能发生的错误。这些讨论可能会很漫长,我们的讨论从连接的客户端部分的 TNS 设置开始。由于大部分数据库连接的问题都是由使用 Windows 作客户端的用户提出来的,因此,本篇所有的示例都来自于 Windows 系统。可惜的是,如果用 Unix 做实例会更简单。

    在深入探讨数据库连接的细节之前,先来了解一下客户端 TNS 使用的几个主要配置文件,如何找到它们,更准确地说,TNS 是如何找到它们的。这类文件有两个,分别为 sqlnet.ora 和 tnsnames.ora。技术上来说,sqlnet.ora 不是必须的,因为它所包含的每个重要参数都有默认值。所以,系统中可能根本就没有这个文件,但我认为,最好用主要的参数创建一个,默认值就行 ---- 目的是在排错时减少模糊语义。sqlnet.ora 中每个参数的完整文档可以在 Net Services 参考文献中找到,这些文献和其他 Oracle 文档可以在 tahiti.oracle.com 中找到(已停用,现在位于 docs.oracle.com ---- 译注)。建议花时间研究一下文档中的《Net Services Administrator’s Guide》,特别关注一下 sqlnet 架构与 OSI 标准网络协议栈的关系。

    首先,TNS 软件需要知道如何定位到这两个文件,有两种方法可以使用。首先是在默认位置查找,即查找 %ORACLE_HOME%\network\admin。如果你的配置为:

        ORACLE_HOME=C:\oracle\product\10.2.0\client_1

那么 sqlnet 的配置文件应该位于 C:\oracle\product\10.2.0\client_1\network\admin。如果在一台机器上安装了多个 Oracle,就可能创建了多个 ORACLE_HOME 目录,就有了多份 sqlnet 配置文件,每个 ORACLE_HOME 一份。

    默认位置 ORACLE_HOME\network\admin 可以使用环境变量 TNS_ADMIN 来改写。例如,如果

        TNS_ADMIN=c:\oranet

    TNS 会去 c:\oranet 查找配置文件。只有在这个位置找不到配置文件时,才会去默认位置查找。

    那么,TNS 又是如果确定 ORACLE_HOME 和 TNS_ADMIN 的值的呢?在某些操作系统中(例如所有的 *nix 系统),只需要检查赋给进程的环境变量就可以了。但,因为本文讨论的是 Windows 系统,因此还要查看注册表。下面我们来用实例来展示不同配置所得到的结果。我们将用 Oracle 工具 “pnsping” 来检查配置的效果。这里我们将不会详细讨论 tnsping 的问题。这里要说是,它所做的就是向我们报告到那里去找 sqlnet.ora 文件。它还能告诉我们从 tnsnames.ora 文件中得到的地址信息。使用这两组信息,我们可以准确地说出使用的是那个配置文件。

   下面是我的实验环境的配置。一台安装了 Windows XP-Pro 的笔记本电脑,其上安装了一个标准的 Oracle 10.2 客户端,ORACLE_HOME 为 C:\oracle\product\10.2.0\client_1。这是我日常使用的工作环境的客户端设置。为了演示用,我创建了 C:\oracle\product\10.2.0\client_2\network 目录,来模拟第二个 ORACLE_HOME,并且在 ORACLE_HOME 之外创建了两个目录,c:\oranet\admin_3 和 c:\oranet\admin_4。

    我们首先来看一下我的当前设置。来看一下注册表(HKLM\software\oracle),发现 ORACLE_HOME 被设置为 c:\oracle\product\10.2\client_1。

   

    然后,从命令行检查环境变量。我们会发现未设置 ORACLE_HOME 环境变量,注册表项是唯一起作用的因素。

C:\>tnsping vlnxora1

TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 15-FEB-2011 18:27:09

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

Used parameter files:
C:\oracle\product\10.2.0\client_1\network\admin\sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = vmlnx01)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = vlnxora1)))
OK (40 msec)

C:\>

   

    这里最重要的是这一行:

Used parameter files:
C:\oracle\product\10.2.0\client_1\network\admin\sqlnet.ora

  这一行告诉我们找到并使用了那个 sqlnet.ora 文件。此例中,我们发现,TNS 正是在我们所期望的位置去查找配置文件的,位置是 %ORACLE_HOME%\network\admin。还应该注意的是这一行:“SERVICE_NAME = vlnxora1”。在我的配置中,这个服务名只有在那个位置的 tnsnames 中才有。因此我们知道,sqlnet.ora 和 tnsnames.ora 两个文件都那个相同的位置。

    现在,我们来尝试着做些改变。我们将从命令行将 ORACLE_HOME 设置为一个环境变量,然后用它来做同样的实验。

C:\>set ORACLE_HOME=C:\oracle\product\10.2.0\client_2

C:\>echo %ORACLE_HOME%
C:\oracle\product\10.2.0\client_2

C:\>tnsping vlnxora1

TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 16-FEB-2011 10:40:52

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

Used parameter files:
C:\oracle\product\10.2.0\client_2\network\admin\sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = vmlnx01)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = vlnxora2)))
TNS-12557: TNS:protocol adapter not loadable

C:\>

 

        我们会发现,注册表中 ORACLE_HOME 的值 (client_1)被环境变量的值(client_2)覆盖了。不用太关注 TNS-12557 错误,它是由于 ORACLE_HOME 指向了一个没有可执行二进制文件造成的。我设置这个目录的目的只是为了测试定位 sqlnet.ora 和 tnsnames.ora 文件,它并不是一个功能完整的 ORACLE_HOME。

关于 TNS_ADMIN

        下面我们来介绍便令 TNS_ADMIN。和变量 ORACLE_HOME  一样,这个变量既可以用注册表设置,也可以用命令行程序的环境变量来设置。我们下面的实验,使用注册表来进行。这里我们向注册表的 HKLM\software\oracle 添加了 TNS_ADMIN 项:

 

添加以后再来测试一下。

C:\>tnsping vlnxora1

TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 16-FEB-
011 10:53:31

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

Used parameter files:
c:\oranet\admin_3\sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP
(HOST = vmlnx01)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = vlnxora3)))
TNS-12557: TNS:protocol adapter not loadable

C:\>

可以看到,注册表中 TNS_ADMIN 的值覆盖了 ORACLE_HOME 的注册表值以及环境变量值。

 

来做最后一个实验,向命令行处理程序的环境变量中添加 TNS_ADMIN。这个变量会覆盖前面讲的所有变量。

C:\>set TNS_ADMIN=C:\oranet\admin_4

C:\>echo %TNS_ADMIN%
C:\oranet\admin_4

C:\>tnsping vlnxora1

TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 16-FEB-2
011 10:57:12

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

Used parameter files:
C:\oranet\admin_4\sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = vmlnx01)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = vlnxora4)))
TNS-12557: TNS:protocol adapter not loadable

C:\>

我们再一次看到,注册表值覆盖环境变量,TNS_ADMIN 的值覆盖 ORACLE_HOME 的值。

 

结论:

    上面的实验,演示了 Windows 客户端中可以控制 TNS 定位配置文件 ( sqlnet.ora ) 和名称解析文件 ( tnsnames.ora ) 的各种配置。应该注意的是,同样的规则也可以应用于 *nix 环境,但 *nix 中没有注册表。unix 环境中,所有的设置都用环境变量来控制。所以,在 unix 环境中解决数据库连接问题时,需要考虑的设置变量要少很多。

    我曾试图做一个进一步测试,看如果其中一个文件不在指定位置时,TNS 是如何处理的。但是,因为需要定位的文件是两个,指定文件位置的变量是两个 (ORACLE_HOME 和 TNS_ADMIN),还有两个位置(注册表和环境变量)可以定义这两个变量。可能的组合翻番增长。最终还是退缩了。

    还有一个问题,就是是否需要引入 TNS_ADMIN 变量。答案是:视情况而定。如果只有安装了一个客户端,只有一个 ORACLE_HOME 值,就没有必要设置 TNS_ADMIN。但是,如果安装了多个客户端版本,每个版本都会有自己的 ORACLE_HOME 值 (例如,安装了一个基本的客户端,然后又装了一个 SQL DEVELOPER),那么就面临维护两个独立的 tnsnames.ora 文件的问题。这个问题有多种解决方法,但最简单的方法就是设置 TNS_ADMIN 的值,使其指向文件所在位置。正如上面演示的那样,如果使用了 TNS_ADMIN 变量,这些配置文件甚至都可以不在 ORACLE_HOME 目录下。我甚至更喜欢这种方法,因为它可以使对系统进行研究的人们更深切的认识到,在 TNS 配置文件和某个特定的 ORACLE_HOME 之间,并没有必然的联系。

 

       原文地址:.https://edstevensdba.wordpress.com/2011/02/16/sqlnet_client_cfg/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值