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

    关于 tnsping

 

    后面我们会探讨可能会发生的各种连接错误。但在这之前,我们先来快速浏览一下 Oracle 的一个实用工具 tnsping。我们将探讨 tnsping 能做什么,不能做什么,并揭漏一些有关 tnsping 的传言。

      tnsping 工具用来判断 Oracle Net 网络上的一个服务是否可达。它的完整的使用指导可以在《Net Services Administrators Guide》中找到,此文档和其他文档一样,都可以在都可以在 tahiti.oracle.com 上找到(现已改为 docs.oracle.com ---- 译注)。TNSPING 在 sqlnet 中的作用相当于网络配置中的 PING。

    我们来看一个简单的例子。假设 tnsnames.ora 中的项目如下:

C:\>type C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN\tnsnames.ora
# tnsnames.ora Network Configuration File: C:\oracle\product\10.2.0\client_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
#===========================
larry =
    (DESCRIPTION =
        (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = vmlnx01)(PORT = 1521)
        )
       (CONNECT_DATA =
          (SERVICE_NAME = vlnxora1)
      )
  )
C:\>

    我们来做如下测试:

1. C:\>tnsping larry
2.
3. TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 27-FEB-2 011 16:21:22
4.
5. Copyright (c) 1997, 2007, Oracle. All rights reserved.
6.
7. Used parameter files:
8. C:\oracle\product\10.2.0\client_1\network\admin\sqlnet.ora
9.
10. Used TNSNAMES adapter to resolve the alias
11. Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
12. (HOST = vmlnx01)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = vlnxora1)))
13. OK (20 msec)

 

    看到上面的输出结果,我们会认为:好啊,连上了。但实际情况是,可能连上了,也可能没有。这一点我们后面再讲。这里,我们先来看看,从以上的输出中我们能得到那些有用的信息。

    首先,从第三行我们可以发现,当前运行的客户端版本是 10.2.0.4。注意这是客户端的本版,而不是数据库的版本。两者不必非得一样,这里告诉我们的仅是客户端的版本。

    从第七行和第八行我们看到,当前客户端使用的网络参数文件(sqlnet.ora)所在的位置是 C:\oracle\product\10.2.0\client_1\network\admin。这是一个很明显的迹象,表明 tnsnames.ora 文件也位于这个目录中。当然,还有其他因素会影响 tnsnames.ora 文件所在的位置,这一点可参考我的上一篇博文

    从第十行可以看出,我们是用 TNSNAMES 适配器来对别名进行解析的。(这里,别名是 vlnxora1。)( 原文如此,应为 larry ---- 译注)适配器的选择是根据 sqlnet.ora 中 NAMES.DIRECTORY_PATH参数 的值来进行的。

    第十一行和第十二行说明了,sqlnet 是如何将别名,或者叫连接标识符,解析成连接描述符的。我们看到,连接请求是用 tcp 网络协议来发送的(PROTOCOL = TCP),被发送到服务器 vlmnx01 上 (HOST = vmlnx01),发送到了这个服务器的 1521 端口。所有这些信息都是从 tnsnames.ora 文件中的 larry 项中得到的,如上面的代码所示。

    从第十三行我们得到的是,响应时间为 20 毫秒。这是不太准确的。根据《Net Administrators Guide》,tnsping 显示的网络往返时间是估算的。

    还可以看到,这是一个到 (SERVICE_NAME = vlnxora1) 的连接请求。那是它是否真的连接到了这个服务呢?我们来看看监听的状态:

1. [oracle@vmlnx01 admin]$ lsnrctl status
2.
3. LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 27-FEB-2011 15:27:35
4.
5. Copyright (c) 1991, 2007, Oracle. All rights reserved.
6.
7. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
8. STATUS of the LISTENER
9. ------------------------
10. Alias LISTENER
11. Version TNSLSNR for Linux: Version 10.2.0.4.0 - Production
12. Start Date 27-FEB-2011 15:27:26
13. Uptime 0 days 0 hr. 0 min. 9 sec
14. Trace Level off
15. Security ON: Local OS Authentication
16. SNMP OFF
17. Listener Log File /ora00/app/oracle/product/10.2.0/db_1/network/log/listener.log
18. Listening Endpoints Summary...
19. (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmlnx01.vmdomain)(PORT=1521)))
20. The listener supports no services
21. The command completed successfully
22. [oracle@vmlnx01 admin]$

   第二十行表明,“监听不支持任何服务”(The listener supports no services)。怎么会是这样?tnsping 不是成功了吗?真正的连接请求会发生什么?

C:\>sqlplus scott/tiger@vlnxora1

SQL*Plus: Release 10.2.0.4.0 - Production on Sun Feb 27 15:32:18 2011

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect Descriptor

   结果当然是,“监听程序当前无法识别连接描述符中请求的服务”。当前的实际状态是,监听程序任何服务都不会识别。需要说明的是,我如何保证监听程序不能识别任何服务的。因为我设置监听程序使用动态数据库注册机制,而在测试开始之前我已经停掉了数据库。不仅监听不会识别出任何数据库,而且根本就没有数据库在运行。我们可以指定 SERVICE_NAME=FUBAR 或 SERVICE_NAME=BTZLFLX,但结果都会是一样的。

    如果监听根本就没有运行,会是什么情况呢?我们来将监听停掉试试:

[oracle@vmlnx01 ~]$ lsnrctl stop

 

LSNRCTL for Linux: Version 10.2.0.4.0 -Production on 27-FEB-2011 15:40:41

 

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

 

Connecting to(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

The command completed successfully

 

[oracle@vmlnx01 ~]$ lsnrctl status

 

LSNRCTL for Linux: Version 10.2.0.4.0 -Production on 27-FEB-2011 15:40:50

 

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

 

Connecting to(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

TNS-12541: TNS:no listener

 TNS-12560: TNS:protocol adapter error

 TNS-00511: No listener

  Linux Error: 111: Connection refused

[oracle@vmlnx01 ~]$


再来进行测试:

 

C:\>tnsping larry

TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 27-FEB-2
011 15:42:27

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)))
TNS-12541: TNS:no listener

正如我们所期待的,tnsping 报告没有监听。

 

结论:

虽然 tnsping 是诊断各种连接问题的有用工具,但有非常重要的一点我们一定要清楚:它却不会返回数据库实例的状态。这绝不是 tnsping 的短板。我们必须知道,这是一个诊断 sqlnet 问题的工具,而 sqlnet 不是数据库。

 

    原文地址:https://edstevensdba.wordpress.com/2011/02/27/tnsping-101/  (可能被墙了)


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值