从11g R2 开始,ASM spfile 会自动存储在安装集群软件时创建的第一个磁盘组中,一般为OCR磁盘组。
由于投票盘/OCR 存储在 ASM 上,因此需要在节点上启动 ASM。要启动 ASM,需要其 SPFILE 。但 SPFILE 仅位于 ASM 磁盘组上。集群是如何解决这个问题呢?
- 当 Oracle Clusterware 集群的节点重新启动时,OHASD 将通过特定于平台的方式启动。OHASD 访问存储在本地文件系统上的 OLR(Oracle 本地注册表),以获取完成 OHASD 初始化所需的数据
- OHASD 调出 GPNPD 和 CSSD。CSSD 访问存储在本地文件系统上的 GPNP 配置文件,其中包含以下重要的引导数据;
1. ASM_DISKSTRING参数(如果指定)以查找配置了 ASM 磁盘的磁盘。
2. ASM SPFILE 位置:包含 ASM spfile 的磁盘组的名称.
3. 投票文件的位置 : ASM– CSSD 扫描所有 ASM 磁盘的标头(如 GPnP 配置文件中的ASM_DISKSTRING所示)以识别包含投票文件的磁盘。使用 ASM 磁盘头中的指针,CSSD 可以访问 ASM 磁盘上的投票文件位置,并且 CSSD 能够完成初始化并启动或加入现有集群。
要在 ASM 实例启动期间读取 ASM spfile,无需打开磁盘组。访问数据所需的所有信息都存储在设备的头部中。OHASD 读取包含 ASM SPfile 的 ASM 磁盘的标头(从 GPnP 配置文件读取),并使用磁盘标头中的指针读取 ASM spfile 的内容。此后,将启动 ASM 实例。
– 在 ASM 实例运行并挂载其磁盘组的情况下,CRSD 可以访问 Clusterware 的 OCR。
– OHASD 通过访问 ASM 磁盘组中的 OCR 来启动 CRSD。
– Clusterware完成初始化并启动其控制下的其他服务。
根据上述流程进行Spfile文件的获取:
第一步 通过gpnp配置文件找出ASM Spfile的位置
gpnptool get |grep ASM-Profile
--获取到以下信息
ASM-Profile id="asm" DiscoveryString="/dev/mapper/*" SPFile="+OCR_VOTE/rac-cluster/asmparameterfile/registry.253.1088942297"
找出ASM磁盘组对应的磁盘列表
[grid@rac01 ~]$ asmcmd lsdsk -G OCR_VOTE
---------------------------------
Path
/dev/mapper/ocr_vote01
/dev/mapper/ocr_vote02
/dev/mapper/ocr_vote03
[grid@rac01 ~]$ ll /dev/mapper/ocr_vote*
lrwxrwxrwx 1 root root 7 Jun 10 10:48 /dev/mapper/ocr_vote01 -> ../dm-2
lrwxrwxrwx 1 root root 7 Jun 10 10:48 /dev/mapper/ocr_vote02 -> ../dm-3
lrwxrwxrwx 1 root root 7 Jun 10 10:48 /dev/mapper/ocr_vote03 -> ../dm-4
第二步 扫描磁盘的盘头
[root@RAC01 ~]# kfed read /dev/dm2 | grep -E 'spf|ausize'
kfdhdb.ausize: 4194304 ; 0x0bc: 0x00400000
kfdhdb.spfile: 27 ; 0x0f4: 0x0000001b
kfdhdb.spfflg: 1 ; 0x0f8: 0x00000001
[root@RAC01 ~]# kfed read /dev/dm3 | grep -E 'spf|ausize'
kfdhdb.ausize: 4194304 ; 0x0bc: 0x00400000
kfdhdb.spfile: 0 ; 0x0f4: 0x00000000
kfdhdb.spfflg: 0 ; 0x0f8: 0x00000000
[root@RAC01 ~]# kfed read /dev/dm4 | grep -E 'spf|ausize'
kfdhdb.ausize: 4194304 ; 0x0bc: 0x00400000
kfdhdb.spfile: 0 ; 0x0f4: 0x00000000
kfdhdb.spfflg: 0 ; 0x0f8: 0x00000000
可以看到/dev/dm2中包含ASM Spfile (spfflg=1) 位置从磁盘offest 27(spfile 28)开始,AU大小4M(ausize 4194304).
从磁盘内将ASM Spfile 转储出来
[root@rac2 ~]#dd if=/dev/dm2 of=spfileASM_Copy.ora skip=27 bs=4M count=1
1+0 records in
1+0 records out
4194304 bytes (4.2 MB) copied, 0.0594547 s, 70.5 MB/s
[root@rac2 ~]# strings spfileASM_Copy.ora
+ASM1.__asm_max_connected_clients=5
+ASM1.__oracle_base='/oracle/gridbase'#ORACLE_BASE set from in memory value
+ASM2.__oracle_base='/oracle/gridbase'#ORACLE_BASE set from in memory value
*.asm_diskgroups='DATA'#Manual Mount
*.asm_diskstring='/dev/asm-*'
*.asm_power_limit=1
*.large_pool_size=12M
*.remote_login_passwordfile='EXCLUSIVE'
相同的办法也可以获取到OCR File
扫描votedisk的盘头
[root@rac2 ~]# kfed read /dev/asm-diskc | grep -E 'vf'
kfdhdb.vfstart: 56 ; 0x0ec: 0x00000038
kfdhdb.vfend: 64 ; 0x0f0: 0x00000040
[root@rac2 ~]# kfed read /dev/asm-diskd | grep -E 'vf'
kfdhdb.vfstart: 64 ; 0x0ec: 0x00000040
kfdhdb.vfend: 72 ; 0x0f0: 0x00000048
[root@rac2 ~]# kfed read /dev/asm-diske | grep -E 'vf'
kfdhdb.vfstart: 56 ; 0x0ec: 0x00000038
kfdhdb.vfend: 64 ; 0x0f0: 0x00000040