RAC服务器主机名不仅仅是服务器的一个”名字”,它在整个Oracle RAC集群架构中承担着节点身份标识、通信寻址和资源协调的核心作用,一旦配置不当或规划失误,轻则集群无法正常启动,重则导致脑裂或数据损坏。
很多刚接触Oracle RAC的DBA经常问:主机名随便起一个不就行了?答案是绝对不行,主机名在RAC环境中是集群配置的基石,从安装前的规划到日常运维,它都贯穿始终,下面从实际部署和故障处理的角度,把主机名这件事彻底讲清楚。
RAC主机名的核心作用域
主机名在RAC中不是一个孤立的字符串,它与操作系统内核参数、集群心跳机制以及Oracle的CRS(Cluster Ready Services)进程深度绑定。
节点身份的唯一标识
在RAC集群中,每个节点都有一个唯一的节点编号,而这个编号就是通过主机名映射的。olsnodes -n命令输出的节点名和编号就源自/etc/hosts中的主机名定义,集群软件在启动时,会读取主机名去匹配OCR(Oracle Cluster Registry)中记录的资源归属,如果主机名在安装后随意修改,OCR中的资源路径全部失效,crsctl stat res -t查出来全是UNKNOWN状态。
私有网络通信的寻址锚点
RAC最核心的Cache Fusion技术需要节点间通过私有网络进行高速数据块传输,这个私有网卡的IP和主机名必须绑定,行业共识认为,私有网卡的主机名解析绝不能依赖DNS,必须写入/etc/hosts,比如rac1-priv和rac2-priv这种命名,就是用来区分心跳流量的,而心跳传输一旦因主机名解析超时而中断,集群会立即触发重组逻辑。
与SCAN IP的协同关系
考察集群对外连接时,SCAN IP(Single Client Access Name)是客户端入口,但SCAN监听器在启动时依然要回调节点主机名来校验注册信息,如果节点主机名中包含大写字母或下划线这类不规范字符,crsctl status resource ora.scan1.vip可能会报网络校验错误,SCAN IP的解析结果必须回落到集群节点的公网主机名段,否则客户端连接池会出现间歇性ORA-12545错误。
主机名配置错误的典型故障场景
主机名规划不只关乎安装顺手,以下三类故障在运维中相当常见,需要重点规避。
IPv6解析引发的挂起问题
弱化主机名的解析顺序会直接导致集群启动挂起,很多环境在/etc/hosts中只写了IPv4地址,但操作系统开启了IPv6协议栈,此时gethostbyname尝试解析主机名的IPv6地址(:1),导致/etc/init.d/init.ohasd脚本长时间无响应,具体表现是crsctl start crs卡死,解决办法是规划主机名时,同步在/etc/hosts中写入如下两行:
::1 rac1 localhost6.localdomain6 localhost6 rac1 192.168.1.11 rac1 rac1.localdomain
这样强制绑定IPv4与主机名,避免解析走回环地址。
脑裂检测中的仲裁干扰

RAC避免脑裂依赖Voting Disk,但决定哪个子集群存活时,会参考节点间的网络连通性,如果两台服务器的/etc/hosts中主机名互相映射错误(比如rac1的公网IP被误写给了rac2),集群心跳会误判对方节点已死,实战中常见的结果是集群日志频繁刷Network Heartbeat lost,最终触发CSSD强制驱逐节点,这里就需要保证公网主机名、私网主机名不要混写IP,各司其职。
多实例并发下的监听注册混乱
在RAC中,实例注册到监听器时,默认使用LOCAL_LISTENER参数,该参数通常写的是主机名加端口号。
ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))' SID='orcl1';
每次重启实例都会解析rac1-vip这个别名,它依赖/etc/hosts的映射项,一旦该映射缺失,实例会有较大比例概率注册到其他节点的监听器,导致服务端连接被重定向到错误实例,观察lsnrctl services | grep orcl的输出即可发现实例与节点不匹配。
主机命名的规范与规划建议
如果无法掌握规范的命名体系,建议直接参考GI(Grid Infrastructure)官方安装文档的基础架构建议。
命名长度与字符集约束
- 主机名长度不得超过15个字符,这个限制来源于操作系统的
UTS_NODENAME长度,以及Oracle对节点名做MD5转发时对标签长度的隐式约束,过长会在root.sh执行时报告node name too long。 - 允许字符仅为字母(a-z/A-Z)、数字、短横线(-),禁止下划线,虽然Linux内核本身允许下划线,但Oracle的CSS进程在解析绝对路径时会把下划线当作特殊字符处理。
- 首字符禁止为数字
0-9,以数字开头的主机名在GI的gethostname解析中会返回非零退出码,直接导致crsctl命令返回CRS-0215。
公网与私网主机名分离
在一个双节点RAC环境中,规划如下四种主机名变体:
| 用途 | 主机名示例 | IP段要求 | 解析位置 |
|---|---|---|---|
| 公网主机名 | db1-prd |
与业务网段一致 | DNS或/etc/hosts |
| 虚拟IP主机名 | db1-prd-vip |
与公网同网段 | 交给DNS或hosts |
| 私网主机名 | db1-prd-priv |
单独的10.x.x.x或专用心跳网段 | 仅写入/etc/hosts |
| SCAN主机名 | scan-cluster |
与公网同网段 | 必须使用DNS解析 |
需要注意的是:公网和私网的网段必须逻辑隔离,若误将私网规划为网关可达的普通地址,tcp心跳包仍能通,但实际访问路径穿过路由器后会产生毫秒级延迟,长期运行会降低集群事务吞吐。

详尽的hosts文件编写
实践中,宁可把无关映射注释掉,也不要混写,一个双节点生产库的/etc/hosts最小实践如下:
0.0.1 localhost localhost.localdomain
::1 localhost localhost6.localdomain6
# 公网地址
10.0.1.1 db1-prd db1-prd.example.com
10.0.1.2 db2-prd db2-prd.example.com
# 虚拟IP地址
10.0.1.3 db1-prd-vip db1-prd-vip.example.com
10.0.1.4 db2-prd-vip db2-prd-vip.example.com
# 私网地址
192.168.1.1 db1-prd-priv
192.168.1.2 db2-prd-priv
这里特别需要提醒:私网IP不要进行反向解析(PTR记录)配置,若配置了PTR,CSS进程在每次心跳时会尝试反向解析确认目标身份,一旦PTR未配置或被防火墙过滤,会引发约10秒的连接超时,这个超时在crsctl debug日志中表现为gipcd进程报GIPC_ERROR_TIMED_OUT。
修改主机名的风险控制与操作方法
如果已经安装了GI才意识到主机名不合适,此时修改的代价比安装初期大不少,需要按步骤操作。
前置评估
执行crsctl query crs activeversion确认集群版本,并检查以下资源是否全部处于ONLINE状态:
ora.asmora.cssdora.crsd
存在OFFLINE资源时,修改主机名极易导致OCR配置与集群状态失联,更直接的风险是:在Oracle 19c和21c环境中修改主机名后,/etc/oracle/olr.loc指向的本地注册表会失效,若未提前关闭集群,OLR文件访问不到时会触发hasd多次重启,技术上的安全做法是先更新操作系统层面的主机名,再执行root.sh重新注册GI。
快速变更步骤
在确保数据库已经正常关闭,且集群已经通过crsctl stop crs停掉后,按如下步骤执行:
# 临时与永久修改主机名 hostname db1-new echo "db1-new" > /etc/hostname # 刷新/etc/hosts vi /etc/hosts # 重新配置网络服务 systemctl restart systemd-hostnamed # 重跑GI配置 cd /u01/app/19.0.0/grid root.sh
执行完成后,务必使用olsnodes -s -t检查节点属性,重点观察State列应为ACTIVE,Type列应为pin。
修改后的联动验证
- 用
cluvfy stage -post crsinst -n db1-new验证节点健全性中“包、内核参数、系统权限”模块的合规性。 - 使用
crsctl status resource ora.cluster_interconnect.haip确认HAIP(高可用IP)已重新绑定了新的主机名。 - 进入SQLPlus执行
select instance_name from v$instance;,确认实例参数PREFERRED与主机名的映射还是否正确。
主机名在异机恢复与克隆中的特殊作用
RAC文件系统迁移或克隆到新服务器时,主机名的影响很容易被低估。
归档恢复场景

当使用rman restore把数据库恢复到一套全新的RAC环境后,如果新旧节点主机名不一致,spfile中的cluster_database=true参数会导致ASM实例无法被调度,此时需要以pfile方式启动实例,并手动更新sid:
CREATE PFILE='/tmp/pfile.ora' FROM SPFILE;
然后在pfile中强制指定:
.cluster_database=FALSE
.db_unique_name=NEWDB
并注释掉里面所有关于旧主机名的配置信息,这里可以验证一点:在ASM磁盘组中,文件别名存储的节点归属路径仍然带着旧主机名,若要彻底远离歧义,可导出数据后重建目录结构。
虚拟机模板部署
虚拟化平台上复制虚拟机模板是RAC折腾的高发区,复制出来的第二台虚拟机如果未修改主机名,在加入集群时,强制导致/etc/oracle/crs/ocr中注册的节点名冲突,操作上应做到:
- 在复制前先执行
crsctl delete node -n oldhostname注销节点。 - 清理
/etc/oracle/ocr.loc及/u01/app/19.0.0/grid/cdata/目录中残留的配置文件。 - 删除
/etc/udev/rules.d/70-persistent-net.rules,防止网卡MAC绑定错误导致公网主机名无法对外访问。
RAC主机名与云端部署的特殊差异
云环境下的RAC,通常使用云厂商提供的私有网络,DNS解析依赖于云平台内置的Resolver,此时主机名的规划自由度变小,推荐的做法是将云实例的私有IP与自定义主机名解耦,在/etc/hosts中压实映射,减少对云DNS的依赖,基于云厂商裸金属实例构建RAC时,多网卡绑定需要将网卡的NM_CONTROLLED=no,避免NetworkManager自动重写hostname,覆盖手动配置。
有几个区域需要注意:部分云服务商的DHCP会在实例每次启动时下发新的hostname,这非常影响RAC集群的稳定性,建议在/etc/sysconfig/network-scripts/ifcfg-eth0中显式写入DHCP_HOSTNAME=db1-prd,保持主机名的一致性。
Q&A模块
RAC主机名可以包含大写字母吗?
可以包含大写字母,但不建议,Linux系统大小写敏感,Oracle CRS在启动时会将节点名统一按小写处理,若hostname中实际包含大写,crsctl status resource输出的状态可能会反复无常,部分场景下,安装Grid时会遇到PRVF-0002报错,正是集群中节点主机名大小写不一致,统一使用小写字符是规避风险的最佳选择。
修改RAC主机名后,数据库需要重启几次?
需要重启两次,第一次是关闭数据库实例与ASM实例,第二次是重启整个集群使GI的监听和VIP资源适应新名称,若需要清理ASM实例中的旧监听地址,还得在两次重启之间执行srvctl stop listener -n oldname,实际上相当于四次重启,但若是只改动公网主机名中的纯别名部分(后缀),且IP不变,则只需重启节点验证即可。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/795434.html


评论列表(3条)
读了这篇文章,我深有感触。作者对地址的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
@甜菜808:这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是地址部分,给了我很多新的思路。感谢分享这么好的内容!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于地址的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!