在Oracle集群数据库中,监听(Listener)是一种后台进程,它监控来自客户端的连接请求,并根据其配置文件(通常是listener.ora)中定义的规则,将这些请求路由到相应的数据库服务或实例进行处理。
服务注册使侦听器能够确定数据库服务及其服务处理程序是否可用。service handler是一个专用的服务器进程或调度程序,充当到数据库的连接点。在注册期间,LREG进程向侦听器提供实例名称、数据库服务名称以及服务处理程序的类型和地址。此信息使侦听器能够在客户端请求到达时启动服务处理程序。
1.创建监听的方法

一直下一步




查看监听状态和配置
--集群用grid用户,单机环境用oracle用户--查看监听配置文件[oracle@localhost admin]$ cat $ORACLE_HOME/network/admin/listener.ora[oracle@localhost admin]$ lsnrctl status listener[oracle@localhost admin]$ lsnrctl status listener_scan1$ lsnrctl status listenerLSNRCTL for Linux: Version 19.0.0.0.0 - Production on 08-FEB-2024 15:03:44Copyright (c) 1991, 2019, Oracle. All rights reserved.Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER3)))STATUS of the LISTENER------------------------Alias LISTENER3Version TNSLSNR for Linux: Version 19.0.0.0.0 - ProductionStart Date 15-MAY-2023 14:38:50Uptime 269 days 0 hr. 24 min. 53 secTrace Level offSecurity ON: Local OS AuthenticationSNMP OFFListener Parameter File u01/app/12.0.0.0/grid/network/admin/listener.oraListener Log File /u01/app/grid/diag/tnslsnr/dm08dbadm01/listener/alert/log.xmlListening Endpoints Summary...(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.10.101)(PORT=1526)))Services Summary......Service "abc" has 1 instance(s).Instance "abc1", status READY, has 1 handler(s) for this service...$ srvctl config listener--例子$ srvctl config listenerName: LISTENERType: Database ListenerNetwork: 1, Owner: gridHome: <CRS home>End points: TCP:1521Listener is enabled.Listener is individually enabled on nodes:Listener is individually disabled on nodes:
启停监听
--集群用grid用户,单机环境用oracle用户$ lsnrctl START [listener_name]--例子$ lsnrctl start listener$ lnsrctl start listener -listener listener1,listener_test$ lsnrctl STOP [listener_name]--例子$ lsnrctl stop listener$ lsnrctl stop listener -listener listner1,listener2$ lsnrctl stop listener_test--reload$ lsnrctl reload listener
增删监听
--集群用grid用户,单机环境用oracle用户$ srvctl add listener -listener listener_abc1$ srvctl remove listener -listener listener_abc1
crs中监听相关资源
grid@service1:/home/grid$ crsctl status res -t--------------------------------------------------------------------------------Name Target State Server State details--------------------------------------------------------------------------------Local Resources--------------------------------------------------------------------------------ora.LISTENER.lsnrONLINE ONLINE service1 STABLEONLINE ONLINE service2 STABLEora.net1.networkONLINE ONLINE service1 STABLEONLINE ONLINE service2 STABLEora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)1 ONLINE OFFLINE STABLE2 ONLINE ONLINE service1 STABLE3 ONLINE ONLINE service2 STABLEora.LISTENER_SCAN1.lsnr1 ONLINE ONLINE service1 STABLEora.LISTENER_SCAN2.lsnr1 ONLINE ONLINE service2 STABLEora.LISTENER_SCAN3.lsnr1 ONLINE ONLINE service1 STABLEora.scan1.vip1 ONLINE ONLINE service1 STABLEora.service1.vip1 ONLINE ONLINE service1 STABLEora.service2.vip1 ONLINE ONLINE service2 STABLE
sqlnet.ora
grid@service1:/u01/app/12.2.0.1/grid/network/admin$ cat sqlnet.ora# sqlnet.ora.service1 Network Configuration File: /u01/app/12.2.0.1/grid/network/admin/sqlnet.ora.service1# Generated by Oracle configuration tools.NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
listener.ora
--手动基于实例添加静态监听SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(GLOBAL_DBNAME = abc)(ORACLE_HOME = u01/app/oracle/product/19.7.0.0/db)(SID_NAME = abc1))(SID_DESC =(GLOBAL_DBNAME = whm)(ORACLE_HOME = u01/app/oracle/product/12.2.0.1/dbhome_1)(SID_NAME = whm1)))
动态监听与静态监听的区别
2.1. 静态监听器:
静态监听器是最常见的监听器配置方式。在静态监听器中,监听器的地址和端口号是固定的,事先在监听器配置文件(通常是listener.ora)中定义好。当数据库启动时,监听器会根据配置文件中的信息监听指定的地址和端口。静态监听器通常用于单个实例数据库的监听。
2.2. 动态监听器:
动态监听器是相对灵活和可自动管理的监听器配置方式。在动态监听器中,监听器的地址和端口号不需要在配置文件中提前定义。当数据库启动时,动态监听器会根据数据库实例的注册信息自动获取可用的地址和端口号,然后监听这些地址和端口。动态监听器可以实现在数据库启动和停止时自动注册和注销监听。
2.3 区别
静态监听器需要手动在监听器配置文件中定义地址和端口号,配置固定且静态不变。而动态监听器可根据数据库实例的注册信息自动获取可用地址和端口号,并动态注册和注销。
静态监听器适用于单一实例数据库,适合在固定的地址和端口监听数据库。而动态监听器适用于多实例或集群环境,可以根据实例的变化自动管理监听。
静态监听器通常需要手动编辑监听器配置文件,而动态监听器则更加自动化和灵活。
lsnrctl status 后,显示ready为动态监听,显示unknown为静态监听
2.4 如何清理监听日志文件
查找监听日志
单机(集群)都看这里,只不过,集群是在grid用户下,而单机则是在oracle用户下。这里说的是 log.xml 监听日志文件
cd $ORACLE_BASE/diag/tnslsnr/$HOSTNAME/listener/alert
查看监听日志文件的大小
进入监听日志文件所在目录,使用du -sh或者du -sh *或者du -sh listener.log查看其大小。
cd $ORACLE_BASE/diag/tnslsnr/$HOSTNAME/listener && du -sh *$ find $ORACLE_BASE/diag -name listener*.log|xargs ls -l--节点1$ tail -100f u01/app/grid/diag/tnslsnr/service1/listener/trace/listener.log
注:主要关注alter和trace文件夹大小
--清理echo dev/null listener.log
2.5 listener.log\tnsnames.ora\sqlnet.ora文件的作用
listener.log是监听器的日志文件,记录了监听器的活动和事件。它包含了连接请求、断开连接、错误和警告等信息。通过查看listener.log文件,可以了解监听器的运行状态、连接请求的处理情况以及发生的错误和警告信息,对于故障排除和性能调优非常有用
tnsnames.ora是Oracle客户端配置文件,用于定义数据库服务的网络连接信息。在tnsnames.ora文件中,可以配置数据库的别名(Service Name或SID)、主机名、端口号等连接参数。客户端应用程序通过读取tnsnames.ora文件中的配置信息,可以根据别名来连接指定的数据库服务。tnsnames.ora文件通常位于$ORACLE_HOME/network/admin目录下。
设置黑白名单
编辑$ORACLE_HOME/network/admin目录下sqlnet.ora文件添加:# 启用IP地址验证TCP.VALIDNODE_CHECKING = YES# 允许连接的客户端IP地址TCP.INVITED_NODES = (192.168.200.151,10.10.22.116)# 禁止连接的客户端IP地址TCP.EXCLUDED_NODES = (192.168.200.129)执行lsnrctl reload 或lsnrctl stop/lsnrctl start命令让文件生效
监听器无法启动或停止:
检查监听器配置文件(通常是listener.ora)中的配置是否正确。
确保监听器要使用的端口没有被其他进程占用。
netstat -tln |grep <端口号>
检查输出结果。如果没有显示任何结果,表示该端口当前没有被其他进程占用。
检查监听器进程是否已经在运行,如果是,则尝试使用`lsnrctl stop`命令停止监听器进程,然后再重新启动。
监听器无法连接到数据库:
检查数据库实例是否已启动,可以使用`ps -ef | grep smon`命令检查数据库实例进程是否存在。
确保监听器配置文件中的数据库实例名或服务名与数据库实例的配置一致。
检查网络连接是否正常,可以使用`ping`命令测试数据库服务器的可达性。检查防火墙配置,确保允许监听器和数据库之间的通信。
监听器日志中出现错误:
TNS-12545错误(连接失败):检查数据库实例是否已启动,以及监听器配置文件中的数据库实例名或服务名是否正确。
TNS-12560错误(协议适配器错误):检查监听器配置文件中的协议适配器配置是否正确,例如是否使用了正确的监听协议(TCP/IP、IPC等)。




