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