导读:本期聚焦于澳门程序员创作的《Oracle RAC中SCAN监听器如何正确配置?详解SCAN listener配置步骤与常见问题》,敬请观看详情。SCAN监听器是Oracle RAC架构中客户端连接的关键组件,它通过SCAN名称将连接请求转发到对应的节点监听器,实现负载均衡和故障切换。不少DBA在安装RAC后遇到客户端连接不稳定、负载不均衡的问题,根源往往就在SCAN listener的配置上。本文从SCAN的工作原理讲起,介绍SCAN IP与DNS、GNS的关系,详细演示使用srvctl命令查看、修改SCAN监听器端口、调整监听参数的完整步骤,并分析SCAN监听器与本地监听器(LOCAL LISTENER)的协作机制。同时针对SCAN监听器无法启动、客户端TNS配置报错、连接未走SCAN等高频故障给出排查思路,帮助读者彻底掌握RAC环境下的连接管理。

SCAN(Single Client Access Name)是Oracle从11g R2开始在RAC架构中引入的客户端访问机制,它用一个统一的名称屏蔽了底层集群节点的物理拓扑。客户端只需要在TNS配置中写上SCAN名称和端口,无需关心集群有几个节点、节点IP是多少,就能透明地完成连接。而SCAN listener(SCAN监听器)正是这套机制的核心执行者,它接收客户端请求后,根据负载情况把连接重定向到负载较轻的节点VIP上。本文将围绕SCAN listener的配置方法、参数调整和故障排查展开详细讲解。

Oracle RAC中SCAN监听器如何正确配置?详解SCAN listener配置步骤与常见问题

SCAN listener的工作原理与前置条件

要理解SCAN listener的配置,首先要知道它的运行位置。在标准的RAC部署中,SCAN监听器并不运行在数据库实例所在的节点上,而是由Grid Infrastructure(GI)统一托管,通常与SCAN IP绑定。一个标准的RAC集群会有3个SCAN IP,对应3个SCAN监听器进程,这三个监听器可以分布在不同的节点上,由集群软件自动调度。客户端发起连接时,DNS将SCAN名称解析为3个SCAN IP中的一个(通常采用轮询方式),客户端连接到该IP上的SCAN监听器,SCAN监听器再根据各节点当前的连接负载,把连接重定向(redirect)到某个节点的本地监听器上,最终由本地监听器完成与实例的对接。

这套机制的前置条件是SCAN名称必须能被解析出3个IP。生产环境强烈推荐用DNS做轮询解析,测试环境如果暂时没有DNS,可以在所有客户端和集群节点的hosts文件中把SCAN名称映射到3个SCAN IP。但要注意一个常见的错误做法:把SCAN名称直接解析到节点PUBLIC IP或VIP上。这样做的后果是SCAN监听器无法正常工作,客户端连接行为变得不可预测,Oracle官方也明确不建议在hosts文件中混合配置SCAN。如果发现SCAN解析异常,可以通过以下命令检查:

# 查看当前SCAN配置,确认SCAN名称和IP数量
srvctl config scan

# 输出示例:
# SCAN name: rac-scan, Network: 1/192.168.10.0/255.255.255.0/eth0
# SCAN VIP name: scan1, IP: /192.168.10.101/192.168.10.101
# SCAN VIP name: scan2, IP: /192.168.10.102/192.168.10.102
# SCAN VIP name: scan3, IP: /192.168.10.103/192.168.10.103

正常情况下应该看到3个SCAN VIP。如果只显示1个,说明安装时DNS或hosts配置有问题,需要修正解析后再通过srvctl modify scan更新。另外还要确认SCAN监听器的状态,使用srvctl status scan_listener查看,三个监听器都应该处于Running状态,且分布在允许的节点上。

SCAN listener的配置与参数调整

SCAN监听器的创建和删除一般由GI在安装阶段自动完成,DBA日常更多的是做调整。最常见的调整是端口。SCAN监听器默认监听1521端口,如果出于安全或网络规划需要改成其他端口(比如15211),不能用传统的lsnrctl命令去改,而必须使用srvctl,因为SCAN监听器的定义存储在OCR(Oracle Cluster Registry)中,直接改listener.ora文件会被集群覆盖。正确的操作步骤是先改SCAN监听器端口,再修改数据库的remote_listener参数,最后确认本地监听器配置与之匹配:

-- 第一步:查看当前SCAN监听器端口
srvctl config scan_listener

-- 第二步:修改SCAN监听器端口为15211
srvctl modify scan_listener -p 15211

-- 第三步:重启SCAN监听器使端口生效
srvctl stop scan_listener
srvctl start scan_listener

-- 第四步:在数据库中更新remote_listener指向新端口
sqlplus / as sysdba
SQL> alter system set remote_listener='rac-scan:15211' scope=both sid='*';
SQL> alter system register;

第四步非常关键但经常被忽略。remote_listener参数决定了PMON(或LREG进程)向哪个监听器注册实例信息。如果SCAN监听器端口改了而remote_listener没改,实例就不会向新的SCAN监听器端口注册,客户端虽然能连上15211端口,但SCAN监听器里没有任何服务信息,连接会报ORA-12514错误。执行alter system register可以强制立即注册,否则要等PMON的下一个注册周期。

另一个需要理解的参数是local_listener。在RAC中,每个实例的本地监听器监听在节点VIP上,默认端口1521。当本地监听器端口也改变时,需要给每个实例单独设置local_listener,例如:alter system set local_listener='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.11)(PORT=15221)))' scope=both sid='racdb1';。注意这里sid要指定具体实例,因为不同节点的VIP不同。如果嫌地址串难写,也可以在GI的listener.ora中定义一个别名,然后local_listener直接引用别名。

客户端TNS配置与连接验证

SCAN架构下客户端的TNS配置有明显的变化。传统单实例或者10g/11g R1时代的写法是把所有节点VIP都列在ADDRESS_LIST里,这种写法在SCAN环境下不再需要。标准写法只需要SCAN名称加端口,配合SERVICE_NAME即可:

RACDB_SCAN =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 15211))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = racdb)
    )
  )

如果客户端版本较低(10g客户端连11g R2 RAC),有一个已知的兼容性问题:10g客户端不能自动识别SCAN返回的重定向地址,需要加上(FAILOVER = ON)或在CONNECT_DATA中使用CONNECT_TIMEOUT,或者直接改用EZCONNECT方式。建议生产环境尽量使用11g以上的客户端,可以完整享受SCAN带来的负载均衡能力。

配置完成后需要验证连接是否真的走了SCAN。最直接的验证方法是连接后在数据库里查询,通过select inst_id, username, machine from gv$session where username='TEST';观察machine列和连接分布的实例。多次发起连接,如果连接均匀分散到各个实例,说明SCAN负载均衡工作正常;如果全部落在某一个实例,可能是客户端缓存了DNS解析结果,也可能是某个节点的remote_listener注册不正常。此时可以在SCAN监听器上执行lsnrctl status LISTENER_SCAN1查看服务注册摘要,确认所有实例的服务都注册上来了。

SCAN listener常见故障排查

第一个高频问题是SCAN监听器无法启动。遇到这种情况先看SCAN VIP的状态,SCAN监听器依赖SCAN VIP,VIP没起来监听器必然起不来。用srvctl status scan检查,如果VIP离线,查看alert日志和集群资源的依赖关系,常见原因包括网卡故障、公网网络不通、或者SCAN IP与其他设备地址冲突。还有一种情况是GI的grid用户与oracle用户对监听器目录权限不一致导致启动失败,这时要检查GRID_HOME下的log目录权限。

第二个问题是客户端报ORA-12514(服务未注册)。排除TNS拼写错误后,重点检查数据库参数remote_listener的值是否与SCAN监听器实际监听的名称端口一致,同时确认执行过register操作。在12c及以后的版本中,如果使用了容器数据库,还要确认服务是通过srvctl创建并正确注册的,手工用DBMS_SERVICE创建的服务在重启后可能不会自动注册到SCAN监听器。管理服务的推荐方式是srvctl add service -db racdb -service oltp -preferred racdb1 -available racdb2,集群会保证服务的注册和高可用切换。

第三个问题涉及节点重启或故障切换时的行为。SCAN监听器跟随SCAN VIP漂移,当某个节点故障时,该节点上的SCAN VIP和监听器会在几秒内漂移到存活节点继续服务,客户端几乎无感知。但要注意漂移期间发起的连接可能失败,应用侧应配置连接重试逻辑(如JDBC的连接池重试),而不是依赖数据库层面完全无中断。此外,检查remote_listener时不要写死某个SCAN IP,一定要写SCAN名称,否则VIP漂移后监听器注册会失效,这是生产环境一个典型的隐患。

总结来说,SCAN listener的配置核心在于三点:保证SCAN名称正确解析出3个IP、所有变更通过srvctl完成并同步更新数据库参数、客户端TNS只使用SCAN名称。掌握这三点,配合文中给出的排查命令,大部分SCAN相关的连接问题都能快速定位和解决。

Oracle RACSCAN listener监听器配置修改时间:2026-09-09 05:48:43

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260909/53229.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。