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數據庫。
版權所有,轉載請注明出處。