直接改listener.ora加多个监听块并用lsnrctl start分别启动可行,但必须确保监听名全局唯一、端口与HOST组合不冲突、ADR_BASE路径互异、Windows服务手动创建且命名规范(如OracleOraDb11g_home1TNSListener),否则将因命名冲突、端口占用或服务未注册导致启动失败或ORA-12514错误。

直接改 listener.ora 文件加多个监听块,再用 lsnrctl start 分别启动,就能跑多个监听实例——但必须注意命名冲突、端口占用和 Windows 服务注册这三处硬伤。
监听名不能重复,且必须全局唯一
Oracle 在 Windows 下把每个监听器映射为一个 Windows 服务,服务名格式是 OracleOraDb11g_home1TNSListener(11g)或类似变体。如果两个监听块都叫 LISTENER,lsnrctl start 第二次会失败,报错 failed to open service。
- 监听块名要显式定义,比如
LISTENER_A、LISTENER_B,不能只靠默认名 - 每个监听块的
ADR_BASE_必须指向不同路径,否则日志和诊断信息会混写 - 启动时必须带参数:
lsnrctl start LISTENER_A,不能省略监听名
端口、HOST 和协议组合必须互不冲突
同一台机器上,TCP 协议 + IP + 端口三元组只能被一个监听器独占。常见错误是复制粘贴后只改了监听名,忘了改 PORT 或仍写 HOST = localhost 导致绑定失败。
-
ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)和ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)是两个独立地址,可共存 - 但
HOST=localhost和HOST=127.0.0.1在 Windows 下常被解析为同一接口,容易触发端口占用 - 建议统一用具体 IP 地址(如
192.168.1.100)或明确写0.0.0.0表示监听所有接口,避免 DNS 解析歧义
tnsnames.ora 中的连接串必须匹配对应监听的服务名
客户端连哪个监听,取决于 tnsnames.ora 里 ADDRESS 指向的 HOST 和 PORT,以及 CONNECT_DATA 中的 SERVICE_NAME 或 SID 是否被该监听动态/静态注册。
让 Windows 桌面程序在开机时静默自启并隐藏到系统托盘。特别适用于 Flutter、Electron 等无视 VBS/ProcessStartInfo 窗口样式、难以隐藏的顽固应用。提供「VBS 启动器 + Python ctypes/Win32 API」的隐藏窗口方案,可稳定把窗口收进托盘且不闪控制台。
- 如果
LISTENER_A监听1521并注册了服务orcl,那tnsnames.ora里对应条目就得用(PORT=1521)+SERVICE_NAME=orcl - 若数据库没设
local_listener参数,它只会向默认监听LISTENER动态注册;多监听场景下,必须手动配置ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=...)(PORT=...))' SCOPE=BOTH; - 静态注册需在
listener.ora的SID_LIST_块中显式声明,漏写会导致lsnrctl status里看不到该实例
Windows 服务未自动创建,得手动补
用 lsnrctl start 启动的监听只是进程,不是 Windows 服务。机器重启后不会自启,且任务管理器里看不到对应服务项。
- 必须运行
ORADIM -NEW -SID创建实例服务(仅对数据库);监听服务需用-INTPWD -STARTMODE manual sc create - 例如注册
LISTENER_B:sc create OracleOraDb11g_home1TNSListenerB binPath= "D:\app\oracle\product\11.2.0\dbhome_1\BIN\tnslsnr.exe LISTENER_B" start= demand
-
binPath路径中的可执行文件名必须是tnslsnr.exe,参数必须是监听名,顺序错一个字符都会导致服务无法启动
最易被忽略的是:监听名、服务名、ADR_BASE 路径、local_listener 配置这四者必须严格一一对应,缺一不可;否则 lsnrctl status 看似正常,但客户端连上去就报 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor。










