Oracle监听器(TNS Listener)不在云端,也不在应用服务器上,它默认就运行在数据库服务器本机,是一个名为tnslsnr的后台进程,监听1521端口,负责把客户端连接请求转交给数据库实例。换句话说,你问“监听是哪个服务器”,答案通常是“数据库自己那台机器”,而不是某个单独部署的中间层。
监听器到底“住”在哪台机器上
默认位置:数据库服务器本机
安装Oracle数据库软件时,安装程序会在数据库服务器上自动创建监听器,相关配置落在$ORACLE_HOME/network/admin/listener.ora,运行时对应一个tnslsnr进程,属主一般是oracle用户,默认监听名是LISTENER,默认端口1521。
几个可以直接验证的特征:
- 进程层面:
ps -ef | grep tnslsnr能看到类似/u01/app/oracle/product/19c/dbhome_1/bin/tnslsnr LISTENER -inherit的进程。 - 端口层面:
netstat -tlnp | grep 1521或ss -tlnp | grep 1521能看到该进程占用1521。 - 配置层面:
listener.ora里的ADDRESS = (PROTOCOL = TCP)(HOST = 数据库主机名或IP)(PORT = 1521)。
一台数据库服务器上可以同时存在多个监听器,比如LISTENER和LISTENER2,分别服务不同实例或不同网卡,名字只是标识,物理上都在同一台机器的操作系统里跑着。
什么情况下监听不在数据库服务器上
绝大多数生产环境中监听器与数据库实例同机部署,但也有例外:
- RAC集群:每个节点都有自己的本地监听,另外还有运行在SCAN VIP上的SCAN监听,客户端连的是SCAN地址。
- 监听与实例分离部署:少数架构会把监听器单独起在一台机器上,通过
listener.ora配置远程注册或静态注册,指向另一台数据库主机,这种做法配置复杂、排障成本高,实际使用并不多。 - 容器化部署:监听器跑在数据库容器内,对外通过端口映射暴露,逻辑上仍属于数据库容器。
行业共识认为,把监听器和数据库实例放在同一台物理机或同一容器内,是最省事、最容易定位问题的做法。
oracle监听在数据库服务器上还是应用服务器上
这是运维新手最常纠结的问题,把两边职责分清楚就明白了:
| 角色 | 装的是什么 | 干什么活 |
|---|---|---|
| 数据库服务器 | tnslsnr监听进程、数据库实例 |
接收连接、转交实例 |
| 应用服务器 | Oracle客户端或Instant Client、tnsnames.ora |
发起连接、拼连接串 |
应用服务器上一般只有客户端软件,它通过tnsnames.ora或EZConnect字符串写明“去哪个IP的哪个端口找监听”,它自己不会启动监听进程,所以当你发现应用连不上数据库,第一步不是去应用服务器上找监听,而是先确认数据库服务器上的tnslsnr是否活着。
快速判断命令就一条:
ps -ef | grep tnslsnr | grep -v grep
有输出,说明这台机器上至少有一个监听器在跑;没输出,换到数据库服务器上再查一遍。
怎么查看oracle监听所在服务器
用lsnrctl直接问监听器
在数据库服务器上执行:
lsnrctl status
输出中的Listening Endpoints Summary会列出监听的协议、主机和端口,
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db01)(PORT=1521)))
这里显示的HOST就是监听器绑定的主机名或IP,想确认当前使用的是哪个监听名,可以执行lsnrctl show current_listener。
从进程和端口反查
拿到一台不确定用途的服务器,可以用两条命令交叉验证:
ps -ef | grep tnslsnr netstat -tlnp | grep 1521
Windows服务器上对应的是:
tasklist | findstr tnslsnr netstat -ano | findstr 1521
端口被改过的情况也常见,这时不要死盯1521,先用ps -ef找到tnslsnr进程,再根据进程PID反查端口。
从监听日志确认主机信息
监听日志默认路径在:
$ORACLE_BASE/diag/tnslsnr/<主机名>/listener/trace/listener.log
日志开头会记录监听器启动时间和绑定地址,连接高峰时日志增长很快,排查“连接从哪来”也靠它。
客户端连的到底是哪台服务器
很多人把“监听所在服务器”和“客户端连接目标”混为一谈,实际决定连接去向的是客户端连接串里的HOST字段。
打开应用服务器上的tnsnames.ora,会看到类似:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.1.20)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
这里的10.1.20就是监听器所在服务器,用tnsping ORCL可以测试该地址的监听是否可达,但要注意:tnsping通只能说明监听器活着,不能说明数据库实例正常,实例是否注册还要看lsnrctl status里的Service Summary。
不想维护tnsnames.ora时,可以用EZConnect写法直接连:
sqlplus user/password@10.10.1.20:1521/orcl
这行命令把“监听在哪台服务器”写得明明白白。
RAC环境oracle监听分布在哪些服务器
RAC是监听问题的高发区,它的结构和单实例不一样:
- 每个RAC节点上各有一个本地监听,通常叫
LISTENER,绑定该节点的VIP。 - 另有一组SCAN监听,运行在SCAN VIP上,据Oracle官方文档建议,SCAN通常配置三个IP,由DNS轮询或
/etc/hosts解析。 - 客户端连接串里写的是SCAN地址,而不是某个节点的物理IP。
查看各节点监听状态的命令:
srvctl status listener srvctl config listener lsnrctl status LISTENER
客户端连SCAN时,SCAN监听根据负载把连接分发给某个节点的本地监听,再由本地监听转交给实例,所以问“RAC的监听在哪台服务器”,准确回答是:每个节点都有,SCAN监听分布在SCAN VIP所在的主机上。
几个容易踩的误区
- 监听器不解析SQL,它只负责握个手、把连接交给实例,SQL执行慢和监听基本无关。
- 改完listener.ora不必重启数据库,执行
lsnrctl reload即可让监听重新读取配置,重启数据库属于过度操作。 - 监听正常不等于数据库正常。
lsnrctl status能看到服务名,才说明实例向监听注册成功;如果只看到监听端点没有服务,问题多半在实例侧。 - 端口冲突会直接导致监听起不来,同一台机器上两个监听配了同一个端口,第二个必然报错,日志里会写
TNS-12542一类的地址占用错误。 - 多实例可以共用一个监听,一个监听器同时为多个实例提供服务是常规做法,通过
SERVICE_NAME区分即可。
收束
Oracle监听器本质上是数据库服务器上的一个连接转交进程,问“它在哪个服务器”,先看数据库装在哪台机器,答案基本就在那里,应用服务器只负责发起连接,客户端连接串里的HOST才是最终指路牌。
Q&A:oracle监听是哪个服务器的常见追问
oracle监听和数据库实例必须在一台机器上吗
不必须,但强烈建议同机,分离部署需要手工配置静态注册或远程注册,网络抖动、防火墙策略变更都会让排障链路变长,除非有明确的架构约束,否则保持同机部署。
怎么判断连不上是监听问题还是实例问题
先执行tnsping 连接串,不通,说明网络或监听器本身有问题,去数据库服务器查tnslsnr进程和端口,通了但仍然连不上,再看lsnrctl status里有没有对应的服务名;没有服务名,说明实例没向监听注册,此时应检查实例状态和local_listener参数。
oracle监听端口可以改吗
可以,修改listener.ora里的PORT值,执行lsnrctl reload,同时更新客户端连接串和服务端的local_listener参数,改端口不是高频操作,除非有安全合规要求或端口冲突,一般保持1521即可。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/928369.html


评论列表(1条)
读了这篇文章,我深有感触。作者对监听的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!