平台人生
作者平台人生·2017-08-02 17:44
软件开发工程师·平台人生

ASM黑盒探秘之旅——窥一窥ASM文件如何存储

字数 3030阅读 5137评论 0赞 1

作者:周鹏


写在前面

ASM(自动化存储管理)是Oracle数据库的一个特性,作为专门为Oracle数据库文件创建的垂直集成文件系统和卷管理器,ASM提供了直接异步I/O的性能以及文件系统的易管理性。无论是Oracle数据库用户还是数据库管理员想必对ASM都有所耳闻甚至能够熟练使用,但是对于大部分人,使用ASM时,ASM就像是一个黑盒,给人一种神秘的感觉。"知其然,知其所以然",对待技术唯有如此,才能有更大提高。近段时间看了《Oracle内核技术揭秘》一本好书,感谢作者的付出,自己收获很大。所以今天让我们从ASM文件开始,掀起ASM黑盒的一角,来窥探一下Oracle的一些底层设计。

ASM 文件的类型

ASM上存储的文件分为两大类:元文件和具体的数据文件。元文件上存放元数据,保存ASM中各种配置,状态数据,比如所有以v$asm_开头的视图信息都来自于源文件。具体的数据文件是Oracle存放的各类文件:数据文件,重做日志文件,归档日志文件等等。针对每一个文件,在ASM中都有一个编号file_number,作为索引号,索引号从1开始,1~255号文件,都是元文件,从256号开始之后是数据库的各类文件。如下图,在我的虚拟机数据库上,第一个是256号控制文件,第二个是257号system数据文件。
QQ截图20170802171738.png

QQ截图20170802171738.png

ASM文件格式

ASM上的文件中,最重要是1号文件,它包含了所有文件的磁盘分布信息,包含元文件等,甚至是1号文件自身的空间分布信息也都存在1号文件内部。每个文件在它里面至少占用一个块(元数据块为4KB)的空间。
在通常情况下,ASM的1号文件总是在磁盘组0号磁盘的2号AU处开始(插播一个概念:ASM的最小存储单位是一个AU(allocation unit))。0号盘2号AU:这是ASM定位文件的起点,Oracle就是从这个位置入手查找文件。

在最少情况下,1号文件至少有两个AU。刚才提到,1号文件中,每个文件占用一个元数据块,用来存放自身空间分布信息。每个元数据块4K,一个AU默认是1MB,1号文件的每个AU中可以存储256个文件的空间分布信息。1号文件最少两个AU,所以可以存放512个文件的空间分布信息。这其中,第一个AU,正如上面所说,一般在0号盘2号AU,这个AU中全是元文件信息。它里面第一个数据块被系统占用,从第二块开始到255为止,分别对应1~255号文件,也就是全部的元文件。在1号文件第二个AU中,第一个块保存256号文件的AU分布,第二个块对应257号文件的AU分布,依次类推。ASM读取数据时,Oracle会先读取1号文件,从中获得要读的目标文件在磁盘上的分布信息,然后再去读相应文件的数据。

上边的描述读起来是不是很绕,相信很多人还是云里雾里,没关系,让我们看一下下面这幅图,有助于大家的理解。
QQ截图20170802171826.png

QQ截图20170802171826.png

如上图,0号盘中2号AU我们细窥一下,它是1号文件的第一个AU,共有256个元数据块块,编号0至255,0号数据块系统留用,1~255号块分别保存了1号文件自身和2~255号文件的AU分布信息。

如何查看ASM文件信息

首先插播一个工具——kfed,kfed是Oracle提供的分析ASM的一个工具,其功能非常强大,利用这个工具我们可以读取ASM上数据块的信息,从而能让我了解ASM文件的磁盘分布。
下面让我们通过kfed这个工具,来切实的验证一下上边的理论。如下图显示,本人虚拟机上的数据库环境,有两个磁盘组,选取磁盘组1,该盘组下有1块磁盘,为0号磁盘disk1:
QQ截图20170802172047.png

QQ截图20170802172047.png

下面我们用kfed工具来读取这个磁盘的2号AU的1号数据块。
QQ截图20170802172124.png
QQ截图20170802172124.png

大家可以看到kfed列出了好多信息,通过这些,根据已知相关资料,我们可以反向来了解ASM大部分的秘密,但这个过程也很具挑战性,感兴趣的朋友可以深入研究。下面我们主要看一下和ASM文件存储相关的部分,找到如下信息:
QQ截图20170802172154.png
QQ截图20170802172154.png

Kfffde[]是C语言的结构数组,Kfffde[0]数组元素存放了1号文件的第一个AU位置,kfffde[1]
数组元素存放的了1号文件的第二个AU位置,依次类推。
kfffde[0].xptr.au: 2 ; 0x4a0: 0x00000002
kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000
----------上述信息为0号磁盘,2号AU
kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 S=0 ----标志位
kfffde[0].xptr.chk: 40 ; 0x4a7: 0x28 ------校验码
由此得到,1号文件第一个AU,位于0号磁盘2号AU,同理,根据Kfffde[1],可以得到1号文件第二个AU,位于0号磁盘58号AU,同理往下,Kfffde[2],AU编号4294967295,磁盘为65535,说明1号文件没有第三个AU,如下图,1号文件包含两个AU(0号盘 2号AU)和(0号盘 58号AU)
QQ截图20170802172224.png
QQ截图20170802172224.png

根据上面的原理,如果我们如何找出2号文件的AU分布呢?
2号文件AU分布在0号盘2号AU的2号块中,通过kfed:kfed read /dev/oracleasm/disks/DISK1 aun=2 blkn=2
QQ截图20170802172300.png
QQ截图20170802172300.png

说明2号文件只有一个AU,0号盘3号AU。可见某一个文件AU分布信息很容易就能查找出来,ASM也没有想象那么神秘。

实战!分析一个数据文件磁盘分布情况

我们选取一个5M数据文件,其在ASM中对应的索引号为268。
QQ截图20170802172350.png

QQ截图20170802172350.png

QQ截图20170802172413.png
QQ截图20170802172413.png

下面我们来理顺一下,1号文件的第一个AU,保存0~255号文件。从256号文件开始,AU的分布信息保存在1号文件的2号AU中,根据前边的实验结果,为0号盘58号AU。在这个AU中0号块对应256号文件,一号块对应257号文件,所以268号文件应该是12号块所对应。所以我们对0号盘58号AU的12号块进行分析:
kfed read /dev/oracleasm/disks/DISK1 aun=58 blkn=12
QQ截图20170802172446.png
QQ截图20170802172446.png

如图所示,268号文件分布于0号磁盘6916,6917,6918,6919,6920,6921这6个AU。细心的同学会发现文件大小是5M,怎么占用6个AU?多出来1M是怎么回事?对于表空间区大小有64KB,1MB,8MB等多种选择,但无论区大小为多少,每个ASM文件Oracle都会比原来大小多出一个AU。对于上边分析过程,可以用下面这图完整的表示出来:
QQ截图20170802172524.png
QQ截图20170802172524.png

作业 ● 来了

大家是不是会有疑问呢?假设有个数据文件非常大,AU个数特别多,多到一个块放不下了,Oracle的底层又是怎么设计处理的呢?感兴趣的朋友可以根据上面的内容,研究分析一下,欢迎在文章下讨论~~

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

作者其他文章

相关文章

相关问题

相关资料

X社区推广