怎样在Linux系统下配置Oracle的多监听器环境

雨静同学_4536

雨静同学_4536

2026-09-23

450人浏览

原创

多个监听器必须使用不同端口或不同ip,仅改名称无效;实例需通过local_listener参数向各监听器动态注册,且注册地址须为客户端可达的业务ip,否则出现“监听器运行但服务不可见”。

怎样在linux系统下配置oracle的多监听器环境

多个监听器必须用不同端口或不同IP,不能只改名字

监听器名称(如 LISTENERLISTENER2)只是配置标识,真正起作用的是 ADDRESS 中的 PORTHOST。如果两个监听器都写 (PORT = 1521) 且绑定到同一 IP,启动时第二个会报 TNS-01106: Listener using listener name LISTENER2 has already been started 或直接失败。

常见错误现象:修改了 listener.ora 加了 LISTENER2lsnrctl start LISTENER2 成功,但 lsnrctl status LISTENER2 显示 “The listener supports no services”——本质是没注册上,不是监听器没起来。

  • 端口必须不冲突:比如 LISTENER1521LISTENER2 就得用 15222000 等未被占用端口
  • IP 绑定要明确:避免用 HOST = localhost 或主机名,优先写具体 IP(如 192.168.10.100),否则可能绑到 127.0.0.1 导致外部连不上
  • 每个监听器需独立 DESCRIPTION_LIST 块,不能共用一个 LISTENER = ... 定义

单实例想被多个监听器服务,必须用 dynamic registration + local_listener

静态注册(SID_LIST_LISTENERx)只能让一个监听器“知道”这个实例;若希望同一个实例(如 orcl)同时响应 15211522 两个端口的连接请求,必须靠 PMON 动态注册,且显式指定注册目标。

关键点在于数据库实例要知道“往哪几个地址上报自己”。这由 local_listener 参数控制,它指向 tnsnames.ora 中的一个网络别名(或内联描述),该别名必须包含所有目标监听器的 ADDRESS

linux-performance-analyzer
linux-performance-analyzer

Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。

下载
  • $ORACLE_HOME/network/admin/tnsnames.ora 中定义一个别名,例如:
    ALL_LSNR = (DESCRIPTION_LIST =<br>  (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.100)(PORT = 1521)))<br>  (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.100)(PORT = 1522)))<br>)
  • 在 SQL*Plus 中执行:
    ALTER SYSTEM SET local_listener='ALL_LSNR' SCOPE=BOTH;
    ALTER SYSTEM REGISTER;
  • 验证:运行 lsnrctl services LISTENERlsnrctl services LISTENER2,两者都应列出 orcl 实例的 READY 状态条目

tnsnames.ora 客户端连接串必须匹配监听器实际绑定的 IP 和端口

客户端能否连上,不取决于监听器叫什么,而取决于 tnsnames.ora 里写的 HOSTPORT 是否可达、是否和监听器实际监听的地址一致。

典型翻车场景:服务器上 LISTENER2 绑定在 192.168.10.100:1522,但客户端 tnsnames.ora 写的是 HOST = db-server,而该主机名在客户端 /etc/hosts 解析为 10.0.2.15(VirtualBox 默认网卡)——结果 tnsping 通但 sqlplusORA-12541: TNS:no listener

  • 最稳妥做法:客户端 tnsnames.oraHOST 直接写监听器实际绑定的 IP(如 192.168.10.100),不写主机名
  • 如果必须用主机名,确保客户端 /etc/hosts 中该主机名**只映射一个 IP**,且是监听器所绑定的那个业务 IP
  • 检查防火墙:iptables -L -n | grep 1522firewall-cmd --list-ports,确认新端口已放行

LOCAL_LISTENER 参数设错会导致服务“存在但不可见”

即使监听器进程跑着、端口也开着,只要数据库实例没成功注册进监听器的服务列表,客户端就查不到服务名,lsnrctl services 里看不到 INSTANCE_NAME 条目,这是最常见的“监听器配了但连不上”的原因。

LOCAL_LISTENER 必须指向一个客户端能访问的地址——不是数据库服务器本地的 127.0.0.1,也不是仅内网可达的私有 IP,而是客户端网络能路由到的那个 IP(通常是业务网卡 IP 或 VIP)。

  • 错误示例:ALTER SYSTEM SET local_listener='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1522)))'; → 注册到了回环地址,外部连不上
  • 正确做法:用 ip addr show 查出业务网卡 IP(如 ens192: <...> inet 192.168.10.100/24</...>),然后设为该 IP
  • 设完立即执行 ALTER SYSTEM REGISTER;,不要等 PMON 默认 60 秒周期
  • 验证注册是否生效:lsnrctl services LISTENER2 输出中要有类似 Service "orcl" has 1 instance(s). Instance "orcl", status READY
配置多监听器真正的复杂点不在 listener.ora 写几段,而在于每个监听器背后对应的网络可达性、实例注册路径、以及客户端解析链路是否闭环——漏掉任意一环,就会出现“监听器状态正常,但死活连不上”的静默故障。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

oracle linux linux系统

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3723

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

791

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

949

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5501

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2483

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5500

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7141

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

970

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

852

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程