ORA-12545: 因目標主機或對象不存在, 串連失敗

來源:互聯網
上載者:User

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資料庫。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.