oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > Oracle 11g监听器配置与排错

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

作者:梓沂

监听器是 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.rainbow 或 192.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

原因

解决方案

  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

原因

解决方案

  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

原因

解决方案

  1. 使用 localhost 或 127.0.0.1 测试:
HOST = localhost
  1. 使用实际 IP 地址:
HOST = 192.168.1.100
  1. 检查主机名解析:
ping $(hostname)

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

现象

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

原因

解决方案

检查项命令正确值
监听地址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 立即触发。

配置文件位置:

状态含义:

7.2 常用命令速查

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

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

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

您可能感兴趣的文章:
阅读全文