CentOS lsnrctl启动失败,如何快速定位并高效解决?
- 内容介绍
- 文章标签
- 相关推荐
1. 你面临的典型痛点:监听器启动失败到底是为什么?
在 CentOS 上执行 lsnrctl start
后收到 “ORA‑12541: TNS:no listener” 或 “PRCR‑1079/CRS‑5016” 等错误,往往让人抓狂。再看常见原因包括,
- 网络端口被占用或防火墙拦截
- ORACLE_HOME、PATH 等环境变量未正确配置
- listener.ora 配置错误或实例未启动
- SELinux 或文件权限限制导致无法访问日志和配置文件
- 程序时间不一致导致证书校验失败
- Oracle 软件版本不匹配导致脚本报错
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 有问题。
# ③ 验证网络端口是否开放且未被占用:
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`。
4️⃣ 权限 & SELinux:让程序真正允许 lsnrctl 执行
-
`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 启动失败的问题定位到一个具体原因,并快速修复。老实说,祝你早日恢复数据库正常连接!
1. 你面临的典型痛点:监听器启动失败到底是为什么?
在 CentOS 上执行 lsnrctl start
后收到 “ORA‑12541: TNS:no listener” 或 “PRCR‑1079/CRS‑5016” 等错误,往往让人抓狂。再看常见原因包括,
- 网络端口被占用或防火墙拦截
- ORACLE_HOME、PATH 等环境变量未正确配置
- listener.ora 配置错误或实例未启动
- SELinux 或文件权限限制导致无法访问日志和配置文件
- 程序时间不一致导致证书校验失败
- Oracle 软件版本不匹配导致脚本报错
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 有问题。
# ③ 验证网络端口是否开放且未被占用:
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`。
4️⃣ 权限 & SELinux:让程序真正允许 lsnrctl 执行
-
`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 启动失败的问题定位到一个具体原因,并快速修复。老实说,祝你早日恢复数据库正常连接!

