改主机名后需同步更新/etc/hostname、/etc/hosts,重跑root.sh,执行srvctl modify nodeapps更新VIP元数据,并校验OCR、ASM参数、SPFILE中主机名一致性。
改主机名后 crsctl check cluster 报 “CRS-4537: Cannot communicate with Cluster Ready Services”
这不是单纯的网络不通,而是 oracle clusterware 的本地配置还锁在旧主机名里。clusterware 启动时会读取 $oracle_home/crs/install/s_crsconfig_<code>hostname_env.txt、$grid_home/crs/admin/ocrconfig_<code>hostname.txt 这类硬编码主机名的文件,也会检查本地 /etc/hosts 和 hostname 命令输出是否一致。一旦不匹配,crs 就拒绝启动。
- 必须先停掉所有节点的
crs(用crsctl stop crs -f,别只停crsdaemon) -
/etc/hostname和/etc/hosts要同步更新,且每个节点的hostname命令输出必须和/etc/hostname一致 - 别跳过
root.sh重执行——改名后必须在每个节点以 root 身份重新运行$GRID_HOME/root.sh,它会重建 OCR 本地副本、更新集群注册信息、重写环境脚本
root.sh 执行失败提示 “ORA-15018: diskgroup cannot be created” 或 “OCR location not found”
这是 OCR 和 Voting Disk 路径或权限没对上。改主机名本身不破坏磁盘组,但 root.sh 会尝试用新主机名注册节点,如果 OCR 设备路径在 asmcmd ls 下不可见,或者 ASM 实例没起来,就会卡在这一步。
- 确保改名前 ASM 已正常运行:
crsctl stat res -t | grep asm应显示 ONLINE - 确认 OCR 设备路径仍可访问:比如是 ASM 磁盘组,用
asmcmd lsdg检查该磁盘组状态;如果是裸设备或 ACFS,确认ls -l权限为grid:oinstall且可读写 - 如果 OCR 在 ASM 中,检查
ocrcheck -config输出里的Device/File Name是否指向有效磁盘组(如+OCR),再确认该磁盘组已 mount:asmcmd lsdsk -k查磁盘,asmcmd lsdg查挂载状态
改完主机名,SCAN VIP 和 VIP 不漂移,srvctl config vip 显示旧名
VIP 和 SCAN VIP 是 Clusterware 层的资源,它们的定义存在 OCR 里,不是靠系统 hostname 自动同步的。即使主机名改了、root.sh 也跑了,这些资源元数据还是旧的,导致监听器无法绑定、客户端连不上 SCAN。
- 用
srvctl config nodeapps看当前 VIP 配置,如果显示旧主机名,说明资源没刷新 - 必须手动更新:先停资源
srvctl stop nodeapps,再用srvctl modify nodeapps -n <code>new_hostname强制重写节点级网络配置 - SCAN 相关要单独处理:
srvctl config scan查当前 SCAN 名,若需同步改 SCAN 名(非必须),用srvctl modify scan -n <code>new_scan_name;否则至少确保 DNS 或/etc/hosts中 SCAN 名解析到正确 IP
重启后 crsctl stat res -t 里 ora.asm 显示 INTERMEDIATE,ora.<code>db_name.db OFFLINE
ASM 实例起不来,通常是因为初始化参数里写的实例名(instance_name)或数据库名(db_name)与 OCR 中注册的不一致——而 OCR 注册信息依赖于建库时的主机名和 SID。主机名变了,但 $ORACLE_HOME/dbs/init+ASM.ora 或 SPFILE 里的 instance_name 可能还是旧格式(如 +ASM1_oldhost)。
- 检查 ASM SPFILE 位置:
asmcmd find + $ORACLE_SID.ora,然后用strings或asmcmd spget看instance_name值 - 如果值含旧主机名,用
sqlplus / as sysasm启动 nomount 状态,再执行:alter system set instance_name='<code>new_hostname' scope=spfile sid='*'; - 数据库实例同理:查
srvctl config database -d <code>db_name得到 Oracle Home 和 SPFILE 路径,确认instance_name和db_unique_name不含旧主机名
/etc/hostname 就完事的事。OCR、ASM 参数、VIP 元数据、SPFILE 内容,这四块全得对得上新名字,漏一个,集群就卡在某个中间态。最常被跳过的其实是 root.sh 重跑和 srvctl modify nodeapps 这两步——以为重启 CRS 就行,结果 OCR 里还记着老名字。










