Oracle RAC集群的启动过程涉及多个层次,从OHASD到CRSD,中间有一个环节非常关键,就是集群节点如何发现同伴、如何找到ASM磁盘组里的 Voting Disk 和 OCR。这个信息链条的起点就是GPnP profile,也就是常说的GPnP配置文件。它相当于集群的出生证明,一旦损坏或配置错误,整个节点都无法加入集群。本文从文件位置、内容结构、查看方法、修改场景和恢复手段几个方面详细展开。

GPnP profile是什么,存放在哪里
GPnP的全称是Grid Plug and Play,是Oracle 11.2版本引入的集群特性。它的核心目标是让集群节点的身份不再与物理主机名、IP地址强绑定,从而支持动态扩容和IP池管理。GPnP profile是一个XML格式的文件,里面记录了集群的名字、网络接口配置、ASM的spfile位置、ASM磁盘发现字符串等信息。
在11.2和12.1版本中,profile文件存放在GRID_HOME的gpnp目录下,路径通常是$GRID_HOME/gpnp/<hostname>/profile/peer/profile.xml,这里的hostname指的是节点的物理主机名。注意这个目录名在节点改名后不会自动更新,是安装时的原始主机名。
从12.2开始引入了所谓的read-only Oracle Home概念,同时profile的存放位置发生了变化。如果使用读写模式的GI_HOME,路径仍然是老样子;如果是只读HOME,profile则存放在/etc/oracle/gpnp/<hostname>/profile/peer/profile.xml或者Oracle Base对应的gpnp目录下。除了本地文件,profile还有一个备份存放在ASM磁盘组中,通常是存放在存放OCR的磁盘组里,这就是为什么本地profile损坏后还可以从ASM里恢复的原因。
需要理解的一点是,本地profile文件只是一个缓存副本,集群运行过程中真正生效的版本会由GPnP daemon(gpnpd.bin)负责在各节点之间同步,并推送到ASM磁盘组中保存。节点启动时gpnpd先读本地文件,再尝试从ASM中获取最新版本做比较。
profile文件的结构和关键字段解读
profile是一个标准的XML文件,用普通文本编辑器打开就能看到内容。下面是一个简化后的示例:
<?xml version="1.0" encoding="UTF-8"?>
<gpnp:GPnP-Profile Version="11.2.0.2.0" id="b1c2d3e4"
xmlns="http://www.grid-init.com/GPnP-profile"
xmlns:gpnp="http://www.grid-init.com/GPnP-profile"
xmlns:orcl="http://www.oracle.com/GPnP-profile"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<gpnp:Network-Profile>
<gpnp:HostNetwork default_host="pub" haip_offload="on">
<gpnp:Network id="pub" host="eth0" ip="192.168.10.0" netmask="255.255.255.0"/>
<gpnp:Network id="cluster_interconnect" host="eth1" ip="169.254.0.0"
netmask="255.255.128.0" use="cluster_interconnect,asm"/>
</gpnp:HostNetwork>
</gpnp:Network-Profile>
<orcl:CSS-Profile id="css" DiscoveryString="+asm" LeaseDuration="400"/>
<orcl:ASM-Profile id="asm" DiscoveryString="/dev/asm*" SPFile="+OCR/vote/registry.255.987654321"/>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
......签名信息......
</ds:Signature>
</gpnp:GPnP-Profile>几个重要字段需要重点关注。Network-Profile部分定义了公有网络和私有网络,其中use="cluster_interconnect,asm"标识的网卡就是集群互联网络,如果这行配置写错,节点之间无法通信,会直接报无法加入集群的错误。CSS-Profile中的DiscoveryString是集群层面对Voting Disk的定位线索, LeaseDuration则是节点租约时长。
ASM-Profile里的SPFile属性非常关键,它指明了ASM实例的参数文件位置。设想一下启动顺序:OHASD拉起ASM实例,ASM要读spfile,而spfile在ASM磁盘组里,磁盘组又依赖磁盘发现字符串,这些信息全写在profile里,形成了一个自举链条。一旦这个字段指向了一个不存在的磁盘组,ASM起不来,OCR也就无法加载,整个集群卡死在启动阶段。
最后的Signature是数字签名。GPnP profile的内容是有完整性校验的,任何手工修改都会导致签名失效,gpnpd会拒绝加载被篡改的profile。这也是绝对不能用vi直接编辑profile文件的原因,必须通过工具修改,工具会自动重新计算签名。
如何查看和修改GPnP profile
查看profile的标准做法不是直接cat文件,而是使用GPnP工具。先设置环境变量指向GRID_HOME下的gpnp工具目录:
export ORACLE_HOME=/u01/app/19.0.0/grid cd $ORACLE_HOME/bin # 导出当前生效的profile到本地文件 ./gpnptool get -o=/tmp/profile_current.xml # 查看profile内容(p选项输出到stdout) ./gpnptool getp -p=/tmp/profile_current.xml
如果要查看某个具体属性,比如ASM的spfile位置,可以用getp命令配合xpath过滤:
# 查询ASM spfile位置 ./gpnptool getp -p=/tmp/profile_current.xml \ -o-n="orcl:ASM-Profile@SPFile" # 查询私有网络的配置 ./gpnptool getp -p=/tmp/profile_current.xml \ -o-n="gpnp:Network-Profile/gpnp:HostNetwork/gpnp:Network@use"
修改profile的场景中最常见的是更换私有网卡的网卡名或网段。正确的操作流程是:先用get导出,再用editp修改对应属性,接着用sign重新签名,最后用put推送到集群生效。整个过程要保证集群所有节点都能访问到新的网络配置,否则会出现脑裂。示例流程如下:
# 第一步:导出profile ./gpnptool get -o=/tmp/profile_base.xml # 第二步:修改私有网络的接口名 ./gpnptool editp -p=/tmp/profile_base.xml \ -o-n="gpnp:Network-Profile/gpnp:HostNetwork/gpnp:Network@host" \ -ov=eth3 -on=cluster_interconnect -o=/tmp/profile_new.xml # 第三步:重新签名 ./gpnptool sign -p=/tmp/profile_new.xml \ -w=csr:/tmp/pw.txt -o=/tmp/profile_signed.xml # 第四步:推送到集群 ./gpnptool put -p=/tmp/profile_signed.xml
其中-w=csr:指向的是grid用户的wallet密码文件,这个密码在安装网格架构时设置过,忘记密码就无法完成签名,只能重建wallet,所以密码文件一定要妥善保管。
profile损坏后的恢复方法与注意事项
实际运维中最麻烦的情况是本地profile损坏或者签名校验失败,导致节点启动时gpnpd报错。典型的告警日志关键字是Profile authentication failed或者failed to load GPnP profile。遇到这类问题的处理思路分两步:先确认ASM磁盘组中的副本是否完好,再决定恢复方式。
如果集群其他节点还正常,最简单的办法是把正常节点的profile文件通过scp复制过来,放到本地对应的gpnp profile目录下,覆盖时先备份原文件,然后重启crsd相关组件即可。单节点情况下,需要用gpnptool的creategpnp参数重建,或者借助ASM磁盘组中的副本。可以先尝试用如下命令验证签名状态:
# 校验profile签名是否有效 ./gpnptool check -p=/tmp/profile_current.xml # 如果本地无法读取,尝试强制从ASM副本获取 ./gpnptool get -o=/tmp/profile_from_asm.xml -asm-asm-diskgroup=OCR # 若ASM不可用,则直接指定磁盘路径 ./gpnptool get -o=/tmp/profile_from_asm.xml -asm-disk=/dev/asm-disk1
几点注意事项必须牢记。第一,任何修改前先备份profile文件,备份文件本身不参与签名校验,放着无害。第二,修改网络配置时要保证新的网卡名在操作系统层面已经配置好并且两个节点互通,否则push之后集群会失联。第三,11.2版本的私网IP如果用了HAIP,profile里看到的169.254开头的地址是HAIP自动分配的链路本地地址,不要手工去改它。第四,如果遇到profile指向的spfile所在磁盘组整个丢失的情况,需要用带有-nodisk DiscoveryString相关参数的方式重建启动配置,这属于比较极端的恢复操作,建议在Oracle支持指导下进行。
总的来说,GPnP profile虽然是一个不起眼的小文件,但它是RAC集群自举链条的第一环。理解它的存放位置、结构含义和修改方法,在面对集群无法启动这类棘手问题时就有了明确的排查方向,也能在日常的网络变更操作中避免踩坑。
Oracle RACGPnP配置文件GPnP profile修改时间:2026-09-13 16:53:01