x64 PL/SQL 連接 Oralce 提示 Could not initialize oci.dll


在 x64 的 Win7 上重新安裝了 Oralce 后,通過 PL/SQL 連接數據庫時,提示如下錯誤信息

環境

windows7 64bit

Oracle win64 11gR2

PL/SQL v9.0

詳細錯誤信息

[plain]  view plain copy
 
 
  1. Initialization error  
  2. Could not initialize "C:\oracle\product\11.2.0\dbhome_1\bin\oci.dll"  
  3. Make sure you have the 32 bits Oracle Client installed.  
  4.   
  5. OCIDLL forced to C:\oracle\product\11.2.0\dbhome_1\bin\oci.dll  
  6. LoadLibrary(C:\oracle\product\11.2.0\dbhome_1\bin\oci.dll) returned 0  

問題原因

安裝完后Oracle的 oci.dll 是64位的,而32位應用程序 PLSQL Developer 無法加載。

解決方案

1. 從  http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 下載Oracle Client Package。 我下載的是Instant Client for Microsoft Windows (32-bit) 【instantclient-basic-nt-11.2.0.2.0.zip】 
2. 將 instantclient-basic-nt-11.2.0.2.0.zip 解壓至 c:\oracle, oci.dll 所在目錄為:c:\oracle\instantclient_11_2\
3. 設置環境變量
    TNS_ADMIN=c:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN
    NLS_LANG=AMERICAN_AMERICA.ZHS16GBK ( 注:NLS_LANG前半部分必須是AMERICAN_AMERICA,因為instant client不支持其他語言;而后半部分可以根據你數據庫的字符集調整,如果數據庫采用AL32UTF8,則可以設置AL32UTF8
4. 啟動PL/SQL Developer ,點擊“取消”不要登錄,菜單 --> Tools --> Perferences --> Connection 修改 Oracle_Home 和 OCI Library 的配置:     OracleHome: OraDb11g_home1     OCI library: C:\oracle\instantclient_11_2\oci.dll
5. 重新啟動 PL/SQL並登錄對應的數據庫,連接正常,問題成功解決!
 
----------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------

此問題搞了我好久,為了加深理解,還可以參考下面這片文章:

1、安裝了oracle11gR2的64位服務器版本並手工創建了實例及數據庫,創建了監聽。而且自帶的slq-plus能登陸(就用本機),說明服務器端的監聽等網絡配置應該沒問題。 

因為plsql是32位的,是9.0版中文的。也是不能加載64位的oci.dll(oracle的文件),需按網上的方法,下載instantclient-basic-win32-11.2.0.1.zip.或者,直接安裝官網下載的32位客戶端11gR1版本,win32_11gR1_client_32bit.zip,安裝時,只選擇安裝instantclient(150多m大小),,,比如,安裝路徑位D:\app\dsd\win32\product\11.1.0\client_1

備注:客戶端的連接配置文件tnsnames.ora及oci.dll就在D:\app\dsd\win32\product\11.1.0\client_1下 

 

2、這步其實可以不做:plsql的選項-oracle連接中,要選擇32位oracle客戶端的主目錄,(就是安裝oracle時的主目錄,如D:\app\dsd\win32\product\11.1.0\client_1”。)和oci庫(oci.dll,是oracle的一個調用接口)的路徑,如::\app\dsd\win32\product\11.1.0\client_1\oci.dll

 

3、環境變量中的系統變量,也按網上方法改了下:確保path變量,含有D:\app\dsd\win32\product\11.1.0\client_1   ,這個path變量可以不加入oracle的32位客戶端安裝路徑,且這變量已經自動含有了oracle的32位的客戶端路徑及64位的服務器安裝路徑。(因為本機先裝了服務器版本,又裝了客戶端版本)新建“TNS_ADMIN”變量,值為:D:\app\dsd\win32\product\11.1.0\client_1   ,這個變量必須建,否則仍然plsql仍然連不上,報同樣錯誤。 

新建“NLS_LANG”變量,值為:SIMPLIFIED CHINESE_CHINA.ZHS16GBK   ,這個變量建立了,能把plsql登陸時報的英文錯誤變成了中文錯誤。zhs16gbk其實就是當oracle11g裝好后,手工創建數據庫時默認的數據字符集。但此時,仍然是報錯“ORA-12154: TNS: 無法解析指定的連接標識符”,本機的sqlplus能登陸,懷疑是oracle客戶端的tnsnames.ora有問題,

 

然后,看下服務器中的監聽配置文件listener.ora中的連接串:

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = dsd-PC5)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )

發現host是計算機名,如上,是dsd-pc5,那么,客戶機的oracle的client安裝路徑內的配置文件tnsnames.ora中的連接串中的host成服務器主機名(原來是127.0.0.1),如下:

 

DSD =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = dsd-PC5)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = lmsdsd)

 

再用plsql登陸,成功。。。

 

而且很奇怪,此時,再把tnsnames.ora中的host名改成127.0.0.1,plsql也能正常連接了。。 

 

-------------------------------------------------------------------------

 

關鍵小結:問題的關鍵在於TNS_ADMIN變量,它的路徑是哪個,就會導致開始菜單中的oracle下的Net Manager(本來是服務器端帶的,instantclient客戶端不帶這個)指向哪個,對應修改的就是那個路徑下的配置文件tnsnames.ora和listener.ora(監聽配置文件)(客戶端不需要監聽),而且,也會導致plsql調用的oci.dll,tnsnames.ora就是那個路徑下的。

而且,plsql登陸時,輸入的數據庫名,其實是網絡服務名,即Net Manager配置的網絡名(tnsnames.ora中連接串的第一行)。

或者說,在客戶端,無Net Manager工具也不影響?關鍵是tns_admin變量值要指定32位的oracle客戶端,還有就是tnsnames.ora中連接串參數要對。當然,前提是服務器端的端口已經監聽,即服務器上的listener.ora內容要對。

 

備注:Net Configuration Assistant實際就是帶向導模式的Net Manager,也是受tns_admin變量決定其修改哪個路徑下的tnsnames.ora和listener.ora

 

Net Configuration Assistant中的“監聽程序配置”,影響listener.ora文件和創建監聽服務,其“本地網絡服務名配置”,影響tnsnames.ora,其實,數據庫服務器上不用配置“本地網絡服務名配置”,除非你要在服務器本機上用plsql,但直接改服務器上的tnsnames.ora更方便?而且,前面已經說明,64位的服務器上必須裝32位的oracle客戶端,32位的plsq才能用(還得改tns_admin變量)

 

注意oracle服務端有個監聽服務,在操作系統的服務管理中能看到。。如果監聽服務被停,本機上用plsq,會提示無監聽,網絡上其他機子用plsql,會提示連接超時。服務器的監聽服務是要添加一個監聽后才有(安裝好oracle11g服務器時沒有監聽服務),即Net Configuration Assistant進行添加一次監聽即可(網絡服務名無需添加)添加監聽服務后,E:\app\dsd64\product\11.2.0\dbhome_1\NETWORK\ADMIN下仍然未生成listener.ora配置文件?生在了D:\app\dsd\win32\product\11.1.0\client_1下,因為tns_admin變量決定的,tns_admin變量路徑下的listener.ora如果被刪,會導致監聽服務停止后,無法啟動,報啟動后停止。

 

tnsnames.ora中如果有多個相同的連接字符串,plsql啟動時,可選的網絡服務名就有多個。plsql調用的其實就是tns_admin變量指定路徑下的tnsnames.ora和oci.dll

 

 

比如tnsnames.ora中有如下2個連接串,plsql登陸時,就會有dsd1和dsd2這兩個網絡服務名可選。

 

DSD1 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = dsd-PC5)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = lmsdsd)

 

DSD2 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = dsd-PC5)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = lmsdsd)

 

用虛擬機-32位xp證明,只需裝oracle客戶端11g的instantclient組件,然后設置tns_admin變量即可,plsql就能讀取tnsnames.ora和調用oci.dll

 

 

在DBCA 建庫(手工建庫向導時),有提示讓我們選擇連接類型,這里有兩種類型:Dedicated server 和 Shared server(專用模式 和 共享模式) ,

在tnsnames.ora中的連接串中,如果聲明了(SERVER = DEDICATED),則連接服務器時就是專用模式(獨占模式)

如連接串中還有(LOAD_BALANCE = yes),即負載平衡,則很可能使用了rac:  Oracle RAC 集群示意圖,RAC,全稱real application clusters,譯為“實時應用集群”

在安裝oracle的數據庫管理系統服務器版時,會提示是安裝“單實例”還是rac:real application clusters

 

oracle基目錄,比如:e:\app\dsd64  所有oracle產品的目錄

oracle主目錄,比如:e:\app\dsd64\product\11.2.0\dbhome_1  指oracle軟件文件的位置

 

經試驗,僅安裝oracle的數據庫管理系統服務器版,安裝時,選只安裝數據庫軟件,安裝成功后,是沒有監聽服務的。(操作系統的服務列表中。)

服務器沒配置監聽時,E:\app\dsd64\product\11.2.0\dbhome_1\NETWORK\ADMIN下是沒有配置文件的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM