最近因工作需要, 需要在本机安装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" ="OraHome10"
"PATH" ="F://oracle//oracle10g"
"NLS_LANG" ="NA"
最后, 还要谈一谈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 服务均一切正常.