CentOS lsnrctl启动失败,如何快速定位并高效解决?

更新于
2026-09-30 09:37:38
2阅读来源:SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

 

1. 你面临的典型痛点:监听器启动失败到底是为什么?

在 CentOS 上执行 lsnrctl start 后收到 “ORA‑12541: TNS:no listener” 或 “PRCR‑1079/CRS‑5016” 等错误,往往让人抓狂。再看常见原因包括,

  • 网络端口被占用或防火墙拦截
  • ORACLE_HOME、PATH 等环境变量未正确配置
  • listener.ora 配置错误或实例未启动
  • SELinux 或文件权限限制导致无法访问日志和配置文件
  • 程序时间不一致导致证书校验失败
  • Oracle 软件版本不匹配导致脚本报错
这五大痛点往往是你花费大量时间排查却没法处理问题的根源。如果你正在经历上述任意一条,请继续往下看。下面给出一套快速定位与修复流程。

CentOS lsnrctl启动失败,如何快速定位并高效解决?

2. 快速先排查:先检查状态、日志、端口这三件事。

# ① 查看监听器当前状态:

sudo -u oracle lsnrctl status
# 输出示例:
# LSNRCTL for Linux: Version 12.1.0.1 Build 181020
#
# LSRVR01 - Version 12.1.0.1 - Status: READY
# : is listening on port: 1521
# : is ready
#
# Services Summary...
# 

If it reports “not running” or “no listener”。jump straight to step 3.

# ② 检查监听器日志:

cat $ORACLE_HOME/network/admin/listener.log | tail -n 20
# 或者查看程序日志 /var/log/messages、/var/log/boot.log
2026‑09‑29 10:05:23 ERROR – Listener failed to start: PRCR‑1079
2026‑09‑29 10:05:24 ERROR – Listener stopped.
查看是否出现 `PRCR‑1079`,`CRS‑5016` 等提示,还有端口冲突、权限拒绝等信息。如果日志里有 “Permission denied” 或 “cannot open file”,说明权限或 SELinux 有问题。

# ③ 验证网络端口是否开放且未被占用:

CentOS lsnrctl启动失败,如何快速定位并高效解决?
netstat -tulnp | grep 1521 # 查看端口是否已被其他进程占用
sudo firewall-cmd --list-all # 检查防火墙规则是否允许访问该端口
# 如发现被阻塞。可执行:
sudo firewall-cmd --add-port=1521/tcp --permanent && sudo firewall-cmd --reload
# 如发现被占用,可先停止冲突进程,例如:
sudo kill -9 $

3. 确保 Oracle 环境变量完整无误

切换至 oracle 使用者后执行:

  • export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1;话说回来,export PATH=$ORACLE_HOME/bin:$PATH;
  • export ORACLE_SID=orcl;
  • `which lsnrctl` 应返回 $ORACLE_HOME/bin/lsnrctl`。 如果返回空,说明 PATH 未生效。需要把 $ORACLE_HOME/bin 加入到 /etc/profile.d 下。
    • `echo 'export PATH=$ORACLE_HOME/bin:$PATH'>> ~/.bash_profile && source ~/.bash_profile`。
    • `echo 'export ORACLE_SID=orcl'>> ~/.bash_profile && source ~/.bash_profile`。
    ` 如果还报 `command not found`,请确认 Oracle 软件已安装完整而且 `$ORACLE_HOME/bin` 可执行。

4️⃣ 权限 & SELinux:让程序真正允许 ls​nrctl 执行

权限不足?先检查的观点是,

  • `ls -l $ORACLE_HOME/network/admin/listener.log` 应显示 oracle 使用者可读; 否则执行 `sudo chown oracle:oinstall $ORACLE_HOME/network/admin/listener.log` 并赋予适当权限 `chmod u+r $ORACLE_HOME/network/admin/listener.log`。
    • `chmod +x $` 给脚本可执行权限。 SELinux 强制模式?
      • `getenforce`: 若返回 Enforcing,则需临时宽容: `sudo setenforce Permissive`;说起来,或者添加自定义策略: `sudo semanage port -a -t tns_service_t -p tcp 1521`;`sudo semanage fcontext -a -t bin_t "$ORACLE_HOME?"`,`sudo restorecon –R –v $ORACLE_HOME`;`

5️⃣ 检查 listener.ora 配置文件是否正确

listener.ora 通常位于 $ORACLE_HOME/network/admin/listener.ora`。不过,示例内容如下这方面。


PROTOCOL = TCP
HOST = myhost.example.com # 必须与 /etc/hosts 中对应条目一致!PORT = 1521
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
 )

)

ADRBASELISTENER =

DEFAULTSERVERTYPE = DEFAULTSERVERTYPE_LOCAL;

END;

  • **HOST** 必须能在 DNS / hosts 中解析为服务器 IP;若配置为 localhost 而实际服务运行在其它机器上,就会报“no listener”。: `\tmyhost.example.com`
  • **注意**的观点是。若同时启用了多实例,每个实例都需要在 listener 的 SERVICE_NAME 中声明;否则连接会因“service name not found”而失败。

6️⃣ 最终一步:重启 Oracle 服务并 验证

完成上述检查后请按顺序执行:

  • `sudo systemctl stop oracle-xe.service`,或者手动停止旧实例: `/bin/sqlplus / as sysdba `srvctl stop database -db ${DB_UNIQUE_NAME}`;
  • `lnsrctl stop && lsnrctl start`
  • `sqlplus / as sysdba `lsnrctl status`
  • If last command shows READY,your listener is up and running.


    小结

    步骤 主要要点 常见错误
    ① 状态检查 用 lsnrctl status 看服务是否已开启 忽略错误提示
    ② 日志分析 查看 $HOME/network/admin/listener.log 找关键字 日志方法写错
    ③ 防火墙与端口 确认防火墙开放1521。并无冲突进程 未开启防火墙规则
    ④ 环境变量 正确设置 ORACLE_HOME、PATH、SID 环境变量缺失
    ⑤ 权限 & SELinux 授权 oracle 使用者及关闭 Enforcing 临时模式 权限不足
    ⑥ 配置文件校验 检查 listener.ora 的 HOST 与 SERVICE_NAME 是否一致 DNS / hosts 错误
    ⑦ 重新启动 按顺序停止旧实例 → 启动 Listener → 启动 DB 实例 步骤顺序反了

    只要按此流程逐项核对,你就能把 CentOS 上 lsnrctl 启动失败的问题定位到一个具体原因,并快速修复。老实说,祝你早日恢复数据库正常连接!

    标签:CentOS

     

    1. 你面临的典型痛点:监听器启动失败到底是为什么?

    在 CentOS 上执行 lsnrctl start 后收到 “ORA‑12541: TNS:no listener” 或 “PRCR‑1079/CRS‑5016” 等错误,往往让人抓狂。再看常见原因包括,

    • 网络端口被占用或防火墙拦截
    • ORACLE_HOME、PATH 等环境变量未正确配置
    • listener.ora 配置错误或实例未启动
    • SELinux 或文件权限限制导致无法访问日志和配置文件
    • 程序时间不一致导致证书校验失败
    • Oracle 软件版本不匹配导致脚本报错
    这五大痛点往往是你花费大量时间排查却没法处理问题的根源。如果你正在经历上述任意一条,请继续往下看。下面给出一套快速定位与修复流程。

    CentOS lsnrctl启动失败,如何快速定位并高效解决?

    2. 快速先排查:先检查状态、日志、端口这三件事。

    # ① 查看监听器当前状态:

    sudo -u oracle lsnrctl status
    # 输出示例:
    # LSNRCTL for Linux: Version 12.1.0.1 Build 181020
    #
    # LSRVR01 - Version 12.1.0.1 - Status: READY
    # : is listening on port: 1521
    # : is ready
    #
    # Services Summary...
    # 

    If it reports “not running” or “no listener”。jump straight to step 3.

    # ② 检查监听器日志:

    cat $ORACLE_HOME/network/admin/listener.log | tail -n 20
    # 或者查看程序日志 /var/log/messages、/var/log/boot.log
    2026‑09‑29 10:05:23 ERROR – Listener failed to start: PRCR‑1079
    2026‑09‑29 10:05:24 ERROR – Listener stopped.
    查看是否出现 `PRCR‑1079`,`CRS‑5016` 等提示,还有端口冲突、权限拒绝等信息。如果日志里有 “Permission denied” 或 “cannot open file”,说明权限或 SELinux 有问题。

    # ③ 验证网络端口是否开放且未被占用:

    CentOS lsnrctl启动失败,如何快速定位并高效解决?
    netstat -tulnp | grep 1521 # 查看端口是否已被其他进程占用
    sudo firewall-cmd --list-all # 检查防火墙规则是否允许访问该端口
    # 如发现被阻塞。可执行:
    sudo firewall-cmd --add-port=1521/tcp --permanent && sudo firewall-cmd --reload
    # 如发现被占用,可先停止冲突进程,例如:
    sudo kill -9 $
    

    3. 确保 Oracle 环境变量完整无误

    切换至 oracle 使用者后执行:

    • export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1;话说回来,export PATH=$ORACLE_HOME/bin:$PATH;
    • export ORACLE_SID=orcl;
    • `which lsnrctl` 应返回 $ORACLE_HOME/bin/lsnrctl`。 如果返回空,说明 PATH 未生效。需要把 $ORACLE_HOME/bin 加入到 /etc/profile.d 下。
      • `echo 'export PATH=$ORACLE_HOME/bin:$PATH'>> ~/.bash_profile && source ~/.bash_profile`。
      • `echo 'export ORACLE_SID=orcl'>> ~/.bash_profile && source ~/.bash_profile`。
      ` 如果还报 `command not found`,请确认 Oracle 软件已安装完整而且 `$ORACLE_HOME/bin` 可执行。

    4️⃣ 权限 & SELinux:让程序真正允许 ls​nrctl 执行

    权限不足?先检查的观点是,

    • `ls -l $ORACLE_HOME/network/admin/listener.log` 应显示 oracle 使用者可读; 否则执行 `sudo chown oracle:oinstall $ORACLE_HOME/network/admin/listener.log` 并赋予适当权限 `chmod u+r $ORACLE_HOME/network/admin/listener.log`。
      • `chmod +x $` 给脚本可执行权限。 SELinux 强制模式?
        • `getenforce`: 若返回 Enforcing,则需临时宽容: `sudo setenforce Permissive`;说起来,或者添加自定义策略: `sudo semanage port -a -t tns_service_t -p tcp 1521`;`sudo semanage fcontext -a -t bin_t "$ORACLE_HOME?"`,`sudo restorecon –R –v $ORACLE_HOME`;`

    5️⃣ 检查 listener.ora 配置文件是否正确

    listener.ora 通常位于 $ORACLE_HOME/network/admin/listener.ora`。不过,示例内容如下这方面。

    
    PROTOCOL = TCP
    HOST = myhost.example.com # 必须与 /etc/hosts 中对应条目一致!PORT = 1521
    LISTENER =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    
     )
    

    )

    ADRBASELISTENER =

    DEFAULTSERVERTYPE = DEFAULTSERVERTYPE_LOCAL;

    END;

    • **HOST** 必须能在 DNS / hosts 中解析为服务器 IP;若配置为 localhost 而实际服务运行在其它机器上,就会报“no listener”。: `\tmyhost.example.com`
    • **注意**的观点是。若同时启用了多实例,每个实例都需要在 listener 的 SERVICE_NAME 中声明;否则连接会因“service name not found”而失败。

    6️⃣ 最终一步:重启 Oracle 服务并 验证

    完成上述检查后请按顺序执行:

  • `sudo systemctl stop oracle-xe.service`,或者手动停止旧实例: `/bin/sqlplus / as sysdba `srvctl stop database -db ${DB_UNIQUE_NAME}`;
  • `lnsrctl stop && lsnrctl start`
  • `sqlplus / as sysdba `lsnrctl status`
  • If last command shows READY,your listener is up and running.


    小结

    步骤 主要要点 常见错误
    ① 状态检查 用 lsnrctl status 看服务是否已开启 忽略错误提示
    ② 日志分析 查看 $HOME/network/admin/listener.log 找关键字 日志方法写错
    ③ 防火墙与端口 确认防火墙开放1521。并无冲突进程 未开启防火墙规则
    ④ 环境变量 正确设置 ORACLE_HOME、PATH、SID 环境变量缺失
    ⑤ 权限 & SELinux 授权 oracle 使用者及关闭 Enforcing 临时模式 权限不足
    ⑥ 配置文件校验 检查 listener.ora 的 HOST 与 SERVICE_NAME 是否一致 DNS / hosts 错误
    ⑦ 重新启动 按顺序停止旧实例 → 启动 Listener → 启动 DB 实例 步骤顺序反了

    只要按此流程逐项核对,你就能把 CentOS 上 lsnrctl 启动失败的问题定位到一个具体原因,并快速修复。老实说,祝你早日恢复数据库正常连接!

    标签:CentOS