5154

Good Luck To You!

CentOS7下Oracle监听启动后为何无法连接?

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

CentOS7下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 提供的向导式工具,可以简化配置过程。

  1. 切换用户并启动 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
  2. 配置向导

    • 选择“监听程序配置”。
    • 选择“添加”,创建一个新的监听程序,默认名称通常是 LISTENER
    • 选择协议,几乎总是选择“TCP”。
    • 指定端口号,默认为“1521”,除非有特殊需求,否则建议使用默认端口。
    • 配置完成后,NetCA 会自动生成 listener.ora 文件,并尝试启动监听程序。

手动配置 listener.ora

对于需要精细控制的场景,手动编辑 listener.ora 文件更为灵活,一个典型的 listener.ora 文件内容如下:

CentOS7下Oracle监听启动后为何无法连接?

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”并注册到监听程序。

常见问题与解决方案

  1. TNS-12541: TNS: 无监听程序

    • 原因:监听程序进程未启动。
    • 解决:使用 lsnrctl start 命令启动监听程序。
  2. TNS-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务

    • 原因:这是最常见的问题之一,原因可能是数据库实例未启动、未向监听程序注册,或者 listener.ora 中静态配置的服务名/SID不正确。
    • 解决
      • 确认数据库实例已启动:sqlplus / as sysdba -> startup
      • 检查数据库是否向监听程序动态注册,查看 lsnrctl status 的输出,看服务是否出现在“Services Summary”中,如果没有,检查数据库的 local_listener 参数是否正确设置。
      • 如果使用静态注册,请确保 listener.ora 中的 SID_DESC 信息与数据库实例完全匹配。
  3. 防火墙阻止连接

    CentOS7下Oracle监听启动后为何无法连接?

    • 原因:CentOS 7 默认使用 firewalld 作为防火墙管理工具,如果未开放监听端口(如1521),外部连接将被拒绝。
    • 解决:执行以下命令开放端口并重载防火墙规则。
      sudo firewall-cmd --permanent --add-port=1521/tcp
      sudo firewall-cmd --reload

最佳实践

为确保在 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 系统重启后,监听程序就会作为系统服务自动启动。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年11月    »
12
3456789
10111213141516
17181920212223
24252627282930
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
    网站收藏
    友情链接

    Powered By Z-BlogPHP 1.7.3

    Copyright Your WebSite.Some Rights Reserved.