Oracle 19c RAC基于DNS的SCAN地址解析配置方法
Oracle19cRAC强制SCAN域名至少解析出2个独立IPv4A记录,建议配置3个并禁用CNAME。修改后执行`srvctlmodifyscan_listener-u`生效。` etc hosts`每行一个IP加域名,客户端连接必须使用域名。
Oracle 19c RAC 强制规定 SCAN 域名必须解析出至少 2 个独立的 IPv4 A 记录,否则srvctl start scan会静默失败,或者 SCAN 监听器绑定不完整。一个稳妥的做法是配置 3 个不同的 A 记录,同时禁用 CNAME,最后执行srvctl modify scan_listener -u使其生效。
SCAN 域名必须返回至少 2 个独立 IPv4 A 记录
Oracle 19c Grid Infrastructure 启动时,会调用 getaddrinfo() 对 SCAN 域名进行解析校验。如果只返回 1 个 IPv4 地址,srvctl start scan 就会静默失败,或者 srvctl status scan_listener 显示监听器没有绑定全部 VIP。这并非配置遗漏,而是 19c 的强制校验逻辑——对,就是这么严格。

- DNS 需要为 SCAN 域名(例如
rac-scan.example.com)配置 3 个不同 的 A 记录,例如10.10.10.25、10.10.10.26、10.10.10.27 - 禁止使用 CNAME:19c 不会递归解析 CNAME,即使目标域名背后有多个 A 记录也无济于事
- 验证方法:运行
dig rac-scan.example.com A +short或nslookup rac-scan.example.com,输出必须是三行独立 IP 地址 - 集群所有节点的
/etc/resolv.conf必须指向同一个 DNS 服务器,而且/etc/nsswitch.conf中hosts:这一行绝对不能把files放在dns前面
/etc/hosts 中编写 SCAN 多 IP 的唯一正确写法
虽然 Oracle 官方不推荐使用 /etc/hosts,但在没有 DNS 的环境(例如离线测试)中,必须严格按照三行独立 IP 来编写,否则 Grid 仍然只识别一个 IP。
- 每行一个 IP 加域名,不能合并:
10.10.10.25 rac-scan.example.com10.10.10.26 rac-scan.example.com10.10.10.27 rac-scan.example.com - 不能写成
10.10.10.25 10.10.10.26 10.10.10.27 rac-scan.example.com——getaddrinfo()只会提取第一个 IP - 修改后必须执行
srvctl modify scan_listener -u刷新监听器绑定,否则新 IP 不会生效 - 注意:这个写法仅在 19c 中有效,12c 及更早版本的行为完全不同
客户端 TNS 或 JDBC URL 必须使用括号语法,禁止直接填写 IP 地址
SCAN 的核心价值在于解耦客户端与具体 IP。一旦有人将 SCAN 域名替换为 IP,或者在 URL 中硬编码多个 ADDRESS,就会直接绕过 SCAN 的负载均衡和故障转移能力——那就白费力气了。
- Spring Boot 的
spring.datasource.url必须以@(DESCRIPTION=开头,例如:jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac-scan.example.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCLCDB))(FAILOVER=on)(LOAD_BALANCE=on)) - TNSNAMES.ORA 中不能写
HOST=10.10.10.25,必须是HOST=rac-scan.example.com - 缺少
FAILOVER=on或LOAD_BALANCE=on参数时,驱动默认不会启用 RAC 特性,连接将变成单点直连 - Oracle JDBC 驱动(ojdbc8+)只有在 URL 匹配
@(DESCRIPTION=模式时才会触发 SCAN 解析逻辑
注意区分 DNS 缓存与注册状态
DNS 解析结果发生变化后,Grid 不会自动重新拉取,但客户端连接行为会受到两层缓存的影响:操作系统 DNS 缓存,以及 Oracle 监听器的服务注册状态。
- 修改 DNS 后,建议在集群节点执行
systemctl restart nscd清除本地缓存,否则可能出现nslookup返回新 IP 但 Grid 仍然使用旧结果的情况 srvctl status scan仅反映 SCAN VIP 是否上线,并不代表实例已经注册到 SCAN 监听器。需要确认各节点local_listener指向本机监听器,且remote_listener设为 SCAN 域名- 如果客户端连通但负载不均,先检查
lsnrctl services LISTENER_SCAN1,查看输出中是否有多实例的服务名注册进来 - 防火墙经常被忽略:确保 SCAN VIP 所在网段的
1521端口在所有节点的 public 网卡上双向开放
实际部署中最容易卡住的地方不是 DNS 本身,而是 /etc/nsswitch.conf 中 hosts: files dns 顺序写反,或者 srvctl modify scan_listener -u 没有执行。这两处一错,哪怕 DNS 返回了三个 IP,Grid 也只会认第一个——细节决定成败。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
SQL Server多用户并发INSERT幻读解决方案
SQLServer中幻读源于“先查后插”业务的间隙漏洞,SERIALIZABLE隔离级别不能覆盖多语句操作且依赖索引。真正解决需将“读-判-写”绑定为原子动作,如使用MERGE语句、唯一索引加错误捕获或UPDLOCK加HOLDLOCK手动锁范围,并确保查询走索引及显式开启事务。
Django项目利用安全库规避SQL注入的方法
DjangoORM仅对值参数化,字段名等结构参数需白名单校验。filter()动态字段名、raw()和extra()参数化、RawSQL中LIKE手动转义及ORDERBY等结构字段均为注入风险点,需严格规避用户直接控制。
SQL分组统计状态变更次数的方法
通过LAG()窗口函数对比相邻行状态变化并计数,是统计分组内状态改变次数的核心方法。需严格按业务逻辑排序、正确分区,并处理NULL边界。旧版MySQL可考虑导出数据用脚本处理。性能优化需建立复合索引,避免函数影响。状态定义需明确连续相同值过滤等陷阱。
MySQL数据排序的原理与实现步骤
MySQL排序采用文件排序或索引排序,数据量大时使用合并排序。内存排序由sort_buffer_size控制,超限则转磁盘临时表。索引排序效率高,覆盖索引可避免回表。通过EXPLAIN可分析是否使用索引、临时表或文件排序,据此优化性能。
如何定位MySQL撤销日志页锁定导致的检查点延迟
UndoLog页被锁定本身不直接导致CheckPoint延迟,根因是长事务阻塞purge线程导致undo记录无法清理。通过Historylistlength超万且增长、PURGEPROCESSED停滞、事务ID与清理ID差距扩大可判断。定位需查最老活跃事务及其undo段与purge线程状态。
- 热门数据榜
相关攻略
2026-07-12 07:09
2026-07-12 07:08
2026-07-12 07:08
2026-07-12 07:08
2026-07-12 07:08
2026-07-12 07:08
2026-07-12 07:08
2026-07-12 07:08
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

