当前位置: 代码网 > it编程>数据库>Oracle > Oracle 11g监听器配置与排错完整指南

Oracle 11g监听器配置与排错完整指南

2026年08月17日 Oracle 我要评论
从零开始,彻底搞懂 oracle 监听器的配置、启动、注册与故障排查一、什么是 oracle 监听器(listener)?监听器是 oracle 数据库的网络组件,负责接收来自客户端的连接请求,并将其

从零开始,彻底搞懂 oracle 监听器的配置、启动、注册与故障排查

一、什么是 oracle 监听器(listener)?

监听器是 oracle 数据库的网络组件,负责接收来自客户端的连接请求,并将其转发给对应的数据库实例。可以把它理解为数据库的"前台接待员"。

1.1 监听器的作用

功能说明
接收连接请求监听指定端口(默认 1521)上的客户端连接
服务注册维护数据库服务列表,告知客户端有哪些可用服务
连接转发将客户端请求转发给对应的数据库实例
负载均衡rac 环境下可做连接负载均衡

1.2 核心概念

术语说明
listener.ora监听器配置文件,定义监听地址和静态注册信息
tnsnames.ora客户端连接配置文件,定义连接别名
lsnrctl监听器控制工具,用于启动/停止/查看监听器状态
pmonoracle 后台进程,负责向监听器动态注册服务

二、监听器的工作原理

2.1 两种注册方式

注册方式触发条件监听器状态优点缺点
动态注册pmon 进程自动注册ready自动、无需配置实例启动后有延迟
静态注册listener.ora 中的 sid_listunknown立即可用、可靠性高需要手动配置

2.2 注册流程图

┌─────────────────────────────────────────────────────────────┐
│                      数据库实例启动                         │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    pmon 后台进程启动                        │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│          pmon 向监听器注册服务(动态注册)                   │
│          注册信息包含:service_name、sid、端口等            │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│              监听器收到注册信息,状态变为 ready              │
│              客户端可以连接数据库                           │
└─────────────────────────────────────────────────────────────┘

2.3 客户端连接流程

客户端 → 查询 tnsnames.ora → 获取连接参数 → 连接监听器 → 获取数据库服务信息 → 连接到数据库实例

三、监听器配置详解

3.1 listener.ora 配置文件

listener.ora 是监听器的核心配置文件,位于 $oracle_home/network/admin/ 目录下。

最简配置(仅基础监听)

listener =
  (description =
    (address = (protocol = tcp)(host = 服务器主机名)(port = 1521))
  )

完整配置(含静态注册)

# 监听器定义
listener =
  (description =
    (address = (protocol = tcp)(host = pq.rainbow)(port = 1521))
  )

# 静态注册
sid_list_listener =
  (sid_list =
    (sid_desc =
      (global_dbname = orcl)                              # 全局数据库名
      (oracle_home = /home/oracle/app/oracle/product/11.2.0/dbhome_1)  # oracle_home
      (sid_name = orcl)                                   # 实例 sid
    )
  )

3.2 配置参数详解

参数说明示例
protocol通信协议tcp
host监听地址pq.rainbow192.168.1.100
port监听端口1521(oracle 默认)
global_dbname全局数据库名客户端连接的 service_name
sid_name实例标识符orcl

3.3 多监听器配置

如果需要配置多个监听器:

# 监听器1
listener1 =
  (description =
    (address = (protocol = tcp)(host = server1)(port = 1521))
  )

# 监听器2
listener2 =
  (description =
    (address = (protocol = tcp)(host = server1)(port = 1522))
  )

sid_list_listener1 =
  (sid_list =
    (sid_desc =
      (global_dbname = orcl)
      (oracle_home = /home/oracle/app/oracle/product/11.2.0/dbhome_1)
      (sid_name = orcl)
    )
  )

sid_list_listener2 =
  (sid_list =
    (sid_desc =
      (global_dbname = orcl)
      (oracle_home = /home/oracle/app/oracle/product/11.2.0/dbhome_1)
      (sid_name = orcl)
    )
  )

3.4 tnsnames.ora 配置文件

客户端连接配置文件,用于定义连接别名。

基础配置

orcl =
  (description =
    (address = (protocol = tcp)(host = pq.rainbow)(port = 1521))
    (connect_data =
      (server = dedicated)
      (service_name = orcl)
    )
  )

多地址配置(故障转移)

orcl =
  (description =
    (address_list =
      (address = (protocol = tcp)(host = 192.168.1.10)(port = 1521))
      (address = (protocol = tcp)(host = 192.168.1.11)(port = 1521))
    )
    (connect_data =
      (service_name = orcl)
    )
  )

四、监听器管理命令

4.1 lsnrctl 常用命令

命令说明
lsnrctl start启动监听器
lsnrctl stop停止监听器
lsnrctl status查看监听器状态
lsnrctl services查看监听器提供的服务详情
lsnrctl reload重新加载配置文件(无需重启)
lsnrctl version查看监听器版本

4.2 常见操作示例

启动监听器

$ lsnrctl start

lsnrctl for linux: version 11.2.0.1.0 - production on 14-aug-2026 10:58:43

starting /home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/tnslsnr: please wait...

tnslsnr for linux: version 11.2.0.1.0 - production
system parameter file is /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
listening on: (description=(address=(protocol=tcp)(host=pq.rainbow)(port=1521)))

services summary...
service "orcl" has 1 instance(s).
  instance "orcl", status unknown, has 1 handler(s) for this service...
the command completed successfully

查看监听器状态

$ lsnrctl status

lsnrctl for linux: version 11.2.0.1.0 - production on 14-aug-2026 10:55:08

status of the listener
------------------------
alias                     listener
version                   tnslsnr for linux: version 11.2.0.1.0 - production
start date                14-aug-2026 10:54:35
uptime                    0 days 0 hr. 0 min. 39 sec
trace level               off
security                  on: local os authentication
listener log file         /home/oracle/app/oracle/diag/tnslsnr/pq/listener/alert/log.xml
listening endpoints summary...
  (description=(address=(protocol=tcp)(host=pq.rainbow)(port=1521)))
services summary...
service "orcl" has 1 instance(s).
  instance "orcl", status ready, has 1 handler(s) for this service...
the command completed successfully

停止监听器

$ lsnrctl stop
connecting to (description=(address=(protocol=tcp)(host=pq.rainbow)(port=1521)))
the command completed successfully

五、常见问题与排错

5.1 问题一:监听器启动但无服务注册

现象

$ lsnrctl status
...
listening endpoints summary...
  (description=(address=(protocol=tcp)(host=pq.rainbow)(port=1521)))
the listener supports no services

原因分析

可能原因说明
数据库未启动实例没有运行
动态注册失败pmon 未注册或注册延迟
listener.ora 未配置静态注册缺少 sid_list_listener
local_listener 参数未设置指向不正确

解决方案

方案一:静态注册(最可靠)

修改 listener.ora,添加静态注册配置:

sid_list_listener =
  (sid_list =
    (sid_desc =
      (global_dbname = orcl)
      (oracle_home = /home/oracle/app/oracle/product/11.2.0/dbhome_1)
      (sid_name = orcl)
    )
  )

重启监听器:

lsnrctl stop
lsnrctl start

方案二:动态注册

sqlplus / as sysdba
alter system register;

方案三:设置 local_listener

sqlplus / as sysdba
alter system set local_listener='(address=(protocol=tcp)(host=pq.rainbow)(port=1521))' scope=both;
alter system register;

状态说明

监听器状态含义说明
unknown静态注册配置来自 listener.ora,不依赖数据库状态
ready动态注册pmon 进程已注册,数据库可连接
blocked阻塞状态监听器拒绝新连接

5.2 问题二:ora-12541 tns:no listener

现象

ora-12541: tns:no listener

原因

  • 监听器未启动
  • 防火墙阻止了 1521 端口
  • 配置文件错误导致监听器启动失败

解决方案

  1. 启动监听器:
lsnrctl start
  1. 检查防火墙:
# 查看防火墙状态
systemctl status firewalld

# 开放 1521 端口
firewall-cmd --permanent --add-port=1521/tcp
firewall-cmd --reload
  1. 检查 listener.ora 语法是否正确。

5.3 问题三:ora-12154 tns:could not resolve the connect identifier

现象

ora-12154: tns:could not resolve the connect identifier specified

原因

  • tnsnames.ora 中未配置对应的连接别名
  • tns_admin 环境变量未指向正确目录
  • 连接字符串书写错误

解决方案

  1. 检查 tnsnames.ora 是否存在且配置正确:
cat $oracle_home/network/admin/tnsnames.ora
  1. 设置 tns_admin 环境变量:
export tns_admin=$oracle_home/network/admin
  1. 测试连接别名:
tnsping orcl
  1. 使用 ezconnect 格式(无需 tnsnames.ora):
sqlplus system/password@//hostname:1521/orcl

5.4 问题四:监听器启动失败

现象

tns-12545: connect failed because target host or object does not exist

原因

  • listener.orahost 配置错误(使用了不存在的 ip 或主机名)
  • dns 解析失败

解决方案

  1. 使用 localhost127.0.0.1 测试:
host = localhost
  1. 使用实际 ip 地址:
host = 192.168.1.100
  1. 检查主机名解析:
ping $(hostname)

5.5 问题五:无法从外部连接数据库

现象

本地连接正常,远程客户端连接失败。

原因

  • listener.ora 中的 host 设置为 localhost127.0.0.1
  • 防火墙未开放 1521 端口
  • 数据库未向监听器注册

解决方案

检查项命令正确值
监听地址lsnrctl status显示真实 ip,不是 127.0.0.1
防火墙firewall-cmd --list-ports1521/tcp 已开放
服务注册lsnrctl status显示 orcl 服务

5.6 问题六:impdp/expdp 无法连接

现象

udi-12154: operation generated oracle error 12154
ora-12154: tns:could not resolve the connect identifier specified

解决方案

方案一:使用本地连接(推荐)

impdp system/password directory=data_pump_dir dumpfile=xxx.dmp

方案二:检查 tns 配置

tnsping orcl

方案三:使用 ezconnect

impdp system/password@//localhost:1521/orcl directory=data_pump_dir dumpfile=xxx.dmp

六、最佳实践

6.1 配置建议

项目建议
host 配置使用主机名或固定 ip,避免使用 localhost
静态注册建议配置,提高可靠性
日志管理定期清理监听日志,防止磁盘满
端口安全使用非默认端口,配置防火墙
日志监控监控 alert/log.xml,及时发现异常

6.2 推荐配置模板

listener.ora

# 监听器配置
listener =
  (description =
    (address = (protocol = tcp)(host = 服务器主机名)(port = 1521))
  )

# 静态注册
sid_list_listener =
  (sid_list =
    (sid_desc =
      (global_dbname = orcl)
      (oracle_home = /home/oracle/app/oracle/product/11.2.0/dbhome_1)
      (sid_name = orcl)
    )
  )

tnsnames.ora

# 连接别名配置
orcl =
  (description =
    (address = (protocol = tcp)(host = 服务器ip)(port = 1521))
    (connect_data =
      (server = dedicated)
      (service_name = orcl)
    )
  )

6.3 排错流程

1. 检查监听器是否运行
   ↓
   lsnrctl status

2. 检查服务是否注册
   ↓
   lsnrctl services

3. 检查配置文件
   ↓
   cat $oracle_home/network/admin/listener.ora

4. 检查数据库状态
   ↓
   sqlplus / as sysdba
   select status from v$instance;

5. 手动注册(如需要)
   ↓
   alter system register;

6. 检查防火墙和网络
   ↓
   firewall-cmd --list-ports
   ping 服务器ip

7. 检查日志
   ↓
   cat $oracle_home/network/log/listener.log

七、总结

7.1 关键要点

host 配置:监听器和 tnsnames 中的 host 必须使用真实 ip 或可解析的主机名,避免使用 localhost 导致外部无法连接。

静态注册:在 listener.ora 中配置 sid_list,确保监听器稳定可靠,不依赖数据库动态注册。

动态注册:pmon 进程默认 60 秒注册一次,可通过 alter system register 立即触发。

配置文件位置

  • 监听器配置:$oracle_home/network/admin/listener.ora
  • 客户端配置:$oracle_home/network/admin/tnsnames.ora

状态含义

  • unknown → 静态注册
  • ready → 动态注册成功
  • blocked → 阻塞状态,需排查

7.2 常用命令速查

命令用途
lsnrctl start启动监听器
lsnrctl stop停止监听器
lsnrctl status查看状态
lsnrctl services查看服务详情
lsnrctl reload重载配置
tnsping测试 tns 连接
alter system register手动注册服务

本文由实际排错经验整理而成,欢迎交流指正。

以上就是oracle 11g监听器配置与排错完整指南的详细内容,更多关于oracle 11g监听器配置与排错的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com