最近因工作需要,需要在本机安装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服务均一切正常.