跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何配置Oracle的动态服务注册_PMON进程与LOCAL_LISTENER

LOCAL_LISTENER必须设为tnsnames.ora中定义的TNS别名(如LISTENER_ORCL),且监听器需已启动并处于READY状态,实例须OPEN,动态修改后需执行ALTER SYSTEM REGISTER生效。 LOCAL_LISTENER 参数设成什么值才真正生效 oracle 实例启动时,
pmon
会读取
local_listener
参数去注册服务到监听器。但很多人设了却没注册成功,根本原因是:这个参数的值必须能被实例“解析并连接”,不是写个字符串就行。
LOCAL_LISTENER
值必须是 TNS alias(如
LISTENER_ORCL
),且该 alias 必须存在于实例所在主机的
$ORACLE_HOME/network/admin/tnsnames.ora
中 不能直接写
(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))
这种硬编码地址——
PMON
不支持内联描述符,只认 tnsnames.ora 里的名字 如果用了 SCAN 或远程监听器,
LOCAL_LISTENER
仍应指向本地监听器(比如默认的
LISTENER
),别误配成 SCAN VIP 的监听器名 动态修改后需执行
ALTER SYSTEM REGISTER
,否则
PMON
要等默认 60 秒才重试注册 ALTER SYSTEM REGISTER 为什么有时不触发注册 这条命令本意是让
PMON
立即向
LOCAL_LISTENER
指定的监听器发起服务注册,但它失败往往不是命令问题,而是环境卡点。 监听器必须已启动,且状态为
READY
(用
lsnrctl status
确认),若监听器在
STARTING
或报
TNS-12541: No listener
,命令静默失败 实例必须处于
OPEN
状态;
MOUNT
状态下执行无效果,也不会报错 如果
LOCAL_LISTENER
指向一个不存在的 tnsnames alias,命令返回成功,但
PMON
日志里会出现
WARNING: tnsping to failed
检查
$ORACLE_BASE/diag/rdbms///trace/alert_.log
,搜索
Service registration
或
failed to connect to listener
动态注册失败时,怎么快速定位是 PMON 还是监听器的问题 注册失败常被归咎于配置,但实际要分清责任边界:
PMON
负责“发起连接和发送服务信息”,监听器负责“接收并维护服务列表”。两边日志得分开看。 查
PMON
行为:在 alert 日志里搜
Service "X" has 1 instance(s)
(注册成功)、
Failed to contact listener
(连不上)、
Listener refused the connection
(认证或权限问题) 查监听器侧:运行
lsnrctl services
,看输出里有没有你的实例名和服务名;如果没有,说明注册请求根本没到达,或被拒绝 用
tnsping
验证网络可达性和 tnsnames 解析是否正确——这是最常被跳过的一步 监听器 trace 级别调高(
LSNRCTL> set trc_level 16
)后复现,trace 文件里会记录每次注册请求的源 IP、服务名、协议版本,比盲猜靠谱得多 使用 SCAN 监听器时,LOCAL_LISTENER 还要不要配 要配,但配法和单机不同。RAC 环境下,
LOCAL_LISTENER
依然指向本节点的本地监听器(如
LISTENER_SCAN1
是错的),而
REMOTE_LISTENER
才指向 SCAN。 单实例 + SCAN:基本不用 SCAN,
LOCAL_LISTENER
应保持默认(空值)或显式设为
LISTENER
,让它注册到本地 1521 端口监听器即可 RAC 环境:每个实例的
LOCAL_LISTENER
必须设成本节点的 VIP + 本地监听端口(如
(ADDRESS=(PROTOCOL=TCP)(HOST=node1-vip)(PORT=1521))
),不能设成 SCAN 地址 误把
LOCAL_LISTENER
设成 SCAN 导致的典型现象:实例在
lsnrctl services
里看不到,但
crsctl stat res -t
显示资源 online——因为注册发到了 SCAN 监听器,而 SCAN 监听器默认不接受非 SCAN 客户端的动态注册 验证方式:在数据库里查
SELECT * FROM V$PARAMETER WHERE NAME = 'local_listener'
,再对比该值能否被
tnsping
通 动态服务注册看着简单,但每一步都依赖前一步的环境就绪。最容易被忽略的是 tnsnames.ora 文件位置、监听器状态、以及 alert log 里那几行不起眼的 warning——它们比任何文档都诚实。

相关文章