在 x64 的 Win7 上重新安裝了 Oralce 后,通過 PL/SQL 連接數據庫時,提示如下錯誤信息
環境
windows7 64bit
Oracle win64 11gR2
PL/SQL v9.0
詳細錯誤信息
- Initialization error
- Could not initialize "C:\oracle\product\11.2.0\dbhome_1\bin\oci.dll"
- Make sure you have the 32 bits Oracle Client installed.
- OCIDLL forced to C:\oracle\product\11.2.0\dbhome_1\bin\oci.dll
- LoadLibrary(C:\oracle\product\11.2.0\dbhome_1\bin\oci.dll) returned 0
問題原因
解決方案

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下是沒有配置文件的。