今天业务侧突然报一个数据库实例正常,本地访问正常。但是无法网络sql工具无法链接的症状。重新把listener和tnsname给重新梳理一下。
报错代码,ORA-12514(监听未启动))ORA-12541(网络1521端口未能被访问到)
最后重新注册监听,修改listener配置后reload监听正常
一、监听的核心功能
- 核心作用监听器(Listener)是客户端与数据库实例的通信枢纽,负责接收连接请求并路由到对应实例。
- 服务注册
- 静态注册:手动配置listener.ora,监听器直接读取配置。
- 动态注册:由PMON进程(11g)或LREG进程(12c+)自动向监听器注册实例信息。
二、注册的概念
三、动态监听与静态监听的区别
1. 动态监听
动态监听的优点:
- 自动管理:不需要手动配置listener.ora文件,当数据库启动时,PMON进程会自动注册服务。
- 实时状态更新:监听器能够实时知道数据库实例的状态(READY或BLOCKED)。当数据库关闭时,动态注册的服务会自动从监听器中注销。
- 支持负载均衡和故障转移:动态注册支持高级特性,如连接负载均衡和故障转移。
- 灵活性:修改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. 静态监听
静态监听的优点:
- 独立性:不依赖于数据库实例的状态,即使数据库实例未启动,监听器仍然会显示该服务。
- 远程启动支持:在数据库未OPEN状态(如NOMOUNT或MOUNT状态)时,可以通过远程连接进行管理操作(需配置密码文件)。
- 多服务名支持:可以在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. 如何区分动态注册和静态注册
- READY:动态注册。
- UNKNOWN:静态注册。
四、动态监听中service_names的默认值
验证步骤:
查看当前数据库参数:
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
- 确认tnsnames.ora存在对应服务名
- 检查service_names是否包含客户端使用的服务名
六、使用体验
动态监听适用场景,自动化程度高,实时反映实例状态,推荐生产环境使用。
- 生产环境(支持高可用)
- RAC集群
- 需要负载均衡的分布式系统
静态监听适用场景,用于特殊场景,如远程启动数据库实例或需要固定服务名的环境。
- 实例未启动时需远程操作(如STARTUP MOUNT)
- 非默认端口的多监听配置
- 早期版本兼容性要求