現在就是流行向最高水平看齊,這次項目的部署,好好的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

