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 目录中。
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实例搜索初始化参数文件时,搜索顺序为:
- 网格即插即用(GPnP)配置文件中指定的初始化参数文件的位置。
- 如果未在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