ORA-12545: 因目標主機或對象不存在, 串連失敗
1. 問題描述
XP系統下同時安裝了AX1應用程式和升級版AX2,串連同一個在本機Oracle用戶端上配置的串連執行個體,其中AX2顯示連結成功,而AX1卻連結失敗,其中Oracle執行個體配置一定正確,因為AX2已經連結成功。在此之前AX2和AX1都是能串連成功的,使用者使用360殺毒後,AX1才出現問題。
2. 問題分析
通過日誌分析,發現AX1返回的錯誤資訊是“ORA-12545: 因目標主機或對象不存在, 串連失敗”。顯然這個資訊是錯誤的, Oracle錯誤的判斷了問題的原因,因為我們所配置的主機是存在的,並且在AX2上已經連結成功了。
3. 解決辦法
為避免AX1的動態庫影響,我們編寫純OCI的測試程式TestOCI.exe,這個exe只依賴Windows和OCI的動態庫,將這個測試程式分別放到AX2的Program、AX1的 Program以及案頭隨便的一個檔案夾中,結果只有AX1的Program的顯示連結失敗,其他的兩個檔案夾下的測試程式都成功了。這就證明一定是AX1的 Program下的什麼檔案影響了串連過程。
採用二分屏蔽法對AX1的Program所有檔案進行分組測試,最後測試程式TestOCI.exe與ws2_32.dll 在同一個檔案夾時,才會出現串連失敗的問題,顯然ws2_32.dll是Windows的Socket庫,這個庫出現在AX1的Program中時不正常的,所以可以斷定這個問題是由ws2_32.dll檔案引起的。
然後我們就為什麼這個庫會影響我們的測試程式進行了分析,分別在問題機器上進行測試兩組TestOCI.exe,一組是檔案夾中只有測試exe,另一組檔案夾中則包含測試exe和ws2_32.dll,分別列印這個exe啟動運行時所載入的動態庫。下面是兩組測試結果,只摘錄了部分重要訊息。
組1:檔案夾中只有TestOCI.exe
Starting Directory: G:\AAA\Program\
Search Path:
C:\Program Files\Intel\iCLS Client\;
G:\app\Administrator\product\11.2.0\client_2\bin;
C:\Program Files\AMD APP\bin\x86;
C:\WINDOWS\system32;
C:\WINDOWS;
C:\WINDOWS\System32\Wbem;
C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;
C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;
C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;
C:\Program Files\Common Files\Autodesk Shared\;
G:\AAA\program;
G:\AAA\program
Loaded "c:\windows\system32\WS2_32.DLL" at address 0x71A20000.Successfully hooked module.
組2:檔案夾中同時包含TestOCI.exe和ws2_32.dll
Starting Directory: G:\AAA\Program\
Search Path:
C:\Program Files\Intel\iCLS Client\;
G:\app\Administrator\product\11.2.0\client_2\bin;
C:\Program Files\AMD APP\bin\x86;
C:\WINDOWS\system32;
C:\WINDOWS;
C:\WINDOWS\System32\Wbem;
C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;
C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;
C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;
C:\Program Files\Common Files\Autodesk Shared\;
G:\AAA\program;
G:\AAA\program
Loaded "g:\aaa\program\WS2_32.DLL" at address 0x71A20000.Successfully hooked module.
從上面兩個測試結果我們可以看出,兩個測試程式的載入動態庫的搜尋路徑是相同的,但是載入的ws2_32.dll動態庫卻不同,運行成功是載入c:\windows\system32下面的ws2_32.dll,而運行失敗則是載入g:\aaa\program下的ws2_32.dll。g:\aaa\program\ws2_32.dll只有85K,而c:\windows\system32\WS2_32.DLL卻有291K,顯然g:\aaa\program\ws2_32.dll是一個錯誤的庫,同時Windows的Socket是一整套的,只有這一個庫被載入後,其他Socket庫沒有被載入也會出現問題。
這個問題只出現在XP中,而在Win7中卻不出現,可能的一個原因是XP和Win7搜尋路徑的優先順序別不大相同吧,或是某些東西改變了動態庫載入的環境等,但是不能確定。
4. 解決辦法
刪除AX1/Program下的ws2_32.dll,即可恢複串連Oracle資料庫。