关于 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/ (可能被墙了)