必须隔离oracle_home、监听端口和客户端路径:10g用c:\app\oracle\product\10.2.0\db_1及端口1521,11g用c:\app\oracle\product\11.2.0\db_2及监听器listener_11g端口1522;需分别配置独立listener.ora、tnsnames.ora,设置local_listener并执行alter system register,客户端工具须手动指定对应oracle home。
可以,但必须隔离 oracle_home、监听端口和客户端路径,否则会相互覆盖或连接错乱。
每个Oracle版本必须使用独立的 ORACLE_HOME
Windows 安装程序默认会检测已存在的 ORACLE_HOME,但不会阻止你指定新路径——关键是你得手动选一个完全不同的目录,比如:
-
C:\app\oracle\product\10.2.0\db_1(10g) -
C:\app\oracle\product\11.2.0\db_2(11g)
安装时务必取消勾选“为所有用户创建快捷方式”和“配置自动启动服务”,避免注册表项冲突。安装完成后,PATH 环境变量里不要硬编码任一 ORACLE_HOME\bin,改用脚本或命令行临时设置,例如:
set ORACLE_HOME=C:\app\oracle\product\10.2.0\db_1 set PATH=%ORACLE_HOME%\bin;%PATH%
否则 sqlplus、lsnrctl 会调用错版本的二进制文件。
listener.ora 中监听器名称与端口必须全局唯一
两个版本各自有独立的 listener.ora(路径在各自 ORACLE_HOME\network\admin 下),不能共用一个文件。常见错误是只改了端口,却把两个监听器都命名为 LISTENER,导致 lsnrctl start 失败并报 TNS-12545 或 TNS-12546。
- 10g 的监听器建议保留默认名
LISTENER,端口用1521 - 11g 的监听器必须重命名,例如
LISTENER_11G,端口设为1522(避开系统保留端口,且不与已有服务冲突) - 每个监听器块要完整,包括
DESCRIPTION_LIST、ADDRESS、PROTOCOL、HOST、PORT
改完后别用 lsnrctl stop && lsnrctl start,直接运行 lsnrctl reload 让配置热生效。
数据库实例必须主动向非默认监听器注册
即使 LISTENER_11G 已 status 显示正常,Services Summary 下仍是空的——说明实例没注册过去。根本原因是 Oracle 默认只向 LOCAL_LISTENER 参数指定的监听器注册,而该参数默认只指向 LISTENER(即 1521)。
- 登录 11g 实例执行:
ALTER SYSTEM SET LOCAL_LISTENER='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1522)))' SCOPE=BOTH; - 立即强制注册:
ALTER SYSTEM REGISTER;(不等默认 60 秒间隔) - 验证是否成功:
lsnrctl status LISTENER_11G,看Services Summary是否列出你的SERVICE_NAME
查当前服务名用:SELECT value FROM v$parameter WHERE name = 'service_names';
tnsnames.ora 和客户端工具(如 PL/SQL Developer)必须显式指向目标版本
tnsnames.ora 文件也需分版本维护:10g 的客户端连 10g 实例,就用它自己的 tnsnames.ora;11g 的客户端连 11g 实例,就得用 11g ORACLE_HOME 下的 tnsnames.ora,并在其中定义对应别名,例如:
ORCL_1522 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
PL/SQL Developer 这类工具默认读取 Windows 注册表里的 ORACLE_HOME,或者环境变量。它不会自动切换。必须在工具内手动指定 Oracle Home 路径(菜单 → Tools → Preferences → Oracle → Connection → Oracle Home),否则哪怕你写了 @ORCL_1522,底层仍调用 10g 的 oci.dll,大概率报 ORA-12154 或连接超时。
最易被忽略的一点:监听器绑定的 HOST 值(比如写 localhost 还是 127.0.0.1 或真实 IP)必须和客户端 tnsnames.ora 里写的 HOST 一致,某些 Oracle 版本对这两者区分严格,不匹配就会拒绝注册或连接失败。











