ASM spfile 别名块

除了新的 ASM 磁盘头字段之外,还有一个新的 ASM 元数据块类型 KFBTYP_ASMSPFALS,它描述了 ASM spfile 别名。
ASM spfile 别名块将是 ASM spfile 中的最后一个块。

我们来看看分配单元46的最后一块:

$ kfed read /dev/sdc1 aun=46 blkn=255
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           27 ; 0x002: KFBTYP_ASMSPFALS
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                     255 ; 0x004: blk=255
kfbh.block.obj:                     253 ; 0x008: file=253
kfbh.check:                   806373865 ; 0x00c: 0x301049e9
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfspbals.incarn:              822856169 ; 0x000: 0x310bc9e9
kfspbals.blksz:                     512 ; 0x004: 0x00000200
kfspbals.size:                        3 ; 0x008: 0x0003
kfspbals.path.len:                    0 ; 0x00a: 0x0000
kfspbals.path.buf:                      ; 0x00c: length=0

这个元数据块中没有太多内容。
大多数条目都有区块头信息(字段 kfbh.)。
实际的 ASM spfile 别名数据(字段 kfspbals.
)只有很少的条目。
spfile文件化身(822856169)是文件名(REGISTRY.253.822856169)的一部分,块大小为512(字节),文件大小为3块。
路径信息为空,这意味着我实际上没有 ASM spfile 别名。

让我们创建一个。
我将首先从现有的 spfile 创建一个 pfile,然后从该 pfile 创建 spfile 别名。

$ sqlplus / as sysasm
SQL> create pfile='/tmp/pfile+ASM.ora' from spfile;
File created.
SQL> shutdown abort;
ASM instance shutdown
SQL> startup pfile='/tmp/pfile+ASM.ora';
ASM instance started
Total System Global Area 1135747072 bytes
Fixed Size                  2297344 bytes
Variable Size            1108283904 bytes
ASM Cache                  25165824 bytes
ASM diskgroups mounted
SQL> create spfile='+DATA/spfileASM.ora' from pfile='/tmp/pfile+ASM.ora';
File created.

再次查找 ASM spfile 会显示两个条目:

$ asmcmd find --type ASMPARAMETERFILE +DATA "*"
+DATA/ASM/ASMPARAMETERFILE/REGISTRY.253.843597139
+DATA/spfileASM.ora

我们现在看到 ASM spfile 本身 (REGISTRY.253.843597139) 及其别名 (spfileASM.ora)。
仔细查看 spfileASM.ora 确认这确实是注册表文件的别名:

$ asmcmd ls -l +DATA/spfileASM.ora
Type              Redund  Striped  Time             Sys  Name
ASMPARAMETERFILE  MIRROR  COARSE   MAR 30 20:00:00  N    spfileASM.ora => +DATA/ASM/ASMPARAMETERFILE/REGISTRY.253.843597139

现在检查 ASM spfile 别名块:

$ kfed read /dev/sdc1 aun=46 blkn=255
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           27 ; 0x002: KFBTYP_ASMSPFALS
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                     255 ; 0x004: blk=255
kfbh.block.obj:                     253 ; 0x008: file=253
kfbh.check:                  2065104480 ; 0x00c: 0x7b16fe60
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfspbals.incarn:              843597139 ; 0x000: 0x32484553
kfspbals.blksz:                     512 ; 0x004: 0x00000200
kfspbals.size:                        3 ; 0x008: 0x0003
kfspbals.path.len:                   13 ; 0x00a: 0x000d
kfspbals.path.buf:        spfileASM.ora ; 0x00c: length=13

现在我们看到别名文件名出现在 ASM spfile 别名块中。
请注意新的化身编号,因为这是从 pfile 创建的新 ASM spfile。

介绍

从 ASM 11.2 版开始,ASM spfile 可以存储在 ASM 磁盘组中。
实际上,在新的 ASM 安装过程中,Oracle Universal Installer (OUI) 会将 ASM spfile 放置在安装过程中创建的磁盘组中。
这适用于 Oracle Restart(单实例环境)和集群安装。
需要注意的是,安装过程中创建的第一个磁盘组是默认的 spfile 位置,但不是必需的。
spfile 仍然可以在文件系统上,比如 $ORACLE_HOME/dbs 目录中。

在 Oracle ASM 中使用 spfile
on  It Road.com

ASM spfile 发现

那么,如果 spfile 位于尚未挂载的磁盘组中,ASM 实例如何在启动时读取 spfile?
不仅 ASM 并不真正知道哪个磁盘组有 spfile,甚至 spfile 是否在磁盘组中。
ASM 发现字符串的值是什么?

ASM 管理教程对此主题进行了说明:

Oracle ASM 实例搜索初始化参数文件时,搜索顺序为:

  • 网格即插即用 (GPnP) 配置文件中指定的初始化参数文件的位置。
  • 如果未在 GPnP 配置文件中设置位置,则搜索顺序更改为:
  • Oracle ASM 实例主目录中的 SPFILE(例如 $ORACLE_HOME/dbs/spfile+ASM.ora)
  • Oracle ASM 实例主页中的 PFILE

这并没有告诉我们关于 ASM 发现字符串的任何信息,但至少它告诉我们关于 spfile 和 GPnP 配置文件。
事实证明,ASM 发现字符串也在 GPnP 配置文件中。
以下是 Exadata 环境中的值:

$ gpnptool getpval -p=profile.xml -asm_dis -o
o/*/*
$ gpnptool getpval -p=profile.xml -asm_spf -o
+DBFS_DG/spfileASM.ora

在设置的单个实例中没有 GPnP 配置文件,因此此信息位于 ASM 资源 (ora.asm) 中,存储在 Oracle 本地信息库 (OLR) 中。
以下是来自单实例环境的值:

$ crsctl stat res ora.asm -p | egrep "ASM_DISKSTRING|SPFILE"
ASM_DISKSTRING=
SPFILE=+DATA/ASM/ASMPARAMETERFILE/registry.253.822856169

到现在为止还挺好。
现在 ASM 知道在何处查找 ASM 磁盘以及 spfile 在哪里。
但是磁盘组还没有挂载,因为ASM实例还没有启动,那么ASM如何读取spfile呢?

诀窍在于 ASM 磁盘头。
为了支持磁盘组中的 ASM spfile,在 ASM 磁盘头中添加了两个新字段:

  • kfdhdb.spfile - ASM spfile 的分配单元号。
  • kfdhdb.spfflg - ASM spfile 标志。如果此值为 1,则 ASM spfile 位于此磁盘的分配单元 kfdhdb.spfile 中。

作为磁盘发现过程的一部分,ASM 实例读取磁盘头并查找 spfile 信息。
一旦找到具有 spfile 的磁盘,它就可以读取实际的初始化参数。

让我们看看我的磁盘组 DATA。
首先检查磁盘组状态和冗余

$ asmcmd lsdg -g DATA | cut -c1-26
Inst_ID  State    Type
      1  MOUNTED  NORMAL

磁盘组已挂载,冗余正常。
这意味着 ASM spfile 将被镜像,因此我们应该看到设置了 kfdhdb.spfile 和 kfdhdb.spfflg 值的两个磁盘。
我们来看一下:

$ for disk in `asmcmd lsdsk -G DATA --suppressheader`
> do
> echo $disk
> kfed read $disk | grep spf
> done
/dev/sdc1
kfdhdb.spfile:                       46 ; 0x0f4: 0x0000002e
kfdhdb.spfflg:                        1 ; 0x0f8: 0x00000001
/dev/sdd1
kfdhdb.spfile:                     2212 ; 0x0f4: 0x000008a4
kfdhdb.spfflg:                        1 ; 0x0f8: 0x00000001
/dev/sde1
kfdhdb.spfile:                        0 ; 0x0f4: 0x00000000
kfdhdb.spfflg:                        0 ; 0x0f8: 0x00000000

我们可以看到,两个磁盘都有 ASM spfile。
让我们检查磁盘 /dev/sdc1 上分配单元 46 的内容:

$ dd if=/dev/sdc1 bs=1048576 skip=46 count=1 | strings
+ASM.__oracle_base='/u01/app/grid'#ORACLE_BASE set from in memory value
+ASM.asm_diskgroups='RECO','ACFS'#bananaal Mount
*.asm_power_limit=1
*.large_pool_size=12M
*.remote_login_passwordfile='EXCLUSIVE'
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0352732 s, 29.7 MB/s

磁盘 /dev/sdc1 上的 AU 46 确实包含 ASM spfile。

如何重新创建和修复 ASM SPFILE

从SPFile创建PFILE

SQL> connect / as sysasm
SQL> create pfile='/home/grid/SPFile/spfileasm.ora' from spfile;

--> 修复文件spfileasm.ora中的任何错误或者参数

一般pfile看起来是这样的:

$ cat  spfileasm.ora
+ASM1.__oracle_base='/u01/app/grid'#ORACLE_BASE set from in memory value
+ASM2.__oracle_base='/u01/app/grid'#ORACLE_BASE set from in memory value
+ASM3.__oracle_base='/u01/app/grid'#ORACLE_BASE set from in memory value
+ASM1.asm_diskgroups='OCR','SSD','FRA','DATA','OPENFILER_DG','ASMLIB_DG'#bananaal Mount
+ASM2.asm_diskgroups='OCR','SSD','FRA','DATA','OPENFILER_DG','ASMLIB_DG'#bananaal Mount
+ASM3.asm_diskgroups='OCR','SSD','FRA','DATA','OPENFILER_DG','ASMLIB_DG'#bananaal Mount
*.asm_diskstring='/dev/asm*','/dev/oracleasm/disks/*'
*.asm_power_limit=1
*.diagnostic_dest='/u01/app/grid'
*.instance_type='asm'
*.large_pool_size=12M
*.remote_login_passwordfile='EXCLUSIVE'

检查当前 SPFile 的状态

$  asmcmd spget
+OCR/grac4/asmparameterfile/spfileCopyASM.ora
$ asmcmd ls -l +OCR/grac4/asmparameterfile/spfileCopyASM.ora
Type              Redund  Striped  Time             Sys  Name
                                                    N    spfileCopyASM.ora => +OCR/grac4/asmparameterfile/REGISTRY.253.842605053
$GRID_HOME/bin/gpnptool get 2>/dev/null  |  xmllint --format - | egrep 'SPFile'
  <orcl:ASM-Profile id="asm" DiscoveryString="/dev/asm*,/dev/oracleasm/disks/*" SPFile="+OCR/grac4/asmparameterfile/spfileCopyASM.ora"/>

尝试在+OCR DG上 重新创建SPFile

SQL>  create spfile='+OCR' from pfile='/home/grid/SPFile/spfileasm.ora';
 create spfile='+OCR' from pfile='/home/grid/SPFile/spfileasm.ora'
*
ERROR at line 1:
ORA-17502: ksfdcre:4 Failed to create file +OCR
ORA-15268: internal Oracle file +OCR.253.1 already exists.

在 +OCR DG 上的旧的spfile 阻止了 ASM SPFile的重建

在新的DG上重新创建 ASM SPFILE

SQL>  create spfile='+DATA'  from pfile='/home/grid/SPFile/spfileasm.ora';
File created.
$ asmcmd spget
+DATA/grac4/asmparameterfile/registry.253.850816451

验证所有节点上的profile.xml:ProfileSequence和SPFILE
grac41.example.com
  ProfileSequence="12" ClusterName="grac4"
grac42.example.com
  ProfileSequence="12" ClusterName="grac4"
grac43.example.com
  ProfileSequence="12" ClusterName="grac4"
--> Profile.xml extract 
grac41.example.com
  <orcl:ASM-Profile id="asm" DiscoveryString="/dev/asm*,/dev/oracleasm/disks/*" SPFile="+DATA/grac4/asmparameterfile/registry.253.850816451"/>
grac42.example.com
  <orcl:ASM-Profile id="asm" DiscoveryString="/dev/asm*,/dev/oracleasm/disks/*" SPFile="+DATA/grac4/asmparameterfile/registry.253.850816451"/>
grac43.example.com
  <orcl:ASM-Profile id="asm" DiscoveryString="/dev/asm*,/dev/oracleasm/disks/*" SPFile="+DATA/grac4/asmparameterfile/registry.253.850816451"/>

将 SPFile 复制回 +OCR 磁盘组

ASMCMD>  spcopy -u +DATA/grac4/ASMPARAMETERFILE/REGISTRY.253.850816451 +OCR
ORA-15056: additional error message
ORA-17502: ksfdcre:4 Failed to create file +OCR/REGISTRY.253.850816451
ORA-15268: internal Oracle file +OCR.253.1 already exists.
ORA-06512: at line 7 (DBD ERROR: OCIStmtExecute)

从 +OCR DG 删除旧的 spfile

ASMCMD> cd +OCR/grac4/asmparameterfile/
ASMCMD> ls
REGISTRY.253.842605053
spfileCopyASM.ora
ASMCMD> rm REGISTRY.253.842605053
ASMCMD> ls
ASMCMD> spcopy -u +DATA/grac4/ASMPARAMETERFILE/REGISTRY.253.850816451 +OCR
ORA-15056: additional error message
ORA-17502: ksfdcre:4 Failed to create file +OCR/REGISTRY.253.850816451
ORA-15177: cannot operate on system aliases
ORA-06512: at line 7 (DBD ERROR: OCIStmtExecute)

ASMCMD> spcopy -u +DATA/grac4/ASMPARAMETERFILE/REGISTRY.253.850816451 +OCR/grac4/asmparameterfile/spfileASM.ora
ASMCMD> spget
+OCR/grac4/asmparameterfile/spfileASM.ora
ASMCMD> ls -l +OCR/grac4/asmparameterfile/
Type              Redund  Striped  Time             Sys  Name
ASMPARAMETERFILE  MIRROR  COARSE   JUN 21 10:00:00  Y    REGISTRY.253.850819057
                                                    N    spfileASM.ora => +OCR/grac4/asmparameterfile/REGISTRY.253.850819057

磁盘组 DATA 中的 ASM spfile

在我的环境中,ASM spfile 位于(某处)磁盘组 DATA 中。
让我们找到它:

$ asmcmd find --type ASMPARAMETERFILE +DATA "*"
+DATA/ASM/ASMPARAMETERFILE/REGISTRY.253.822856169

我们可以看到,ASM spfile 位于一个特殊的位置,它的 ASM 文件编号为 253.
存储在磁盘组中的 ASM spfile 是一个注册表文件,并且始终是 ASM 元数据文件编号 253.

当然,我们从 sqlplus 中看到了同样的事情:

$ sqlplus / as sysasm
SQL> show parameter spfile
NAME   TYPE   VALUE
------ ------ ------------------------------------------------
spfile string +DATA/ASM/ASMPARAMETERFILE/registry.253.822856169

让我们备份那个 ASM spfile。

$ asmcmd spbackup +DATA/ASM/ASMPARAMETERFILE/REGISTRY.253.822856169 /tmp/ASMspfile.backup

并检查文件的内容:

$ strings /tmp/ASMspfile.backup
+ASM.__oracle_base='/u01/app/grid'#ORACLE_BASE set from in memory value
+ASM.asm_diskgroups='RECO','ACFS'#bananaal Mount
*.asm_power_limit=1
*.large_pool_size=12M
*.remote_login_passwordfile='EXCLUSIVE'

正如我们所见,这是 ASM spfile 的副本,其中包括参数和相关注释。

将spfile复制到其他磁盘组并更新GPnP配置文件

从+Data复制 spfile到+OCR磁盘组

ASMCMD>  spcopy -u +DATA/grac4/asmparameterfile/registry.253.825944079 +OCR
ORA-15056: additional error message
ORA-17502: ksfdcre:4 Failed to create file +OCR/registry.253.825944079
ORA-15177: cannot operate on system aliases
ORA-06512: at line 7 (DBD ERROR: OCIStmtExecute)

创建目录并为ASM SPF文件提供名称

ASMCMD> mkdir  +OCR/grac4/asmparameterfile/
ASMCMD> spcopy -u   +DATA/grac4/asmparameterfile/registry.253.825944079 +OCR/grac4/asmparameterfile/spfileCopyASM.ora

验证我们的spfile位置是否有效

ASMCMD>  spget
+OCR/grac4/asmparameterfile/spfileCopyASM.ora

验证GPnP配置文件是否已更新

$ $GRID_HOME/bin/gpnptool get
-->  SPFile="+OCR/grac4/asmparameterfile/spfileCopyASM.ora"

新的 ASMCMD 命令

为了支持此功能,引入了新的 ASMCMD 命令来备份、复制和移动 ASM spfile。
命令是:

  • spbackup - 将 ASM spfile 备份到备份文件。备份文件不是特殊的文件类型,也不会被识别为 spfile。
  • spcopy - 将 ASM spfile 从源位置复制到目标位置的 spfile。
  • spmove - 将 ASM spfile 从源移动到目标并自动更新 GPnP 配置文件。

SQL 命令 CREATE PFILE FROM SPFILE 和 CREATE SPFILE FROM PFILE 对于存储在磁盘组中的 ASM spfile 仍然有效。

定位/识别 ASM Spfile 位置

ASMCMD> spget 
+DATA/grac4/asmparameterfile/registry.253.825944079

$ $GRID_HOME/bin/gpnptool get
-->  SPFile="+DATA/grac4/asmparameterfile/registry.253.825944079"

ASM SPIFLE搜索顺序:

Oracle ASM实例搜索初始化参数文件时,搜索顺序为:

  1. 网格即插即用(GPnP)配置文件中指定的初始化参数文件的位置。
  2. 如果未在GPnP配置文件中设置位置,则搜索顺序更改为:
  • Oracle ASM实例主页中的SPFILE(例如$Oracle_home/dbs/SPFILE+ASM.ora)
  • Oracle ASM实例主目录中的PFILE

ASM SPFILE 中是否定义了GPnP?

[root@grac41 Desktop]#  $GRID_HOME/bin/gpnptool get 2>/dev/null |  xmllint --format -
...
  <orcl:CSS-Profile id="css" DiscoveryString="+asm" LeaseDuration="400"/>
  <orcl:ASM-Profile id="asm" DiscoveryString="/dev/asm*" SPFile="+OCR/grac4/asmparameterfile/spfileASM.ora"/>

在不更新GPnP配置文件的情况下,将新spfile复制/备份到文件系统:

ASMCMD> spcopy +OCR/grac4/asmparameterfile/spfileCopyASM.ora  $ORACLE_HOME/dbs/spfileCopyASM.ora

检查GPnP 配置文件未更新

$ $GRID_HOME/bin/gpnptool get
-->  SPFile="+OCR/grac4/asmparameterfile/spfileCopyASM.ora"

现在重启cluster

日期:2020-09-17 00:11:33 来源:oir作者:oir