86-Oracle Listener (动态~静态监听)

今天业务侧突然报一个数据库实例正常,本地访问正常。但是无法网络sql工具无法链接的症状。重新把listener和tnsname给重新梳理一下。

报错代码,ORA-12514(监听未启动))ORA-12541(网络1521端口未能被访问到)

最后重新注册监听,修改listener配置后reload监听正常

一、监听的核心功能

监听器(Listener)是Oracle数据库网络架构中的关键组件,负责接收客户端的连接请求并路由到对应的数据库实例。
注册(Registration)是将数据库实例信息提供给监听器的过程,使监听器知道哪些数据库服务可用。
  1. 核心作用​监听器(Listener)是客户端与数据库实例的通信枢纽,负责接收连接请求并路由到对应实例。
  2. 服务注册
  • 静态注册​:手动配置listener.ora,监听器直接读取配置。
  • 动态注册​:由PMON进程(11g)或LREG进程(12c+)自动向监听器注册实例信息。

二、注册的概念

注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。
在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务)。

三、动态监听与静态监听的区别

1. 动态监听

动态注册(Dynamic Registration)是数据库实例自动向监听器注册的过程。在数据库实例启动到MOUNT阶段时,PMON进程11g~12cLREG进程参与)会根据数据库参数(如instance_name和service_names)自动将服务注册到监听器。
动态监听的优点:
  1. 自动管理​:不需要手动配置listener.ora文件,当数据库启动时,PMON进程会自动注册服务。
  2. 实时状态更新​:监听器能够实时知道数据库实例的状态(READY或BLOCKED)。当数据库关闭时,动态注册的服务会自动从监听器中注销。
  3. 支持负载均衡和故障转移​:动态注册支持高级特性,如连接负载均衡和故障转移。
  4. 灵活性​:修改service_names或instance_name参数后,无需修改监听配置文件,只需重新注册(手动注册命令:ALTER SYSTEM REGISTER;)。
动态监听的配置依赖参数:
  • instance_name:注册的实例名,默认值为ORACLE_SID。
  • service_names:注册的服务名,默认值为db_unique_name.db_domain(注意:不是db_name)。
  • local_listener:指定非默认监听器(非1521端口或非默认监听名称)的地址。
验证动态监听:
-- 查看动态注册的相关参数
SQL> show parameter instance_name;
SQL> show parameter service_names;
SQL> show parameter local_listener;
--
SYS@CDB$ROOT> show parameter db_unique;NAME           TYPE   VALUE
-------------- ------ ------
db_unique_name string test19
SYS@CDB$ROOT> show parameter service;
NAME          TYPE   VALUE
------------- ------ ------
service_names string test19
SYS@CDB$ROOT> show parameter listener;
NAME              TYPE   VALUE
----------------- ------ -------
forward_listener  string
listener_networks string
local_listener    string  
remote_listener   string
SYS@CDB$ROOT>

-- 手动触发动态注册(如果自动注册未发生)
SQL> alter system register;
--使用lsnrctl status检查监听状态,动态注册的服务状态为READY​:

Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test19)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=test19)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle/admin/test19/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "15039c198fd44446e063be00010a763a" has 1 instance(s).
  Instance "test19", status READY, has 1 handler(s) for this service...
Service "86b637b62fdf7a65e053f706e80a27ca" has 1 instance(s).
  Instance "test19", status READY, has 1 handler(s) for this service...
Service "pdbrs6" has 1 instance(s).
  Instance "test19", status READY, has 1 handler(s) for this service...
Service "test19" has 1 instance(s).
  Instance "test19", status READY, has 1 handler(s) for this service...
Service "test19XDB" has 1 instance(s).
  Instance "test19", status READY, has 1 handler(s) for this service...
The command completed successfully

2. 静态监听

静态注册(Static Registration)是通过手动配置listener.ora文件,在监听器启动时读取配置,将数据库服务信息静态地注册到监听器中。
静态监听的优点:
  1. 独立性​:不依赖于数据库实例的状态,即使数据库实例未启动,监听器仍然会显示该服务。
  2. 远程启动支持​:在数据库未OPEN状态(如NOMOUNT或MOUNT状态)时,可以通过远程连接进行管理操作(需配置密码文件)。
  3. 多服务名支持​:可以在listener.ora中为一个实例配置多个服务名(GLOBAL_DBNAME)。

 静态监听配置示例ORCL 含ADG(listener.ora):

SID_LIST_LISTENER =
  (SID_LIST =SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL_PRI)       # 主服务
      (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
      (SID_NAME = ORCL)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL_BACKUP)    # 备份专用服务
      (SID_NAME = ORCL)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = DG_BROKER)      # Data Guard Broker服务
      (SID_NAME = ORCL)
    )
  )

 重新加载监听器:

$ lsnrctl reload
--示例:使用lsnrctl status检查监听状态,静态注册的服务状态为UNKNOWN​:

Services Summary...
Service "dg4msql" has 1 instance(s).
  Instance "dg4msql", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

3. 如何区分动态注册和静态注册

使用lsnrctl status命令,观察服务实例的状态:
  • READY​:动态注册。
  • UNKNOWN​:静态注册。

四、动态监听中service_names的默认值

根据Oracle官方文档,动态注册的service_names默认值由db_unique_name和db_domain拼接而成(格式为db_unique_name.db_domain),而不是db_name。如果db_domain为空,则服务名就是db_unique_name。

验证步骤:

查看当前数据库参数:

SQL> show parameter db_unique_name;
SQL> show parameter db_name;
SQL> show parameter db_domain;
SQL> show parameter service_names;

lsnrctl service

lsnrctl status

如果service_names为空,则动态注册的服务名将由db_unique_name和db_domain拼接而成。
例如:

  • db_unique_name = test19
  • db_domain = example.com则注册的服务名为orcl.example.com。

手动触发注册后,使用lsnrctl status查看服务名。

​特性​

​动态监听​

​静态监听​

​注册方式​

PMON/LREG进程自动注册

手动配置listener.ora

​实时性​

实例状态实时同步(READY/BLOCKED)

状态恒为UNKNOWN(不检查实例状态)

​依赖参数​

instance_name,service_names,

local_listener

listener.ora中的SID定义

​端口限制​

默认仅注册到1521端口

可自定义任意端口

​高可用支持​

支持负载均衡和故障转移

不支持实时状态感知

五、典型问题

问题现象​:

动态注册失败(监听状态无服务),PL/SQL连接报错"无监听"。动态注册未发生,通常是因为监听端口非默认(非1521)且未设置local_listener参数。

​解决方案​:

-- 检查并设置local_listener(示例是1522 ,不是默认1521端口)
SQL> ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=10.6.0.22)(PORT=1522))' SCOPE=BOTH;
--查看listner配置
SYS@CDB$ROOT> show parameter listener;
NAME              TYPE   VALUE
----------------- ------ ------------------------------------------------
forward_listener  string
listener_networks string
local_listener    string LISTENER_TEST19
--直接修改
alter system set local_listner='' scope=both;

--查看tnsname配置
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

TEST19 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =10.6.0.XXX)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = test19)
    )
  )

PDBRS6 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =10.6.0.XXX)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = PDBRS6)
    )
  )

-- 重启监听
$ lsnrctl stop
$ lsnrctl start
关键步骤​:
  1. 确认tnsnames.ora存在对应服务名
  2. 检查service_names是否包含客户端使用的服务名

六、使用体验

​动态监听适用场景​,自动化程度高,实时反映实例状态,推荐生产环境使用。

  • 生产环境(支持高可用)
  • RAC集群
  • 需要负载均衡的分布式系统

​静态监听适用场景​,用于特殊场景,如远程启动数据库实例或需要固定服务名的环境。

  • 实例未启动时需远程操作(如STARTUP MOUNT)
  • 非默认端口的多监听配置
  • 早期版本兼容性要求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值