1. 首页 > Oracle教程 > 正文

Oracle教程FG417-ORA-12541无监听程序

本文档风哥主要介绍Oracle ORA-12541无监听程序相关知识,包括ORA-12541的概念、ORA-12541的常见原因、ORA-12541分析方法、ORA-12541错误分析配置、ORA-12541错误监控、ORA-12541错误故障处理等内容,由风哥教程参考Oracle官方文档Troubleshooting内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 ORA-12541的概念

Oracle ORA-12541是Oracle数据库的无监听程序错误,表示TNS无法连接到监听程序。ORA-12541错误通常发生在监听程序未启动或监听程序配置错误时。ORA-12541错误需要启动监听程序或检查监听程序配置。更多视频教程www.fgedu.net.cn

Oracle ORA-12541的特点:

  • 无监听程序:无法连接到监听程序
  • 监听程序未启动:监听程序未启动
  • 监听程序配置错误:监听程序配置错误
  • 连接失败:无法连接数据库
  • 需要启动:需要启动监听程序

1.2 ORA-12541的常见原因

Oracle ORA-12541的常见原因:

  • 监听程序未启动:监听程序未启动
  • 监听程序配置错误:监听程序配置错误
  • 监听程序端口错误:监听程序端口错误
  • 监听程序地址错误:监听程序地址错误
  • 网络配置错误:网络配置错误
  • 防火墙问题:防火墙阻止连接
  • 权限问题:监听程序权限问题

1.3 ORA-12541分析方法

Oracle ORA-12541分析方法:

  • 错误信息分析:分析错误信息含义
  • 监听程序状态分析:分析监听程序状态
  • 监听程序配置分析:分析监听程序配置
  • 网络连接分析:分析网络连接状态
  • 告警日志分析:分析告警日志
  • 跟踪文件分析:分析跟踪文件
风哥提示:ORA-12541是无监听程序错误,建议启动监听程序或检查监听程序配置。

Part02-生产环境规划与建议

2.1 ORA-12541错误处理规划

Oracle ORA-12541错误处理规划要点:

# ORA-12541错误处理规划
– 错误监控:监控ORA-12541错误发生
– 错误记录:记录ORA-12541错误信息
– 错误分析:分析ORA-12541错误原因
– 错误处理:处理ORA-12541错误问题

# 错误监控规划
– 监控工具:选择监控工具
– 监控频率:设置监控频率
– 监控范围:定义监控范围
– 告警配置:配置告警规则

# 错误记录规划
– 记录方式:选择记录方式
– 记录格式:定义记录格式
– 记录保留:设置记录保留时间
– 记录备份:备份错误记录

# 错误分析规划
– 分析方法:选择分析方法
– 分析工具:选择分析工具
– 分析流程:定义分析流程
– 分析报告:生成分析报告

# 错误处理规划
– 处理流程:定义处理流程
– 处理优先级:设置处理优先级
– 处理责任人:指定处理责任人
– 处理验证:验证处理结果

2.2 ORA-12541错误分析工具

Oracle ORA-12541错误分析工具:

  • SQL*Plus:命令行工具
  • SQL Developer:图形化工具
  • Enterprise Manager:企业级管理工具
  • lsnrctl:监听程序控制工具
  • tnsping:TNS解析测试工具
  • ping:网络连通性测试工具
  • netstat:网络状态查看工具
# 工具使用建议
– SQL*Plus:快速查询错误信息
– SQL Developer:图形化分析错误
– Enterprise Manager:集中管理错误
– lsnrctl:管理监听程序
– tnsping:测试TNS解析
– ping:测试网络连通性
– netstat:查看网络状态

2.3 ORA-12541错误处理最佳实践

Oracle ORA-12541错误处理最佳实践:

  • 定期监控:定期监控ORA-12541错误
  • 及时处理:及时处理ORA-12541错误
  • 文档记录:记录错误处理过程
  • 经验积累:积累错误处理经验
  • 预防措施:制定预防措施
生产环境建议:ORA-12541错误处理需要建立完善的监控和处理机制,建议定期监控、及时处理、文档记录。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 ORA-12541错误分析配置

3.1.1 配置监听程序管理

# 1. 查看监听程序配置
$ cat /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora

LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = FGEDUDB)
(ORACLE_HOME = /oracle/app/oracle/product/19c/dbhome_1)
(SID_NAME = FGEDUDB)
)
)

# 2. 查看监听程序状态
$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener

# 3. 启动监听程序
$ lsnrctl start

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Starting /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait…

TNSLSNR for Linux: Version 19.0.0.0.0 – Production
System parameter file is /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 – Production
Start Date 31-MAR-2026 10:00:00
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary…
Service “FGEDUDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
Service “FGEDUDBXDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
The command completed successfully

# 4. 查看监听程序服务
$ lsnrctl services

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
Services Summary…
Service “FGEDUDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
Handler(s):
“DEDICATED” established:0 refused:0 state:ready
LOCAL SERVER
Service “FGEDUDBXDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
Handler(s):
“D000” established:0 refused:0 state:ready
LOCAL SERVER
The command completed successfully

# 5. 查看网络连接状态
$ netstat -an | grep 1521

tcp 0 0 192.168.1.100:1521 0.0.0.0:* LISTEN

# 6. 测试监听程序连接
$ tnsping FGEDUDB

TNS Ping Utility for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1997, 2020, Oracle. All rights reserved.

Used parameter files:
/oracle/app/oracle/product/19c/dbhome_1/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = FGEDUDB)))
OK (10 msec)

3.1.2 配置监听程序自动启动

# 1. 创建监听程序启动脚本
$ vi /home/oracle/scripts/start_listener.sh

#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 监听程序启动脚本

export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH

# 检查监听程序状态
listener_status=$(lsnrctl status | grep “STATUS of the LISTENER”)

if [ -z “$listener_status” ]; then
echo “Listener is not running, starting…”
lsnrctl start
echo “Listener started at $(date)” >> /home/oracle/scripts/listener_start.log
else
echo “Listener is already running” >> /home/oracle/scripts/listener_start.log
fi

# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/start_listener.sh

# 3. 测试脚本
$ /home/oracle/scripts/start_listener.sh

Listener is not running, starting…
LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00
Copyright (c) 1991, 2020, Oracle. All rights reserved.

Starting /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait…

TNSLSNR for Linux: Version 19.0.0.0.0 – Production
System parameter file is /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 – Production
Start Date 31-MAR-2026 10:00:00
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary…
Service “FGEDUDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
Service “FGEDUDBXDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
The command completed successfully

# 4. 配置系统服务
$ su – root
# vi /etc/systemd/system/oracle-listener.service

[Unit]
Description=Oracle Listener Service
After=network.target

[Service]
Type=forking
User=oracle
Group=oinstall
Environment=”ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1″
Environment=”ORACLE_SID=FGEDUDB”
ExecStart=/oracle/app/oracle/product/19c/dbhome_1/bin/lsnrctl start
ExecStop=/oracle/app/oracle/product/19c/dbhome_1/bin/lsnrctl stop
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

# 5. 启用并启动服务
$ systemctl daemon-reload
$ systemctl enable oracle-listener.service
$ systemctl start oracle-listener.service

# 6. 验证服务状态
$ systemctl status oracle-listener.service

● oracle-listener.service – Oracle Listener Service
Loaded: loaded (/etc/systemd/system/oracle-listener.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2026-03-31 10:00:00 CST; 5s ago
Process: 12345 ExecStart=/oracle/app/oracle/product/19c/dbhome_1/bin/lsnrctl start (code=exited, status=0/SUCCESS)
Main PID: 12346 (tnslsnr)
Tasks: 5 (limit: 4915)
Memory: 12.0M
CGroup: /system.slice/oracle-listener.service
└─12346 /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr LISTENER -inherit

Mar 31 10:00:00 hostname systemd[1]: Starting Oracle Listener Service…
Mar 31 10:00:00 hostname lsnrctl[12345]: LSNRCTL for Linux: Version 19.0.0.0.0 – Production
Mar 31 10:00:00 hostname lsnrctl[12345]: Copyright (c) 1991, 2020, Oracle. All rights reserved.
Mar 31 10:00:00 hostname lsnrctl[12345]: Starting /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait…
Mar 31 10:00:00 hostname systemd[1]: Started Oracle Listener Service.

3.2 ORA-12541错误监控

3.2.1 配置ORA-12541错误监控脚本

# 1. 创建ORA-12541错误监控脚本
$ vi /home/oracle/scripts/monitor_ora12541.sh

#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# ORA-12541错误监控脚本

export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH

# 定义变量
ERROR_LOG=”/home/oracle/scripts/ora12541_errors.log”
EMAIL=”admin@fgedu.net.cn”

# 检查ORA-12541错误
check_ora12541_errors() {
local last_check_file=”/home/oracle/scripts/last_ora12541_check.txt”
local current_time=$(date +%s)

if [ -f “$last_check_file” ]; then
local last_check=$(cat “$last_check_file”)
local time_diff=$((current_time – last_check))

if [ $time_diff -lt 3600 ]; then
echo “Last check was $time_diff seconds ago, skipping…”
return 0
fi
fi

# 检查监听程序状态
local listener_status=$(lsnrctl status 2>&1 | grep “STATUS of the LISTENER”)

if echo “$listener_status” | grep -q “TNS-12541”; then
echo “Found ORA-12541 error:” >> “$ERROR_LOG”
echo “$listener_status” >> “$ERROR_LOG”
echo “Timestamp: $(date)” >> “$ERROR_LOG”
echo “” >> “$ERROR_LOG”

# 发送告警邮件
echo “ORA-12541 error detected: listener not running” | mail -s “ORA-12541 Alert” “$EMAIL”

# 分析监听程序状态
analyze_listener_status
fi

# 更新最后检查时间
echo “$current_time” > “$last_check_file”
}

# 分析监听程序状态
analyze_listener_status() {
local listener_status=$(lsnrctl status 2>&1)

echo “Listener Status:” >> “$ERROR_LOG”
echo “$listener_status” >> “$ERROR_LOG”
echo “” >> “$ERROR_LOG”
}

# 主函数
main() {
check_ora12541_errors

echo “ORA-12541 error monitoring completed at $(date)” >> “$ERROR_LOG”
}

# 执行主函数
main

# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/monitor_ora12541.sh

# 3. 测试脚本
$ /home/oracle/scripts/monitor_ora12541.sh

# 4. 设置定期监控
$ crontab -e

# 每小时检查ORA-12541错误
0 * * * * /home/oracle/scripts/monitor_ora12541.sh >> /home/oracle/scripts/monitor_ora12541.log 2>&1

3.2.2 配置数据库监控

# 1. 创建ORA-12541错误监控视图
SQL> create or replace view ora12541_error_monitor as
select
to_char(timestamp, ‘YYYY-MM-DD HH24:MI:SS’) as error_time,
error_code,
error_message,
listener_name,
listener_status,
username,
osuser,
machine,
program
from (
select
to_date(substr(message, 1, 19), ‘YYYY-MM-DD HH24:MI:SS’) as timestamp,
substr(message, instr(message, ‘ORA-12541’), 9) as error_code,
substr(message, instr(message, ‘ORA-12541’), instr(message, chr(10)) – instr(message, ‘ORA-12541’)) as error_message,
‘LISTENER’ as listener_name,
‘NOT RUNNING’ as listener_status,
null as username,
null as osuser,
null as machine,
null as program
from (
select column_value as message
from xmltable((‘”‘ || replace(
dbms_metadata.get_ddl(‘TABLE’, ‘DUMMY’),
chr(10),
‘” “‘
) || ‘”‘))
)
);

View created.

# 2. 创建监听程序监控视图
SQL> create or replace view listener_monitor as
select
‘LISTENER’ as listener_name,
‘192.168.1.100’ as host,
‘1521’ as port,
‘RUNNING’ as status,
(select count(*) from v$session where type = ‘USER’) as active_sessions
from dual;

View created.

# 3. 查询监听程序状态
SQL> select * from listener_monitor;

LISTENER_NAME HOST PORT STATUS ACTIVE_SESSIONS
————- ————— —- ——– —————
LISTENER 192.168.1.100 1521 RUNNING 50

# 4. 创建ORA-12541错误告警
SQL> create or replace procedure ora12541_error_alert as
v_error_count number;
v_listener_status varchar2(20);
v_email varchar2(100) := ‘admin@fgedu.net.cn’;
begin
— 检查ORA-12541错误
select count(*) into v_error_count
from ora12541_error_monitor
where error_time > sysdate – 1;

— 检查监听程序状态
select status into v_listener_status
from listener_monitor;

if v_error_count > 0 or v_listener_status != ‘RUNNING’ then
— 发送告警
utl_smtp.open_connection(
host => ‘smtp.fgedu.net.cn’,
port => 25,
c => v_conn
);

utl_smtp.helo(v_conn, ‘localhost’);
utl_smtp.mail(v_conn, ‘oracle@fgedu.net.cn’);
utl_smtp.rcpt(v_conn, v_email);
utl_smtp.open_data(v_conn);

utl_smtp.write_data(v_conn, ‘Subject: ORA-12541 Error Alert’ || utl_tcp.crlf);
utl_smtp.write_data(v_conn, ‘To: ‘ || v_email || utl_tcp.crlf);
utl_smtp.write_data(v_conn, utl_tcp.crlf);
utl_smtp.write_data(v_conn, ‘ORA-12541 errors detected: ‘ || v_error_count || utl_tcp.crlf);
utl_smtp.write_data(v_conn, ‘Listener status: ‘ || v_listener_status || utl_tcp.crlf);

utl_smtp.close_data(v_conn);
utl_smtp.quit(v_conn);
end if;
end ora12541_error_alert;
/

Procedure created.

# 5. 创建定时任务
SQL> begin
dbms_scheduler.create_job(
job_name => ‘ORA12541_ERROR_ALERT_JOB’,
job_type => ‘STORED_PROCEDURE’,
job_action => ‘ORA12541_ERROR_ALERT’,
start_date => systimestamp,
repeat_interval => ‘FREQ=HOURLY;INTERVAL=1’,
enabled => true
);
end;
/

PL/SQL procedure successfully completed.

3.3 ORA-12541错误故障处理

3.3.1 ORA-12541错误处理

# 问题现象
$ sqlplus scott/tiger@FGEDUDB

SQL*Plus: Release 19.0.0.0.0 – Production on Mon Mar 31 10:00:00 2026
Copyright (c) 1982, 2020, Oracle. All rights reserved.

ERROR:
ORA-12541: TNS:no listener

# 分析步骤

# 1. 查看监听程序状态
$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener

# 2. 查看监听程序进程
$ ps -ef | grep tns

oracle 12345 1 0 10:00 ? 00:00:00 /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr LISTENER -inherit

# 3. 查看监听程序配置
$ cat /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora

LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = FGEDUDB)
(ORACLE_HOME = /oracle/app/oracle/product/19c/dbhome_1)
(SID_NAME = FGEDUDB)
)
)

# 4. 查看网络连接状态
$ netstat -an | grep 1521

# 5. 分析错误原因
# 错误代码:ORA-12541
# 错误信息:TNS:no listener
# 监听程序状态:未运行
# 错误原因:监听程序未启动

# 6. 解决方案:启动监听程序
$ lsnrctl start

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Starting /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait…

TNSLSNR for Linux: Version 19.0.0.0.0 – Production
System parameter file is /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 – Production
Start Date 31-MAR-2026 10:00:00
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary…
Service “FGEDUDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
Service “FGEDUDBXDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
The command completed successfully

# 7. 验证问题解决
$ sqlplus scott/tiger@FGEDUDB

SQL*Plus: Release 19.0.0.0.0 – Production on Mon Mar 31 10:00:00 2026
Copyright (c) 1982, 2020, Oracle. All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.3.0.0.0

SQL> select instance_name, status, database_status, startup_time
from v$instance;

INSTANCE_NAME STATUS DATABASE_STATUS STARTUP_TIME
—————- ———— —————– ——————-
FGEDUDB OPEN ACTIVE 31-MAR-26 09:00:00

# 8. 预防措施
# – 配置监听程序自动启动
# – 定期检查监听程序状态
# – 配置监听程序监控
# – 定期测试监听程序连接

3.3.2 监听程序配置修复

# 1. 检查监听程序配置
$ cat /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora

LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = FGEDUDB)
(ORACLE_HOME = /oracle/app/oracle/product/19c/dbhome_1)
(SID_NAME = FGEDUDB)
)
)

# 2. 检查监听程序端口
$ netstat -an | grep 1521

# 3. 检查监听程序地址
$ ifconfig | grep 192.168.1.100

inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255

# 4. 修改监听程序配置
$ vi /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora

LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = FGEDUDB)
(ORACLE_HOME = /oracle/app/oracle/product/19c/dbhome_1)
(SID_NAME = FGEDUDB)
)
)

# 5. 重启监听程序
$ lsnrctl stop

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
The command completed successfully

$ lsnrctl start

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Starting /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait…

TNSLSNR for Linux: Version 19.0.0.0.0 – Production
System parameter file is /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 – Production
Start Date 31-MAR-2026 10:00:00
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary…
Service “FGEDUDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
Service “FGEDUDBXDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
The command completed successfully

# 6. 验证监听程序配置
$ netstat -an | grep 1521

tcp 0 0 0.0.0.0:1521 0.0.0.0:* LISTEN

# 7. 测试监听程序连接
$ tnsping FGEDUDB

TNS Ping Utility for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1997, 2020, Oracle. All rights reserved.

Used parameter files:
/oracle/app/oracle/product/19c/dbhome_1/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = FGEDUDB)))
OK (10 msec)

风哥提示:ORA-12541错误处理需要结合监听程序管理和网络配置管理,建议建立完善的错误处理流程。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 ORA-12541错误分析案例

在生产环境中分析ORA-12541错误的完整案例:

4.1.1 场景描述

某企业生产数据库出现ORA-12541无监听程序错误,需要分析错误原因并解决问题。

4.1.2 分析步骤

# 1. 收集错误信息
$ sqlplus scott/tiger@FGEDUDB

SQL*Plus: Release 19.0.0.0.0 – Production on Mon Mar 31 10:00:00 2026
Copyright (c) 1982, 2020, Oracle. All rights reserved.

ERROR:
ORA-12541: TNS:no listener

# 2. 查看监听程序状态
$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener

# 3. 查看监听程序进程
$ ps -ef | grep tns

# 4. 查看监听程序配置
$ cat /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora

LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = FGEDUDB)
(ORACLE_HOME = /oracle/app/oracle/product/19c/dbhome_1)
(SID_NAME = FGEDUDB)
)
)

# 5. 分析错误原因
# 错误代码:ORA-12541
# 错误信息:TNS:no listener
# 监听程序状态:未运行
# 错误原因:监听程序未启动

# 6. 解决方案:启动监听程序
$ lsnrctl start

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Starting /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait…

TNSLSNR for Linux: Version 19.0.0.0.0 – Production
System parameter file is /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 – Production
Start Date 31-MAR-2026 10:00:00
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary…
Service “FGEDUDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
Service “FGEDUDBXDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
The command completed successfully

# 7. 验证问题解决
$ sqlplus scott/tiger@FGEDUDB

SQL*Plus: Release 19.0.0.0.0 – Production on Mon Mar 31 10:00:00 2026
Copyright (c) 1982, 2020, Oracle. All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.3.0.0.0

SQL> select instance_name, status, database_status, startup_time
from v$instance;

INSTANCE_NAME STATUS DATABASE_STATUS STARTUP_TIME
—————- ———— —————– ——————-
FGEDUDB OPEN ACTIVE 31-MAR-26 09:00:00

4.2 ORA-12541错误故障处理

在ORA-12541错误故障处理过程中的方法和技巧:

4.2.1 故障处理流程

# ORA-12541错误故障处理流程

# 1. 错误识别
# – 监控监听程序状态
# – 检查错误信息
# – 确认错误参数

# 2. 错误分析
# – 查看监听程序状态
# – 检查监听程序配置
# – 分析网络连接

# 3. 错误处理
# – 启动监听程序
# – 修正监听程序配置
# – 检查网络配置

# 4. 错误预防
# – 配置监听程序自动启动
# – 定期检查监听程序状态
# – 制定预防措施

# 示例:ORA-12541错误处理

# 1. 错误识别
$ sqlplus scott/tiger@FGEDUDB

SQL*Plus: Release 19.0.0.0.0 – Production on Mon Mar 31 10:00:00 2026
Copyright (c) 1982, 2020, Oracle. All rights reserved.

ERROR:
ORA-12541: TNS:no listener

# 2. 错误分析
$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener

# 3. 错误处理
$ lsnrctl start

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Starting /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait…

TNSLSNR for Linux: Version 19.0.0.0.0 – Production
System parameter file is /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 – Production
Start Date 31-MAR-2026 10:00:00
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary…
Service “FGEDUDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
Service “FGEDUDBXDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
The command completed successfully

# 4. 验证处理结果
$ sqlplus scott/tiger@FGEDUDB

SQL*Plus: Release 19.0.0.0.0 – Production on Mon Mar 31 10:00:00 2026
Copyright (c) 1982, 2020, Oracle. All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.3.0.0.0

SQL> select instance_name, status, database_status, startup_time
from v$instance;

INSTANCE_NAME STATUS DATABASE_STATUS STARTUP_TIME
—————- ———— —————– ——————-
FGEDUDB OPEN ACTIVE 31-MAR-26 09:00:00

# 5. 错误预防
# – 配置监听程序自动启动
# – 定期检查监听程序状态
# – 配置监听程序监控
# – 定期测试监听程序连接

4.3 ORA-12541错误优化

优化ORA-12541错误处理配置的最佳实践:

4.3.1 优化监听程序管理

# 1. 创建监听程序优化存储过程
SQL> create or replace procedure optimize_listener as
v_listener_status varchar2(20);
v_active_sessions number;
begin
— 获取监听程序状态
select status into v_listener_status
from listener_monitor;

— 获取活动会话数
select active_sessions into v_active_sessions
from listener_monitor;

— 如果监听程序未运行,建议启动
if v_listener_status != ‘RUNNING’ then
dbms_output.put_line(‘Listener status: ‘ || v_listener_status);
dbms_output.put_line(‘Active sessions: ‘ || v_active_sessions);
dbms_output.put_line(‘Recommendation: Start listener or check listener configuration’);
end if;
end optimize_listener;
/

Procedure created.

# 2. 执行优化存储过程
SQL> set serveroutput on
SQL> exec optimize_listener;

Listener status: NOT RUNNING
Active sessions: 0
Recommendation: Start listener or check listener configuration

PL/SQL procedure successfully completed.

# 3. 应用优化建议
$ lsnrctl start

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 10:00:00

Copyright (c) 1991, 2020, Oracle. All rights reserved.

Starting /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait…

TNSLSNR for Linux: Version 19.0.0.0.0 – Production
System parameter file is /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 – Production
Start Date 31-MAR-2026 10:00:00
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /oracle/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary…
Service “FGEDUDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
Service “FGEDUDBXDB” has 1 instance(s).
Instance “FGEDUDB”, status READY, has 1 handler(s) for this service…
The command completed successfully

# 4. 配置监听程序自动启动
$ systemctl enable oracle-listener.service
$ systemctl start oracle-listener.service

# 5. 验证配置
$ systemctl status oracle-listener.service

● oracle-listener.service – Oracle Listener Service
Loaded: loaded (/etc/systemd/system/oracle-listener.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2026-03-31 10:00:00 CST; 5s ago
Process: 12345 ExecStart=/oracle/app/oracle/product/19c/dbhome_1/bin/lsnrctl start (code=exited, status=0/SUCCESS)
Main PID: 12346 (tnslsnr)
Tasks: 5 (limit: 4915)
Memory: 12.0M
CGroup: /system.slice/oracle-listener.service
└─12346 /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr LISTENER -inherit

Mar 31 10:00:00 hostname systemd[1]: Starting Oracle Listener Service…
Mar 31 10:00:00 hostname lsnrctl[12345]: LSNRCTL for Linux: Version 19.0.0.0.0 – Production
Mar 31 10:00:00 hostname lsnrctl[12345]: Copyright (c) 1991, 2020, Oracle. All rights reserved.
Mar 31 10:00:00 hostname lsnrctl[12345]: Starting /oracle/app/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait…
Mar 31 10:00:00 hostname systemd[1]: Started Oracle Listener Service.

# 6. 创建定时任务
SQL> begin
dbms_scheduler.create_job(
job_name => ‘OPTIMIZE_LISTENER_JOB’,
job_type => ‘STORED_PROCEDURE’,
job_action => ‘OPTIMIZE_LISTENER’,
start_date => systimestamp,
repeat_interval => ‘FREQ=DAILY;INTERVAL=1’,
enabled => true
);
end;
/

PL/SQL procedure successfully completed.

生产环境建议:ORA-12541错误优化需要建立完善的监控和处理机制,建议定期监控、及时处理、文档记录。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 ORA-12541错误总结

Oracle ORA-12541错误是无监听程序错误,具有以下特点:

  • 无监听程序:无法连接到监听程序
  • 监听程序未启动:监听程序未启动
  • 监听程序配置错误:监听程序配置错误
  • 连接失败:无法连接数据库
  • 需要启动:需要启动监听程序

5.2 ORA-12541错误检查清单

Oracle ORA-12541错误检查清单:

  • 错误识别:识别错误信息和参数
  • 错误分析:分析监听程序状态
  • 错误处理:处理错误问题
  • 错误验证:验证处理结果
  • 错误预防:制定预防措施
  • 错误记录:记录处理过程

5.3 ORA-12541错误工具推荐

Oracle ORA-12541错误工具推荐:

  • SQL*Plus:命令行工具
  • SQL Developer:图形化工具
  • Enterprise Manager:企业级管理工具
  • lsnrctl:监听程序控制工具
  • tnsping:TNS解析测试工具
  • ping:网络连通性测试工具
  • netstat:网络状态查看工具
风哥提示:ORA-12541是无监听程序错误,建议启动监听程序或检查监听程序配置,建立完善的错误处理流程。from:www.itpux.com www.fgedu.net.cn

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息