问题描述
周一刚上班,测试部门的同事就反馈nwmh喝topicis实例不能访问,她根据大模型提供的办法逐个尝试后依然未能解决,还提供了监听启动成功的截图。

分析过程
查看实例进程是否存在
该服务器上共有5个实例

查看监听状态
服务器端的监听器需要启动。监听器通过配置文件listener.ora来设置相关参数,并使用lsnrctl命令进行管理

查看监听配置文件是否正确
listener.ora
listener.ora是oracle服务器端的网络配置文件,oracle根据它来配监听服务。它接受远程对数据库的申请,并转交给oracle的服务进程。
根据监听程序不支持服务的提示检查listener.ora文件是否存在,listener.ora文件是存在的,参数也配置正确。
[oracle@topdb193 ~]$ cat /opt/u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

listener.ora Network Configuration File: /opt/u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

Generated by Oracle configuration tools.

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.193)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)

ADR_BASE_LISTENER = /opt/u01/app/oracle
tnsnames.ora
tnsnames.ora文件是存在的,参数也配置正确
[oracle@topdb193 ~]$ cat /opt/u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

tnsnames.ora Network Configuration File: /opt/u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

Generated by Oracle configuration tools.

TOPICIS =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.193)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = topicis)
)
)

TOPOERS1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.193)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = topoers1)
)
)

DATATEST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.193)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = datatest)
)
)

NWMH =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.193)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = nwmh)
)
)

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.193)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)

查看 IP 地址和主机名的映射关系
[oracle@topdb193 ~]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.3.193 topdb193
192.168.3.193 nacos.topnet.com
内容正确
查看监听日志

配置没问题但是监听一直报监听程序不支持服务,分析思路进入了死胡同,青学会MOP技术社区①群中咨询大佬们,群里大佬反馈数据库没注册上,等一分钟后再查监听状态,没配置静态监听。现场着实是没配置静态监听,监听启动后已经等待数分钟查看监听状态依然显示监听程序不支持服务。
临时解决办法
手动注册监听

export ORACLE_SID=nwmh
sqlplus / as sysdba
SYS@nwmh >alter system register;
查看监听服务
手动注册监听服务后查看监听服务正常,应用访问也恢复。
[oracle@topdb193 trace]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 11-8月 -2025 09:40:24

Copyright © 1991, 2013, Oracle. All rights reserved.

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.193)(PORT=1521)))
LISTENER 的 STATUS

别名 LISTENER
版本 TNSLSNR for Linux: Version 11.2.0.4.0 - Production
启动日期 11-8月 -2025 09:28:35
正常运行时间 0 天 0 小时 11 分 48 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 /opt/u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
监听程序日志文件 /opt/u01/app/oracle/diag/tnslsnr/topdb193/listener/alert/log.xml
监听端点概要…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.193)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
服务摘要…
服务 “nwmh” 包含 1 个实例。
实例 “nwmh”, 状态 READY, 包含此服务的 1 个处理程序…
服务 “nwmhXDB” 包含 1 个实例。
实例 “nwmh”, 状态 READY, 包含此服务的 1 个处理程序…

用同样的办法datatest、orcl、topoers1、nwmh均得到解决。但是该办法对topicis实例不奏效,登录topicis实例提示如下异常:
[oracle@topdb193 ~]$ export ORACLE_SID=topicis
[oracle@topdb193 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on 星期一 8月 11 09:36:34 2025

Copyright © 1982, 2013, Oracle. All rights reserved.

已连接。
pmon进程在,推测topicis实例已经闭库,目前状态是装活着,查看高级日志,发现2025-8-11 9:04数据库已关闭

但是pmon进程没关闭
[oracle@topdb193 topdb193]$ ps -ef | grep ora_pmon_topicis | grep -v grep
oracle 10067 1 0 2月06 ? 00:26:18 ora_pmon_topicis
尝试手动启动topicis实例
SYS@topicis >startup
ORA-01012: not logged on
SYS@topicis >conn / as sysdba
已连接到空闲例程。
SYS@topicis >startup
ORA-01012: not logged on
SYS@topicis >exit
已断开连接
解决办法:准备手动干掉pmon进程再启动
kill -15 pmon

参数说明:
执行完该指令后,操作系统会发送一个 SIGTERM 信号给对应的程序。当程序接收到该信号后,可能会发生以下几种情况的一种:
当前程序立刻停止;
程序释放相应资源,然后再停止;
程序可能仍然继续运行。
大部分程序会先释放自己的资源,然后再停止。但是也有程序可以在接受到信号量后,继续做其他一些事情,并且这些事情是可以配置的。如果程序正在等待IO,可能就不会立马做出响应。也就是说,kill -15 时SIGTERM 是可能被阻塞、被忽略的。
长时间pmon进程依然或者,无奈
kill -9 pmon

参数说明:
如果 kill -15时 SIGTERM 不进行响应?那 kill -9则是 SIGKILL就是必杀信号,多半 ROOT 会直接使用这个命令,但并不推荐这么做。
小结:在使用 kill -9 前,应该先使用 kill -15,给目标进程一个清理善后工作的机会。如果没有,可能会留下一些不完整的文件或状态,从而影响服务的再次启动。
启动topicis实例成功。
最终解决办法
推测是topicis实例异常闭库pmon进程阻塞未停止造成其他四个实例的监听功能不工作。
对于一台服务器上多个实例的场景,动态监听结合配置静态监听会好些,不会因为其中一个实例异常阻塞其他实例。
[oracle@topdb193 ~]$ cat /opt/u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

listener.ora Network Configuration File: /opt/u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

Generated by Oracle configuration tools.

SID_LIST_LISTENER =
(SID_LIST =
(SID_NAME = orcl)
(ORACLE_HOME = /opt/u01/app/oracle/product/11.2.0/db_1)
(PROGRAM = orcl)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.193)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)

ADR_BASE_LISTENER = /opt/u01/app/oracle

[oracle@topdb193 ~]$ lsnrctl stop
[oracle@topdb193 ~]$ lsnrctl start
附:深入剖析 Oracle11g 监听器工作机理与实现原理

  1. 引言
    Oracle 数据库的监听器(Listener)是一个关键的网络服务组件,负责处理来自客户端的连接请求,并将这些请求转发到相应的数据库实例。在 Oracle 11g 中,监听器的工作机理和实现原理对于确保数据库的高效运行和稳定性至关重要。本文将深入剖析 Oracle 11g 监听器的工作流程和内部机制,帮助读者更好地理解和配置监听器,以提高数据库的性能和可靠性。
  2. Oracle11g 监听器概述
    Oracle 监听器是一个在数据库服务器上运行的守护进程,它监听特定端口的网络请求,以便于客户端能够连接到 Oracle 数据库。在 Oracle 11g 中,监听器不仅负责接收连接请求,还负责将请求重定向到正确的数据库服务。监听器配置正确与否直接影响到客户端是否能够成功连接到数据库。
    监听器维护着一个服务注册表,其中包含了数据库实例的相关信息,例如服务名、实例名、数据库版本等。当数据库实例启动时,它会向监听器注册自己的信息。客户端通过提供服务名或其他信息向监听器请求连接时,监听器会查询服务注册表,找到对应的服务,并将客户端的连接请求转发到相应的数据库实例。
    2.1 监听器的主要功能
    ● 管理和分配数据库的连接请求。
    ● 支持多种协议,如 TCP/IP、SSL 等。
    ● 支持负载均衡和高可用性配置。
    2.2 监听器的配置文件
    ● listener.ora:监听器的配置文件,定义了监听器监听的协议、端口和服务信息。
    ● tnsnames.ora:包含了网络服务名称( alias)和对应的服务信息,用于客户端连接数据库时使用。
    了解监听器的基本概念和配置文件是管理和维护 Oracle 数据库的基础。下面我们将详细介绍如何查看和修改监听器的配置。
  3. 监听器配置与管理
    监听器的配置与管理是确保 Oracle 数据库能够接受客户端连接请求的关键步骤。在 Oracle 11g 中,管理员需要了解如何查看监听器的状态,如何对其进行配置修改,以及如何解决常见的配置问题。
    3.1 查看监听器状态
    要查看监听器的状态,可以使用 lsnrctl 命令行工具。以下是一个查看监听器状态的示例命令:
    LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 19-MAR-2023 10:09:57

Copyright © 1991, 2011, Oracle. All rights reserved.

Welcome to LSNRCTL, type ‘help’ for information.
LSNRCTL> status

Listener LOGFILE is /u01/app/oracle/diag/tnslsnr/oracle/listener.log
Listener Parameter File is /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Backends are currently supported version(s): 11.2.0.4.0, 11.1.0.7.0, 10.2.0.5.0, 9.2.0.8.0, 8.1.7.10.0, 8.0.6.0.0
The listener supports protocol versions before Oracle8.0.6.0.0
LSNRCTL>
3.2 修改监听器配置
修改监听器配置通常涉及到编辑 listener.ora 文件。以下是一个简单的 listener.ora 文件示例:
SID_LIST_LISTENER =
(SID_LIST =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(PROGRAM = extproc)
)

LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle-server)(PORT = 1521))
)
如果需要修改监听器监听的端口,可以更改 PORT 参数的值。修改后,需要重新启动监听器使其生效:
LSNRCTL> stop
LSNRCTL> start
3.3 监听器常见问题
在管理监听器时,可能会遇到一些常见问题,如监听器无法启动、客户端无法连接等。这些问题通常与网络配置、权限设置或监听器配置文件有关。解决这些问题的一般步骤包括:
● 检查监听器日志文件以确定错误原因。
● 确认监听器配置文件中的设置与数据库实例的配置相匹配。
● 检查网络设置,如防火墙规则、端口冲突等。
通过以上步骤,管理员可以有效地配置和管理 Oracle 11g 的监听器,确保数据库服务的稳定运行。
4. 监听器的工作流程
Oracle 监听器的工作流程是客户端与数据库实例建立连接的关键环节。以下是 Oracle 11g 监听器处理连接请求的详细步骤:
4.1 客户端发起连接请求
当客户端需要连接到 Oracle 数据库时,它会通过 tnsnames.ora 文件中定义的网络服务名称(alias)来指定要连接的数据库服务。客户端的网络层使用这些信息来建立到数据库服务器的 TCP/IP 连接。
4.2 监听器接收请求
监听器在配置的端口上持续监听来自客户端的连接请求。一旦有请求到达,监听器就会接收这个请求,并根据请求中携带的信息进行下一步处理。
4.3 监听器查询服务注册表
监听器会查询内部的服务注册表,查找与客户端请求相匹配的服务信息。这个信息包括数据库实例的 SID(系统标识符)、服务名、实例名等。
4.4 监听器转发连接请求
如果监听器在服务注册表中找到了匹配的服务,它就会将客户端的连接请求转发到对应的数据库实例。如果服务注册表中没有匹配的服务,监听器会返回一个错误信息给客户端。
4.5 数据库实例处理连接请求
数据库实例接收到来自监听器的转发请求后,会创建一个新的服务器进程来处理客户端的连接。这个服务器进程会与客户端建立会话,并处理后续的 SQL 请求。
4.6 连接建立
一旦服务器进程与客户端成功建立连接,客户端就可以开始发送 SQL 语句,并接收来自数据库的响应数据。
以下是监听器工作流程的简化示例代码:

客户端请求连接

客户端 -> 监听器: “连接到数据库服务”

监听器接收并处理请求

监听器 -> 服务注册表: “查询服务信息”
服务注册表 -> 监听器: “返回服务信息”

监听器转发请求到数据库实例

监听器 -> 数据库实例: “转发客户端连接请求”

数据库实例处理连接

数据库实例 -> 客户端: “连接建立,准备接收SQL请求”
理解监听器的工作流程对于诊断连接问题、优化网络配置以及确保数据库服务的高可用性至关重要。通过对工作流程的深入理解,管理员可以更有效地管理 Oracle 数据库环境。
5. 监听器与数据库的交互
Oracle 监听器与数据库之间的交互是确保客户端能够顺利连接到数据库实例的核心机制。这种交互涉及多个步骤和组件,下面将详细探讨监听器与数据库实例之间的交互过程。
Oracle监听器设置在服务端,是基于服务端的一种网络服务,用于监听客户端向数据库端发出的连接请求。判断一下连接请求是否正确,请求有效就连接,失败就拒绝。所以要连接远程数据库,远程数据库就必须要配置监听器,客户端则不需要配置。
下面是连接过程:

5.1 服务注册
当数据库实例启动时,它会向监听器注册自己的服务信息。这个过程称为服务注册,它允许监听器知道当前可用的数据库服务。注册信息包括服务名、实例名、数据库版本、ORACLE_HOME 路径等。以下是服务注册的简化流程:
数据库实例 -> 监听器: “注册服务信息”
监听器 -> 服务注册表: “更新服务信息”
5.2 连接转发
当监听器接收到客户端的连接请求后,它会根据请求中提供的信息(如服务名)查询服务注册表,找到对应的服务,并将连接请求转发到相应的数据库实例。以下是连接转发的简化流程:
客户端 -> 监听器: “发起连接请求”
监听器 -> 服务注册表: “查询服务信息”
监听器 -> 数据库实例: “转发连接请求”
5.3 会话建立
一旦数据库实例接收到来自监听器的连接请求,它会为客户端创建一个新的服务器进程,并建立与客户端的会话。这个过程称为会话建立。以下是会话建立的简化流程:
数据库实例 -> 客户端: “创建服务器进程”
数据库实例 -> 客户端: “建立会话”
5.4 会话管理
在会话建立之后,客户端和数据库实例之间的交互由服务器进程管理。服务器进程负责执行客户端发送的 SQL 语句,并将查询结果返回给客户端。以下是会话管理的简化流程:
客户端 -> 数据库实例: “发送SQL语句”
数据库实例 -> 客户端: “返回查询结果”
5.5 会话终止
当客户端完成数据库操作后,它会断开与数据库实例的连接。此时,数据库实例会终止相应的服务器进程,并从监听器的服务注册表中移除该服务。以下是会话终止的简化流程:
客户端 -> 数据库实例: “断开连接”
数据库实例 -> 监听器: “更新服务注册表”
监听器与数据库实例之间的这些交互步骤是确保数据库服务正常运行的关键。通过深入了解这些交互过程,数据库管理员可以更好地监控和维护 Oracle 数据库环境,确保服务的连续性和稳定性。
6. 监听器性能优化
Oracle 监听器的性能对于数据库的整体性能和用户体验至关重要。优化监听器可以提升数据库的响应速度和处理能力,以下是一些针对 Oracle 11g 监听器性能优化的策略。
6.1 负载均衡
Oracle 监听器支持负载均衡功能,可以将客户端连接请求分散到不同的数据库实例,从而避免单个实例过载。在 listener.ora 文件中配置 SERVERS 和 SERVERS_LIST 参数可以实现负载均衡。
SID_LIST_LISTENER =
(SID_LIST =
(SID_NAME = ORCL)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SERVERS = 2)
(SERVERS_LIST = (PRIMARY_SVR = (HOST = server1)(PORT = 1521))
(SECONDARY_SVR = (HOST = server2)(PORT = 1521)))
)
6.2 高可用性配置
为了提高监听器的高可用性,可以配置多个监听器实例,并使用第三方负载均衡器或 Oracle 的负载均衡解决方案,如 Oracle Net Manager。
6.3 调整监听器参数
监听器的一些参数可以调整以优化性能,例如:
● MAX_CONNECTIONS:设置监听器可以同时处理的连接数。
● MAX_Sessions:设置监听器可以同时处理的会话数。
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle-server)(PORT = 1521))
(MAX_CONNECTIONS = 1000)
(MAX_SESSIONS = 1000)
)
6.4 监听器日志和统计信息
定期查看监听器的日志文件和统计信息可以帮助识别性能瓶颈。可以使用 LSNRCTL 命令行工具来查看统计信息:
LSNRCTL> show statistics
6.5 网络优化
优化网络设置,如调整 TCP/IP 缓冲区大小、减少网络延迟和丢包,都可以提升监听器的性能。
6.6 使用 SSL
如果安全是一个考虑因素,可以使用 SSL 来加密监听器与客户端之间的通信。虽然 SSL 会增加一些处理开销,但它可以提供更高级别的安全性。
通过上述优化措施,可以提高 Oracle 11g 监听器的性能,确保数据库服务能够高效地处理客户端请求,同时保持系统的稳定性和安全性。
7. 常见问题与故障排除
在管理和维护 Oracle 11g 监听器的过程中,管理员可能会遇到各种问题。正确识别和解决这些问题对于确保数据库服务的连续性和稳定性至关重要。以下是一些常见的监听器问题及其故障排除方法。
7.1 监听器无法启动
当监听器无法启动时,首先检查监听器日志文件,该文件通常位于 $ORACLE_HOME/diag/tnslsnr//listener 目录下。日志文件中通常会包含错误信息,指出无法启动的原因。
● 端口冲突:检查是否有其他服务占用了监听器配置的端口。
● 配置文件错误:检查 listener.ora 文件中的配置是否有误。
● 权限问题:确保 Oracle 用户有权限在监听器端口上进行监听。
netstat -an | grep 1521
使用上述命令检查端口 1521(默认的 Oracle 监听器端口)是否被占用。
7.2 客户端无法连接
如果客户端无法连接到数据库,可能的原因包括:
● 监听器未启动:确认监听器是否正在运行。
● 网络问题:检查客户端与服务器之间的网络连接。
● 服务名错误:确保客户端使用的服务名与 listener.ora 文件中配置的服务名相匹配。
LSNRCTL> status
使用 LSNRCTL status 命令检查监听器状态。
7.3 监听器日志显示错误
监听器日志中可能会显示各种错误,以下是一些常见的错误及其解决方法:
● TNS-12541:监听器无法解析服务名,检查 listener.ora 和 tnsnames.ora 文件中的配置。
● TNS-12560:监听器无法接收连接,检查网络配置和防火墙设置。
grep TNS-12541 $ORACLE_HOME/diag/tnslsnr/oracle/listener.log
使用上述命令在监听器日志中搜索特定错误。
7.4 监听器性能问题
如果监听器性能下降,可能需要:
● 调整监听器参数:如 MAX_CONNECTIONS 和 MAX_SESSIONS。
● 优化网络设置:调整 TCP/IP 参数,如 tcp.send_buffer_size 和 tcp.receive_buffer_size。
7.5 监听器安全漏洞
监听器可能存在安全漏洞,应采取以下措施:
● 限制监听器访问:仅允许受信任的 IP 地址访问监听器端口。
● 使用 SSL:配置监听器使用 SSL 来加密客户端和服务器之间的通信。
故障排除的关键在于仔细分析错误信息,逐步排除可能的原因。以下是一个简单的故障排除流程示例:

故障排除流程

  1. 确认监听器状态
  2. 检查监听器日志
  3. 验证网络连接
  4. 核对配置文件
  5. 查看系统权限
  6. 调整监听器参数
  7. 测试连接
    通过遵循这些步骤,管理员可以有效地解决监听器的问题,确保 Oracle 数据库服务的正常运行。
  8. 总结
    本文详细介绍了 Oracle 11g 监听器的工作机理与实现原理,包括监听器的基本概念、配置与管理、工作流程、与数据库的交互、性能优化以及常见问题与故障排除方法。通过深入了解监听器的作用和配置,管理员可以更好地管理和维护数据库服务,确保其稳定性和高效性。
    监听器作为 Oracle 数据库网络服务的关键组件,其重要性不言而喻。正确的配置和优化可以提升数据库的连接性能,增强系统的可用性和安全性。同时,掌握故障排除技巧可以帮助管理员快速响应和解决可能出现的问题。
    在未来的工作中,管理员应持续关注 Oracle 数据库技术的发展,不断学习和实践,以提高自己在数据库管理和维护方面的专业技能。通过不断优化监听器配置,确保 Oracle 数据库能够为业务提供可靠、高效的服务。
    参考链接:https://blog.csdn.net/weixin_42233789/article/details/105392180
    https://blog.csdn.net/Golden_soft/article/details/81510985
    https://my.oschina.net/emacs_8744887/blog/17161211
    最后,感谢青学会MOP技术社区①群中大佬答疑
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐