ASM 翻译系列第三十五弹:ASM 253号文件——ASM spfile

ASM spfile in a disk group

从ASM版本11.2开始,ASM spfile可以储存在ASM磁盘组里。事实上,在安装ASM时,OUI就已经把ASM spfile放在了磁盘组中。对于单实例环境和集群环境都是这样。在安装过程中创建的第一个磁盘组是spfile的默认位置,但这不是必要的。ASM spfile还是可以放在文件系统上,就是$ORACLE_HOME/dbs目录下。

New ASMCMD commands

为支持该特性,ASMCMD引入了新的命令用来备份,复制和移动ASM spfile。这些命令如下:

  • spbackup -- 备份ASM spfile为备份文件。备份文件并不具有特殊的文件类型 ,也不会被识别为spfile
  • spcopy -- 将ASM spfile从源位置复制到目标位置(不能复制spbackup出来的备份文件)
  • spmove -- 将ASM spfile从源位置移动到目标位置并且自动更新GPnP profile文件

CREATE PFILE FROM SPFILE和CREATE SPFILE FROM PFILE命令对于磁盘组中的spfile仍然可用。

ASM spfile in disk group DATA

在我的测试环境里,ASM spfile位于DATA磁盘组。现在来找到它:

$ asmcmd find --type ASMPARAMETERFILE +DATA "*"

+DATA/ASM/ASMPARAMETERFILE/REGISTRY.253.822856169

可以看到,ASM spfile存放在一个特别的位置,它的ASM文件号为253。储存在磁盘组中的ASM spfile是作为ASM的元数据文件被管理,一直具有ASM元数据文件号253.

当然了,在sqlplus中可以看到相同的结果:

$ sqlplus / as sysasm

SQL> show parameter spfile

NAME TYPE VALUE

------ ------ -------------------------------------------------

spfile string +DATA/ASM/ASMPARAMETERFILE/registry.253.822856169

SQL>

下面对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'#Manual Mount

*.asm_power_limit=1

*.large_pool_size=12M

*.remote_login_passwordfile='EXCLUSIVE'

可以看到,这就是一份ASM spfile的副本,内容包含了参数和相关的comment。

ASM spfile discovery

所以问题来了,当磁盘组还没mount时,ASM实例怎么读取spfile来启动呢?不仅如此,ASM不知道spfile位于哪个磁盘组,甚至于都不知道是否位于磁盘组上。再者,ASM实例也不知道ASM discovery string的值是什么。

ASM Admin guide文档里是这么描述的:

当ASM实例寻找初始化参数文件(即pfile或者spfile)时,将按照如下顺序:

1. 由GPnP profile指定的参数文件位置

2. 如果GPnP profile里没有指定,再按照下面顺序寻找:

3. 

  • 位于ASM HOME目录下的spfile,(比如  $ORACLE_HOME/dbs/spfile+ASM.ora)
  • 位于ASM HOME目录下的pfile

这里没有提到和ASM discovery string有关的信息,但是至少提到了spfile和GPnP profile。ASM discovery string也是位于GPnP profile里的。下面是在Exadata环境中使用gpnptool命令获得的参数值:

$ gpnptool getpval -p=profile.xml -asm_dis -o-

o/*/*

$ gpnptool getpval -p=profile.xml -asm_spf -o-

+DBFS_DG/spfileASM.ora

在单实例环境中,没有GPnP profile,这些信息位于ASM资源(ora.asm)中,储存在OLR中。 下面是一个单实例的例子:

$ crsctl stat res ora.asm -p | egrep "ASM_DISKSTRING|SPFILE"

ASM_DISKSTRING=

SPFILE=+DATA/ASM/ASMPARAMETERFILE/registry.253.822856169

到目前为止,我们知道了ASM如何获得ASM磁盘和spfile的位置。但是磁盘组还没有mount时,ASM怎么读取spfile呢?

奥秘就在ASM磁盘头里。为了支持spfile储存在ASM磁盘组中,磁盘头中增加了两个条目:

  • kfdhdb.spfile - ASM spfile所在AU号
  • kfdhdb.spfflg - ASM spfile的标志位。如果值为1,那么ASM spfile就位于这个磁盘,AU号由kfdhdb.spfile指明。

在发现磁盘的过程中,ASM实例读取磁盘头,寻找spfile的相关信息。找到储存spfile的磁盘后,就可以读取初始参数文件。

下面在我的测试磁盘组DATA中做个演示,首先检查磁盘组状态和冗余类型 

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

1 MOUNTED NORMAL

可以看到磁盘组是mount状态,冗余类型是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号AU的内容:

$ 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'#Manual 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的46号AU就是我们要找的ASM spfile。

ASM spfile alias block

除了以上两个条目,还增加了一个新的元数据块类型 - KFBTYP_ASMSPFALS。它用来描述ASM spfile别名,位于ASM spfile的最后一个块。 下面看一下46号AU的最后一个块:

$ 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 file版本号是文件名(REGISTRY.253.822856169)的一部分,块大小为512字节,文件大小是3个块。以上输出中路径相关条目的信息为空,是指不存在ASM spfile别名。

下面创建一个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.

SQL> exit

再次定位ASM spfile会显示两条返回结果:

$ asmcmd find --type ASMPARAMETERFILE +DATA "*"

+DATA/ASM/ASMPARAMETERFILE/REGISTRY.253.843597139

+DATA/spfileASM.ora

可以看到ASM spfile本身和它的别名。下面确认下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

下面再看下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

现在可以看到别名文件名的信息了。由于新建了spfile,版本号也变了。

Conclusion

从ASM 11.2开始,ASM spfile可以储存在磁盘组里。同时为了支持该特性,新增了对应的ASMCMD命令,我们也有了新的ASM元数据结构。

本文来自合作伙伴“DBGEEK”

时间: 2024-11-03 22:02:59

ASM 翻译系列第三十五弹:ASM 253号文件——ASM spfile的相关文章

ASM 翻译系列第三十四弹:ASM磁盘组重要属性介绍

ASM Disk Group Attributes 磁盘组的属性是ASM 11.1版本引入的,是磁盘组层面而非ASM实例层面的.磁盘组的属性有一些只能在创建磁盘组时指定,有一些只能在创建之后指定,还有一些可以在任何时候指定. 本篇内容是对本系列文章-[ASM Attributes Directory]的展开. ACCESS_CONTROL.ENABLED ACCESS_CONTROL.ENABLED属性指定了一个磁盘组的ASM File Access Control是否启用,参数的值可以设置为t

ASM 翻译系列第三十二弹:自制数据抽取小工具

Find block in ASM 在本系列文章[ Where is my data]中,我已经演示了如何从ASM磁盘中定位和抽取一个Oracle的block,为了让这件事做起来不那么复杂,我又写了一个perl脚本find_block.pl来简化整个操作,只需要提供数据文件的名称和需要提取的block,这个脚本就可以输出从ASM磁盘组中抽取块的命令. find_block.pl find_block.pl是一个perl脚本,脚本里集成了dd或kfed命令来从ASM磁盘中抽取一个块,脚本可以在Li

Oracle ASM 翻译系列第三十弹:高级知识 Physical metadata replication

Physical metadata replication 从版本12.1开始,ASM会对某些物理元数据做一份复制,具体的说是每个磁盘的第一个AU(0号AU)上元数据.这意味着,ASM同时维护着两份磁盘头.FST(Free Space Table)表.AT(Allocation table)表的数据.需要注意的是ASM对这些数据采用的是复制(replicate),而不是镜像(mirror).ASM镜像(mirror)意味着把一份数据,拷贝到不同磁盘上:而物理元数据的副本位于相同的磁盘,因此使用的

ASM 翻译系列第三弹:基础知识 About ASM disk groups, disks and files

Oracle ASM使用磁盘组来存放数据文件,每一个ASM的磁盘组由一些ASM磁盘组成,每一个ASM磁盘组本身是一个独立的存储单元,是自描述的,对于ASM磁盘组中数据库文件,ASM提供一个文件系统的接口,方便DBA做管理.存放在ASM磁盘组中的文件被均匀的分布在磁盘组中的所有磁盘上,通过这种方式,每一块磁盘都可以提供一致的性能,同时ASM的性能可以比得上裸设备的性能.[摘录自11GR2版本的ASM官方文档] ASM Disk Groups 一个ASM磁盘组是由一个或多个ASM磁盘组成的,每个AS

ASM 翻译系列第三十一弹:了解ASM文件的空间分配

How many allocation units per file 本文主要是对ASM文件的空间分配进行一些探讨和研究. ASM空间分配的最小单位是AU,默认的AU size是1MB,但在Exadata下AU 的默认大小是4MB. ASM文件的空间分配是以extent为单位,每一个extent是由一个或多个AU组成,在11.2版本,前20000个extent,每一个extent由1个AU组成,接下来的20000个extent,每一个由4个AU组成,再超出的extent,每一个由16个AU组成.

ASM 翻译系列第三十三弹:REQUIRED_MIRROR_FREE_MB的含义

REQUIRED_MIRROR_FREE_MB REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB是V$ASM_DISKGROUP[_STAT]视图中非常有趣的两列.Oracle Support部门收到的很多问题是关于这两列的意义以及它们的值是怎么计算的.我本打算写些文章介绍一下,但是我意识到我不可能比Harald van Breederode做的更出色.因此我征得了他的同意来直接参考他的文章,所以还是请欣赏他的大作吧. https://prutser.wordpres

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(三十五)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(三十五)地图编辑器的初步使用 上一节我们制作好了地图编辑器,并初步实现了导出地图中的障碍物信息及实现A*模拟寻路.那么当我们得到了包含有障碍物数据信息的xml文件后,又该如何将之应用到本教程的示例游戏中呢? 本节还是以上一节的那幅地图为例,我们首先通过编辑器载入该地图并在上面描绘出所有障碍物: 然后点击导出障碍物按钮,我们将得到一个包含有类似如下信息的xml障碍物数据文件: <Item ID="Obstr

JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了,而且收到的好评也不错,于是就一直坚持了下来,非常感谢各位小伙伴哦! JAVA之旅合集 JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 JAVA之旅(二)--if,switch,for,while,do while,语句嵌套,流程

Windows 8风格应用开发入门 三十五 触控输入

Windows 8设备通常具有多点触摸屏,用户可以同时使用多个手指来进行不同的输入交互,如点击. 拖动或收缩等手势操作.另外Windows 8中将触摸.鼠标和笔/触笔交互是作为指针输入进行接收.处理 和管理. 一.手势处理 首先我们来汇总一下Windows 8中常用的手势都有哪些. 开发入门 三十五 触控输入-windows10触控板手势"> 1,点击:用一个手指触摸屏幕,然后抬起手指. 2,长按:用一个手指触摸屏幕并保持不动 . 3,滑动:用一个或多个手指触摸屏幕并向着同一方向移动. 4