比
较
orale的tnsping与TCP/IP的ping命令:
-----------------------------------------------------------------------------
Oracle Net 工具(命令)tnsping,是一个OSI会 话层 的工具,它用来:
Oracle Net 工具(命令)tnsping,是一个OSI会 话层 的工具,它用来:
1)
验证
名字解析(name resolution,当然是oracle自己的网
络
服
务
名)
2)
远
程的listener是否启
动
在
验证
上面两
项
功能方面,它是DBA手
头
上一个比
较
得心
应
手的工具。
Oracle
网
络
接口支持不同的网
络
与
传输协议
,其中我
们
最熟悉的就是
TCP/IP.
这
篇文章只描述
TCP/IP
协议
族,然而,在
oracle
网
络
接口支持的其它
协议
下,
tnsping
的功能是一
样
的。
Tnsping
可以用在多个网
络协议
上,但是本文只
讨论
TCP/IP
网
络协议
-----------------------------------------------------------------------------
ORACLE TNSPING
-----------------------------------------------------------------------------
ORACLE TNSPING
-----------------------------------------------------------------------------
Oracle
的
tnsping
测试
程序,在通
讯时
使用
TCP
协议
。
TCP
是面向
连
接的
OSI
传输层协议
。面向
连
接的
协议
在初始建立
连
接的
阶
段需要
进
行初始的序列号的交
换
,
这
就是我
们
通常所指的三次握手。即
tnsping
测试
程序在与
listener
进
行通
讯时
会
产
生三次握手
现
象。
当在命令行中
发
出了
tnsping
命令后,会
执
行
oracle
网
络别
名(即网
络
服
务
名,主机
连
接字符串)的解析工作。
这
个解析工作会在本地的
tnsnames.ora
文件或
ORACLE
的命令服
务
器或
ORACLE LDAP
(目
录
服
务
)中
进
行。解析的目的是得到目
标
listener
所在的机器名(
IP
地址)和
listener
侦
听的端口号。
一旦得到
listener
的机器名与端口号,就可以打
开
一个到目
标
机器与端口的
TCP
连
接。
为
了打
开这
个
TCP
连
接,
listener
的机器名必
须
被解析
为
ip
地址(当然
这
只有在解析出的
listener
的
连
接地址
为
机器名
时
才
这样
做),然后
TCP/IP
执
行三次握手来完成
这
次
连
接。
在
连
接建立之后,
Tnsping
工具然后就
发
送一个
Oracle TNS
连
接包
给
Oracle Listener
,
Listener
然后就回
应
一个
TNS
拒
绝
包(
Refuse packet
),在两个机器
间
的
TCP/IP
连
接就
结
束了。从
oracle
网
络别
名的解析到
结
束
TCP/IP
连
接之
间
的
总
的耗
费
的
时间
就
显
示在
tnsping
命令的
输
出中。
一个例子:
C
:
/>tnsping V817 4
TNS Ping Utility for 32-bit Windows
:
Version 8.1.7.0.0 - Production on 18-MAY-2001 14
:
27
:
57
(c) Copyright 1997 Oracle Corporation. All rights reserved.
Attempting to contact
ADDRESS=(PROTOCOL=TCP)(HOST=abadah.us.oracle.com)(PORT=1521))
OK (1770 msec)
OK (10 msec)
OK (0 msec)
OK (10 msec)
上面
这
个例子
显
示第一次tnsping需要1770毫秒,
这
些
时间
由在tnsnames.ora文件中解析V817网
络别
名需要的
时间
、利用DNS解析listener机器名“ abadah”需要的
时间
,三次TCP/IP握手需要的
时间
、TNS Connect 和Refuse packets
传输
需要的
时间
、断
开
TCP/IP
连
接需要的
时间
。
第二次
tnsping
只花
费
了
10
毫秒,
这
是因
为
所有的信息(
V817
别
名与
IP
地址)都已
经
在
cache
中了,然而
Tnsping
程序仍然做
TCP
的
连
接与断
开
操作。
-----------------------------------------------------------------------------
TCP/IP PING
-----------------------------------------------------------------------------
TCP/IP PING
-----------------------------------------------------------------------------
Transmission Control Protocol/Internet
协议
族 (TCP/IP) 有一个称
为
ping的工具。它是到TCP/IP
协议
族中ICMP(Internet Control Message Protocol)
协议
的命令行接口。
根据
RFC 792
:
"
有
时
候,一个网
关
或目的地址需要同源地址
进
行通
讯
,如:
为
了
给
源地址一个
关
于在
处
理数据
报
的
过
程中
产
生的
错误
。
为
了
这种
目的,就需要使用
ICMP
协议
。
ICMP
需要网
际协议
(
IP
)的支持,
这
使它看起来就像一个更高
层
的
协议
,然而,
ICMP
实际
上是
IP
的一个
组
成部分,在
IP
的
每
个模
块
中必
须实现
它。
Ping
命令的作用之一就是收集不同大小的
IP
数据包在网
络
上
传输
一个来回需要的
时间
。
这
可以用来估
计
网
络
的大体性能和响
应时间
。
Ping
命令使用
IP
,而不是
TCP
,
这样
就不需要
TCP
的
3
次握手机制,当运行
ping
命令
时
,它只
发
送与接收一个
ip
数据包,
这
比
oracle
的
tnsping
程序运行
时
需要更少的数据包。
Ping
的第一个的
response time
经
常比平均
response time
要
长
,
这
是因
为
第一次一般需要
对
ping
的机器名
进
行解析。
这
个解析可以通
过
本地的
hosts
文件、
DNS
服
务
器或其它方法
实现
。
一个
ping
的例子:
Pinging abadah.us.oracle.com [144.25.223.156] with 32 bytes of data
:
Reply from AAA.BBB.CCC.DDD
:
bytes=32 time<40ms TTL=255
Reply from AAA.BBB.CCC.DDD: bytes=32 time<10ms TTL=255
Reply from AAA.BBB.CCC.DDD: bytes=32 time<10ms TTL=255
Reply from AAA.BBB.CCC.DDD: bytes=32 time<10ms TTL=255
上面的例子
显
示第一次的
ping
时间
需要
40
毫秒,
这
包括
DNS
解析的
时间
。
从上面的介
绍
我
们
可以得出:
1.tnsping
需要使用
TCP
,所以需要
3
次握手建立
连
接,而
ping
只使用
IP
,所以不需要
3
次握手,
这
也就解
释
了
为
什
么
有的机器不能
ping
通,但是用
tnsping
确能
测试
通。
2.Tnsping
通,并不能
说
明客
户
端能与数据
库
建立
连
接。因
为
ping
通只能
说
明客
户
端能解析
listener
的机器名,而且
lister
也已
经
启
动
,但是并不能
说
明数据
库
已
经
打
开
,而且
tsnping
的
过
程与真正客
户
端
连
接的
过
程也不一致。
但是如果不能用
tnsping
通,
则
肯定
连
接不到数据
库
。
关
于第
2
条可以用
tns-12545
错误
来
说
明:
TNS-12545 (ORA-12545): Connect failed because target host or object does not exist
原因:
客
户
端不能正确解析服
务
器的机器名。
该错误
一般出
现
在客
户
端没有
设
置或没有正确
设
置域名服
务
器的情况下出
现
。
解决
办
法:
疑
问
:出
现这种
情况
时
,有
时
可以用
tnsping
测
程序
测试
网
络
服
务
名可以通
过
,但
还
是不能用程序
连
接数据
库
,你会感到很奇怪。有
时
即使将客
户
端的
tnsnames.ora
中的服
务
器的机器名
换为
ip
地址,
还
是会
报错
,
这
会令人感到更加疑惑,会不会系
统
有
问题
?
要真正解决
这
个
问题
,需要知道客
户
端与服
务
器端在建立
连
接
时
所的数据流。
并需要了解redirect session的概念。
当一个客
户
端
连
接在
window
上的数据
库
,或以共享
连
接的模式
连
接在
unix
上的数据
库时
(此
时
数据
库为
MTS
模式),客
户
端的
连
接会
发
生重定向
现
象,也就是
listener
在接受客
户
端的
连
接后,会
发
送一个重定向的包
给
客
户
端,然后客
户
端利用
这
个重定向包中提供的信息(服
务
器的
ip
(或机器名)和端口等信息)重新
发
起一个真正的到数据
库
的
连
接。当将客
户
端的
tnsnames.ora
中的服
务
器的机器名
换为
ip
地址,客
户
端的
连
接
还
是会
报
ora- 12545
错
的罪魁
祸
首就是
这
个重定向包中的内容。
当客
户
端
连
接
window
上的数据
库
,或以共享
连
接的模式
连
接在
unix
上的数据
库时
,因
为
tnsnames.ora
中
为
服
务
器的
ip
地址,所以不存在名字解析的
问题
,客
户
端的
连
接
请
求会到达
listener
,
这
也就是
tnsping
测试
程序
测试
网
络
服
务
名可以通
过
的原因,因
为
tnsping
测试
程序不会
产
生重定向
问题
。在
listener
接受客
户
端的
连
接后,会跟据客
户请
求的
连
接模式(
专
用
连
接
还
是共享
连
接)和操作系
统对
socket
的
实现
的情况,决定是否需要将客
户
端的
连
接
进
行重定向,如果需要
进
行重定向,
则
会
产
生一个重定向包,
该
包中包含的服
务
器的地址信息
为
从
listener.ora
文件中得到的
listener
侦
听的地址(根据
listener.ora
中的配置可能
为
服
务
器的机器名,也可能
为
服
务
器的
ip
地址),
该
包中
还
包含客
户
端
应该
重定向
连
接的端口信息(同
listener
侦
听的端口可能不
为
同一个),客
户
端在收到
这
个重定向包后,解析出
应该
重新
连
接的服
务
器地址(机器名或
ip
)和端口,重新利用解析出的信息建立一个新的
连
接,此
时
如果客
户
端得到的
为
服
务
器的机器名并且没有配置域名解析,就会因
为
解析不出服
务
器的
ip
地址,从而
导
致
产
生
ora-12545
错误
。
所以,如果如果要
彻
底解决
ora-12545
错误
,需要:
1
) 配置一个域名服
务
器,并正确的
设
置客
户
端机器的域名服
务
器
2
) 将服
务
器的机器名与
ip
配置在客
户
端的
hosts
文件中。
3
) 将客
户
端
tnsnames.ora
和
listener.ora
中的地址部分都改
为
ip
地址,而不是用机器名
4
) 将客
户
端的
连
接改
为专
用
连
接,
这样
会避免
redirect
现
象。(适用与客
户
端
tnsnames.ora
中
为
服
务
器的
ip
地址的情况下)