实验环境:win7、oracle 11gR2
解析问题:
一、客户端的解析问题
我们发现,tnsping localhost时,localhost会解析成127.0.0.1。但是,tnsping 主机名 时,主机名不会被解析成127.0.0.1。此时,解析使用的是EZconnect适配器。
客户端,连接时用到的主机名或是localhost,是由客户端这边的EZconnect适配器或是TNSNAME适配器来解析成ip地址的。
详见:
《
监听总结之解析问题二:由sqlnet.ora文件寻到EZCONNECT适配器程序来解析主机名为主机上的多个ip地址(*) 以及 tnsping是用来测试某个配置的监听程序是否启动
》
《
监听总结之解析问题一:由sqlnet.ora文件寻到TNSNAME适配器程序来解析网络服务名为它的具体配置(×)
》
二、服务端的解析问题
实验前的说明:
1、本实验都是在同一个主机上进行,未进行远程连接操作。hosts文件里内容为空。
2、因为怀疑监听程序
分别为
具有动态监听功能和只有静态监听功能时可能对实验有影响,所以在两种情况进行了相同实验。
3、本实验的过程就是:
start A 之后退出lsnrctl工具环境。退出lsnrctl工具环境
后,修改文件listener.ora中监听名为A的监听配置里的host值。接着再进入lsnrctl工具环境,再status A,查看
status的执行结果
。重复本过程十二次。
实验的结果:
start |
startus |
Status执行结果 |
主机名 |
192.168.0.30(本机实际ip地址) |
执行成功 |
Localhost |
执行成功 |
127.0.0.1 |
执行成功 |
|
|
Localhost |
192.168.0.30(本机实际ip地址) |
提示“无监听程序” |
主机名 |
提示“无监听程序” |
127.0.0.1 |
执行成功 |
|
|
192.168.0.30(本机实际ip地址) |
主机名 |
提示“无监听程序 |
Localhost |
提示“无监听程序” |
127.0.0.1 |
提示“无监听程序” |
|
|
127.0.0.1(环回地址) |
192.168.0.30(本机实际ip地址) |
提示“无监听程序” |
Localhost |
执行成功 |
主机名 |
提示“无监听程序” |
|
|
注释:
本实验在监听程序
分别为
具有动态监听功能和只有静态监听功能时进行过相同实验,结果一致。
不过,其实也不必怀疑监听程序
是否
具有动态监听功能
这个因素质的影响,因为本实验只是涉及服务端的解析问题,未涉及客户端的连接问题。
实验的结论总结:
2.0
首先,我们从实验的结果里提取以下结果:
start |
startus |
Status执行结果 |
127.0.0.1(环回地址) |
192.168.0.30(本机实际ip地址) |
提示“无监听程序” |
Localhost |
192.168.0.30(本机实际ip地址) |
提示“无监听程序” |
192.168.0.30(本机实际ip地址) |
127.0.0.1(环回地址) |
提示“无监听程序” |
我们发现,三个执行结果都是提示“无监听程序”,这是因为192.168.0.30和
127.0.0.1两个ip地址不同,所以对应的监听点也不同,不是在同一个位置的,故而status命令所连接到的监听点不是start命令启动的监听点,最终因此而提示“无监听程序”。
2.1“正在连接”时的解析问题
我们从实验的结果里提取以下结果:
start |
startus |
Status执行结果 |
主机名 |
192.168.0.30(本机实际ip地址) |
执行成功 |
Localhost |
执行成功 |
127.0.0.1 |
执行成功 |
start |
startus |
Status执行结果 |
127.0.0.1(环回地址) |
主机名 |
提示“无监听程序” |
Localhost |
提示“无监听程序” |
192.168.0.30(本机实际ip地址) |
提示“无监听程序” |
start |
startus |
Status执行结果 |
127.0.0.1(环回地址) |
Localhost |
执行成功 |
Localhost |
127.0.0.1(环回地址) |
执行成功 |
对第二和第三个表格的内容,做如下解释:
“正在连接”后的内容里,若host为主机名或是localhost时,
oracle系统没有调用自己的解析进程,而是先查看(window下的)hosts文件里是否有相应的域名解析条目。没有的话,则若是host为localhost,因为操作系统里默认设置是localhost 对应于
环回ip地址(127.0.0.1)的,所以
oracle系统就认为
localhost解析为
环回ip地址(127.0.0.1);
若是host为
主机名,
则可能还会启用DNS软件来进行域名解析。
具体实验证明如下:
初始条件:hosts文件里内容为空。
首先,我们发现,
start 主机名 之后退出lsnrctl工具环境,接着再进入lsnrctl工具环境
,分别status 本机实际IP地址、
status环回IP地址(127.0.0.1)、
status localhost。
结果三个都执行成功。反之,
start
本机实际IP地址
之后退出lsnrctl工具环境,接着再进入lsnrctl工具环境
,status
主机名。结果提示“无监听程序”。类似地,分别用
start 环回IP地址(127.0.0.1)、
start
localhost替代
start
本机实际IP地址
进行实验,结果也是如此。
接着,我们在hosts文件里写上“
127.0.0.1 主机名” 这一域名条目。之后,重新开始实验:
start
环回IP地址(127.0.0.1)
之后退出lsnrctl工具环境,接着再进入lsnrctl工具环境
,status
主机名。结果
执行成功。
这就说明“正在连接”后的内容里,若host为主机名时,
oracle系统会查看(window下的)hosts文件里是否有相应的域名解析条目。
综上所述,表格二里,status 主机名,全部失败,是因为主机名得不到解析成ip地址。表格三里,statuslocalhost,执行成功,是因为
localhost得到解析成ip地址。
其具体过程:hosts文件为空时,oracle系统某个进程就会调用操作系统底层的让localhost与::1(IP6形式的环回ip地址)对应的函数。
2.2 启动监听程序时的解析问题
我们从实验的结果里提取以下结果:
start |
startus |
Status执行结果 |
主机名 |
192.168.0.30(本机实际ip地址) |
执行成功 |
Localhost |
执行成功 |
127.0.0.1 |
执行成功
|
对表格内容,做如下解释:
服务端,也有自己的解析进程(具体不清楚),应该是oracle自己开发的,非操作系统上的DNS解析软件。
怎么可以证明服务端也有自己的解析进程呢?
可以用status命令查看一个具有动态监听功能且它的监听配置里的host值为主机名的监听程序,在
status的显示结果,看下“监听端点概要”这个部分的内容,可以发现,有三条配置信息:host分别为主机名、主机实际ip地址、环回ip地址。这个就说明,oracle系统将
监听配置里host的主机名解析成了主机实际ip地址、环回ip地址。
当然,一个只有静态监听功能且它的监听配置里host值为主机名的监听程序,oracle系统也会将该监听程序的监听配置里值为主机名的host解析为对应的Ip地址的。只是用status命令查看该监听程序时,
“监听端点概要”里,除了一条配置信息:host分别为主机名,其他两条未显示而已。那怎么知道其他两条的存在呢?
证明方法一,使用start+status:
start A之后退出lsnrctl工具环境,接着再进入lsnrctl工具环境
,分别status 本机实际IP地址、
status环回IP地址(127.0.0.1)、
status 主机名。结果三个都执行成功,说明都三条配置信息都在。
证明方法一,使用start+status:
start A之后(是否退出lsnrctl工具环境,不影响实验),
再分别(在本机上进行)tnsping 本机实际IP地址、
tnsping 环回IP地址(127.0.0.1)
。结果都执行成功,说明都三条配置信息都在。
总之,若是
有一个监听配置里host值为主机名的监听程序,
oracle系统里的解析进程就会将该监听程序的监听配置里值为主机名的host解析为对应的Ip地址,不管该监听程序是
具有动态监听功能还是只有静态监听功能。
另外,
不管监听程序是
具有动态监听功能还是只有静态监听功能,status localhost时,“监听端点概要”里,显示的
配置信息都是host为环回ip地址(127.0.0.1)
。
附加:
1、
2.1“正在连接”时的解析问题 里为什么觉得与DNS功能是否开启有关?因为 看到如下事实:
ping localhost
来自::1回复
127.0.0.1 localhost 对应 ,但是hosts文件为空内容。
2、DNS客户端 、注册 主机名、DNS服务在服务管理器
3、《
如何跟踪而得知localhost 的操作系统的默认值是::1
》