现在就是流行向最高水平看齐,这次项目的部署,好好的SQL Server扔了(有正版授权的企业版,神啊...),逢人就夸:“俺们那上的可是最顶级的Oracle Database System!”。看了看价钱,也确实蛮顶级的,60万,吓得直接就没敢含到项目整体预算里。
可是贵的东西就好用么?未必。这个建筑在Java上,满身UNIX气息的东西,一副死板的面孔。装的时候就被叮嘱要注意,装不好LISTENER就可能起不来...还好哥们我还练过,Windows版的也没有Linux的那么陌生,折腾了几次都很正常。不过嘛,欺负新手的东西,总要给人下马威的,今天下午在上面装ArcSDE的时候,硬是连不到数据库上了,猛报错TNS:无法解析名字。
这很蹊跷,用管理页面看,监听很正常的在运行,用连接字串进行连接,也很正常登入和操作。这至少证明数据库实例和监听是有在工作的,可是究竟是什么导致无法连接呢?根据出错信息,使用tnsping尝试,发现tnsping orcl(默认启动数据库的SID)返回同样的错误。这下就把问题锁定在名解析下,Oracle网络服务的TNS名解析,一般使用LDAP或者本地的tnsnames.ora文件,由于网络中并没有配置Oracle LDAP服务,因此打开tnsnames.ora察看,里面的“ORCL=”条目并没有看出什么问题,使用Oracle的Net Manager工具,可以看到监听的配置listener.ora中和tnsnames.ora里ORCL条目的配置完全一致,主机名、端口号都没有什么异常。
这种情况下,只好反复重启服务和修改配置尝试,可并没有效果,还差点把Oracle给弄糟,有几次监听都起不来了,吓得我一头汗。绝望之中不小心将tnsping当成了普通的ping命令,键入“tnsping 主机名”,忽然间来了精神,神奇的发现返回的结果中,主机名被EZCONNECT解析为一个奇怪的IP地址。我这才发现,服务器的网络管理中有2个网卡,一个是实际网卡,IP为一般使用的正确IP,另一个是我已经离开的同事不知道因为什么装的Microsoft Loopback Adapter,配置的IP地址正是那个奇怪的IP。
立即上网查资料,发现由于Oracle必须把主机名解析为一个IP,而主机名在双网卡跨网段的情况下是工作不正常的,因为一个名不可能被解析为2个地址,就造成了监听在双网卡情况下工作不正常。我这次的情况就是双网卡网段不同造成了混乱,监听的名解析正好被绑定到了那个没有实际作用的奇怪IP上,从正常网卡进行的使用主机名的连接全部失败,而直接使用IP作为连接字段的连接却成功了。
一开始还打算通过纠正Windows的hosts文件来强制名解析回到正确的IP上,不料却又引起了EZCONNECT的混乱。吃够了教训后,将监听的配置使用IP地址重写,并同时绑定到两个网卡的IP上,然后将tnsnames.ora中条目内的主机名也改为IP地址,测试终于OK