解析问题:
一、客户端的解析问题
我们发现,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 | 执行成功 | |
主机名 | 提示“无监听程序” | |
|
|
本实验在监听程序 分别为 具有动态监听功能和只有静态监听功能时进行过相同实验,结果一致。
实验的结论总结:
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(环回地址) | 提示“无监听程序” |
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文件里是否有相应的域名解析条目。
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服务在服务管理器