最近因工作需要,需要在本機安裝Oracle10g,之前本機已經安裝了一個Oracle9i,後來在安裝完Oracle10g之後,發現Home Selector中還是只有一個Home,報告的錯誤是:"there is only one(1) oracle home defined on this machine...",因為當時10g和9i沒有裝在同一個目錄中,所以以為是目錄問題,然後把10g卸載了,重新安裝後還是存在這個問題,這個時候,靈機一動,原來有一台伺服器上安裝了一個Oracle9i和Oracle form,但是伺服器上的Home Selector中是可以在Oracle9i和Oracle form之間切換的,於是把註冊表開啟,研究了一下,驚喜的發現:
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/ALL_HOMES/下面有一個ID0,裡麵包含三個索引值:NAME,PATH,NLS_LANG,於是在本機註冊表中建立了一個ID1,把ID0裡面的三個索引值如法炮製,其中的PATH指向10g的安裝目錄,然後再啟動Home Selector,問題解決了.
修改後的註冊表內容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/ALL_HOMES]
"HOME_COUNTER"="1"
"DEFAULT_HOME"="OraHome92"
"LAST_HOME"="0"
[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/ALL_HOMES/ID0]
"NAME"="OraHome92"
"PATH"="D://oracle//ora92"
"NLS_LANG"="NA"
[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/ALL_HOMES/ID1]
"NAME"=hex(7):4f,00,72,00,61,00,48,00,6f,00,6d,00,65,00,31,00,30,00,67,00,00,/
00,00,00
"PATH"=hex(7):44,00,3a,00,5c,00,6f,00,72,00,61,00,63,00,6c,00,65,00,5c,00,70,/
00,72,00,6f,00,64,00,75,00,63,00,74,00,5c,00,31,00,30,00,2e,00,32,00,2e,00,/
30,00,5c,00,64,00,62,00,5f,00,31,00,00,00,00,00
"NLS_LANG"=hex(7):4e,00,41,00,00,00,00,00
最後,還要談一談listener配置和tnsnames配置的問題:
因為Oracle預設連接埠為1521,原生1521已被Oracle9i的listener 佔據,所以,最終把Oracle10g的listener 連接埠號碼設定成了另外一個連接埠1522,請注意,在使用10g的Net Configuration Assistant進行listener配置 時,一定不要修改listener 的任何預設設定:名稱(LISTENER)或連接埠號碼(1521)(因為如果修改了預設名稱或者連接埠號碼會造成在Windows服務管理員中找不到10g的listener 服務的問題),配置完成後,Oracle應用程式會自動將9i的listener 停止,因為其連接埠1521與當前的10g的listener 衝突了,請保持鎮定,先在Windows服務管理員中手動停止10g的listener 服務(本機名稱為OracleOraDb10g_home1TNSListener),然後進入D:/oracle/product/10.2.0/db_1/NETWORK/ADMIN(本機安裝目錄),在文字編輯器中修改listener.ora中LISTENER的連接埠號碼為1522,儲存listener.ora檔案,最後,在Windows服務管理員中分別手動啟動9i和10g的listener 服務(本機名稱分別為OracleOraHome92TNSListener和OracleOraDb10g_home1TNSListener),如你所願,兩個listener 服務都會成功啟動.
剩下的就是本地Net服務名的配置了,也就是tnsnames的配置,配置過程與9i相同,唯一需要注意的就是把連接埠號碼修改為1522即可.
在本機調試的時候,可以依據需要利用Home Selector在9i和10g之間自由切換,同時,其他機器請求原生10g和9i服務均一切正常.