在基于 CentOS 7 的服务器上部署和管理 Oracle 数据库时,监听程序是连接客户端与数据库实例的关键桥梁,它是一个独立的进程,负责监听来自网络的连接请求,并将这些请求转发给相应的数据库服务,理解并熟练配置 Oracle 监听程序,是确保数据库高可用性和稳定性的基础。

监听程序的核心概念
Oracle 监听程序的主要作用是网络通信中介,当用户或应用程序尝试连接数据库时,它们首先联系监听程序,监听程序根据请求中的服务名或SID,验证并引导连接到已注册的数据库实例,这个过程涉及几个重要的配置文件,它们位于 $ORACLE_HOME/network/admin/ 目录下:
- listener.ora: 监听程序的主配置文件,定义了监听程序的名称、协议、端口以及它所服务的数据库实例信息。
- tnsnames.ora: 客户端端的配置文件,用于将一个网络服务别名(连接描述符)映射到具体的数据库地址、端口和服务名,虽然它主要在客户端使用,但在服务器端进行本地连接测试时也同样重要。
- sqlnet.ora: 控制Oracle Net服务的特性,如命名方法、日志级别、追踪选项以及安全限制等。
在 CentOS 7 环境下,正确配置这些文件并管理监听程序进程,是数据库管理员的核心任务之一。
在 CentOS 7 上配置监听程序
配置监听程序主要有两种方式:使用图形化的网络配置助手或手动编辑配置文件,对于初学者,推荐使用 NetCA。
使用 NetCA 进行配置
NetCA(Network Configuration Assistant)是 Oracle 提供的向导式工具,可以简化配置过程。
-
切换用户并启动 NetCA:需要切换到
oracle用户,并设置好环境变量,在终端中运行netca命令。su - oracle export ORACLE_SID=ORCLCDB export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1 export PATH=$ORACLE_HOME/bin:$PATH netca
-
配置向导:
- 选择“监听程序配置”。
- 选择“添加”,创建一个新的监听程序,默认名称通常是
LISTENER。 - 选择协议,几乎总是选择“TCP”。
- 指定端口号,默认为“1521”,除非有特殊需求,否则建议使用默认端口。
- 配置完成后,NetCA 会自动生成
listener.ora文件,并尝试启动监听程序。
手动配置 listener.ora
对于需要精细控制的场景,手动编辑 listener.ora 文件更为灵活,一个典型的 listener.ora 文件内容如下:

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCLCDB)
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
(SID_NAME = ORCLCDB)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = centos7-server)(PORT = 1521))
)
)
在这个配置中:
SID_LIST_LISTENER部分静态定义了监听程序应知的数据库服务。GLOBAL_DBNAME是数据库的全局名,SID_NAME是实例名。LISTENER部分定义了监听程序本身的网络地址,HOST应设置为服务器的实际主机名或IP地址。
手动修改后,需要使用 lsnrctl reload 命令使配置生效,而无需重启监听程序。
监听程序的管理与排错
日常管理中,熟练使用 lsnrctl 工具至关重要,以下是一些常用命令和常见问题的解决方法。
常用管理命令
| 命令 | 功能描述 |
|---|---|
lsnrctl status |
查看监听程序的当前状态,包括运行时间、监听地址、服务摘要等 |
lsnrctl start [listener_name] |
启动指定的监听程序,若不指定名称,则启动默认的 LISTENER |
lsnrctl stop [listener_name] |
停止指定的监听程序 |
lsnrctl reload [listener_name] |
重新加载 listener.ora 文件,使新配置生效 |
lsnrctl status 的输出是排错的关键,它清晰地显示了哪些服务已经“Ready”并注册到监听程序。
常见问题与解决方案
-
TNS-12541: TNS: 无监听程序
- 原因:监听程序进程未启动。
- 解决:使用
lsnrctl start命令启动监听程序。
-
TNS-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
- 原因:这是最常见的问题之一,原因可能是数据库实例未启动、未向监听程序注册,或者
listener.ora中静态配置的服务名/SID不正确。 - 解决:
- 确认数据库实例已启动:
sqlplus / as sysdba->startup。 - 检查数据库是否向监听程序动态注册,查看
lsnrctl status的输出,看服务是否出现在“Services Summary”中,如果没有,检查数据库的local_listener参数是否正确设置。 - 如果使用静态注册,请确保
listener.ora中的SID_DESC信息与数据库实例完全匹配。
- 确认数据库实例已启动:
- 原因:这是最常见的问题之一,原因可能是数据库实例未启动、未向监听程序注册,或者
-
防火墙阻止连接

- 原因:CentOS 7 默认使用
firewalld作为防火墙管理工具,如果未开放监听端口(如1521),外部连接将被拒绝。 - 解决:执行以下命令开放端口并重载防火墙规则。
sudo firewall-cmd --permanent --add-port=1521/tcp sudo firewall-cmd --reload
- 原因:CentOS 7 默认使用
最佳实践
为确保在 CentOS 7 上运行的 Oracle 监听程序稳健可靠,应遵循以下最佳实践:
- 使用动态服务注册:现代 Oracle 数据库(10g及以后版本)推荐使用动态注册,数据库实例启动后会自动向监听程序注册自己的服务,简化了
listener.ora的管理。 - 配置开机自启:将监听程序的启动脚本配置为系统服务,使其在服务器重启后自动运行,可以创建一个
systemd服务单元文件来实现。 - 定期检查日志:监听程序的日志文件位于
$ORACLE_BASE/diag/tnslsnr/<hostname>/listener/alert/log.xml,定期检查该日志有助于提前发现潜在问题。 - 安全加固:通过在
listener.ora中设置ADMIN_RESTRICTIONS_LISTENER = ON,可以限制通过lsnrctl执行某些管理命令,增强安全性。
相关问答FAQs
问1:Oracle 监听程序和数据库实例是同一个进程吗? 答: 不是,它们是两个完全独立的进程,监听程序是一个网络中介,它本身不处理任何数据,只负责接收连接请求并将其“传递”给数据库实例,数据库实例是真正处理SQL命令、管理数据文件的进程,数据库实例启动后,会向监听程序“注册”自己提供的服务,这样监听程序才知道将特定服务的请求转发给哪个实例。
问2:如何让 Oracle 监听程序在 CentOS 7 开机时自动启动?
答: 最佳方式是为监听程序创建一个 systemd 服务文件,创建一个服务文件,/etc/systemd/system/oracle-listener.service如下:
[Unit] Description=Oracle Net Listener After=network.target [Service] User=oracle Group=oinstall Environment="ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1" ExecStart=/u01/app/oracle/product/19c/dbhome_1/bin/lsnrctl start ExecStop=/u01/app/oracle/product/19c/dbhome_1/bin/lsnrctl stop ExecReload=/u01/app/oracle/product/19c/dbhome_1/bin/lsnrctl reload TimeoutStopSec=60 RemainAfterExit=yes [Install] WantedBy=multi-user.target
请确保将 ORACLE_HOME 的路径替换为你的实际路径,执行以下命令启用并启动该服务:
sudo systemctl daemon-reload sudo systemctl enable oracle-listener.service sudo systemctl start oracle-listener.service
这样,每次 CentOS 7 系统重启后,监听程序就会作为系统服务自动启动。