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