Oracle 19c监听器默认仅绑定localhost,多网卡服务器必须在listener.ora中将ADDRESS的HOST显式设为业务IP(如203.101.55.82),不可用localhost或127.0.0.1;修改后需执行lsnrctl reload,并同步配置安全组放行对应端口及tnsnames.ora中的HOST值。

Oracle 19c 监听器默认只绑 localhost 或第一个网卡,多网卡服务器上不显式指定 HOST,客户端从其他网段连就会报 ORA-12170: TNS:Connect timeout occurred——不是数据库没起来,是监听根本没在那个 IP 上听。
listener.ora 的 ADDRESS 中 HOST 必须写具体 IP,不能写 localhost
监听器配置文件 $ORACLE_HOME/network/admin/listener.ora 里,ADDRESS 段的 HOST 值决定它监听哪个网卡。写 localhost 或 127.0.0.1 就只监听回环;写 0.0.0.0 虽能通吃所有网卡,但云环境或安全策略常禁止这种宽松绑定。
- 正确做法:填业务网段对应的实际 IP,比如公网 IP
203.101.55.82或内网 IP192.168.10.5 - 错误写法:
(HOST = localhost)、(HOST = 127.0.0.1)、(HOST = node1)(除非 /etc/hosts 明确解析且稳定) - 改完必须执行
lsnrctl reload,不是stop/start,也不是只重启数据库实例
多个网卡需多个监听器?通常不需要,但得确认端口不冲突
单个监听器可监听多个 IP,只要它们都归属同一台物理机,且端口未被占用。Oracle 不强制“一网卡一监听”,反而多监听器会增加管理负担和端口冲突风险。
- 一个监听器支持多个
ADDRESS,例如同时监听内网192.168.10.5和管理网10.10.20.5,只要两个 IP 都属于本机 - 检查是否冲突:用
netstat -tlnp | grep :1521看端口是否已被其他进程(如另一个 Oracle 实例、PostgreSQL)占住 - 若真要分离流量(如私网跑 ASM、公网跑应用),才考虑配第二个监听器,名字不能叫
LISTENER,得另起名如ASM_LISTENER,并确保PORT不同(如1522)
tnsnames.ora 的 HOST 必须和实际访问路径一致
客户端连接串里的 HOST 值,必须和你让监听器绑定的那个 IP 对得上。否则即使监听器起来了、安全组也放行了,连接仍会失败。
- 你用公网 IP 连:tnsnames.ora 里
HOST = 203.101.55.82,listener.ora 里也得是HOST = 203.101.55.82 - 你用内网 DNS 名连:比如
HOST = db-prod-01.internal,那该域名必须解析到监听器实际绑定的那个 IP,且不能是127.0.0.1 - RAC 场景下更关键:SCAN IP 是虚拟入口,但监听器实际运行在物理节点上,所以每个节点的
listener.ora的HOST应填该节点的 public IP,而不是 SCAN IP
云服务器上,安全组规则比本地防火墙更优先
即使 listener.ora 绑对了 IP、tnsnames.ora 写对了 HOST,云服务器上没开安全组,照样连不上。本地 firewalld 或 iptables 在多数云平台里是无效的——流量根本没走到那层就被拦截了。
- 必须去云厂商控制台(阿里云/腾讯云/AWS)配“安全组入站规则”,协议选
TCP,端口填监听器实际用的端口(默认1521) - 源地址别无脑填
0.0.0.0/0,按最小权限原则限制为业务服务器所在网段,比如192.168.100.0/24 - 若监听器改用了非默认端口(如
1522),安全组规则、listener.ora的PORT、客户端连接串里的端口三者必须严格一致
最容易被忽略的是:监听器绑定的 IP 和客户端发起连接时使用的 IP 不一致。很多人查了一小时网络、重装两次监听器,最后发现只是 tnsnames.ora 里写的是 HOST = db01,而 db01 解析到了 127.0.0.1 ——这个环在 /etc/hosts 里悄悄闭环了,但外部根本进不来。


















