经常有朋友问我ASM的文件结构。以便于碰到ASM故障时能够处理。实际上ASM数据的备份是容易被忽视的问题。一旦我们DROP了一个DATABASE或者数据文件,那么在ASM中,包含该文件所有INODE信息的file directory(ASM FILE NUM 1)文件就会被清空。从12C开始,很多朋友都在大规模的使用容器数据库了,在一个CDB下可能包含多个小的PDB,由多个DBA分头管理。如果一不小心误删了一个数据库,要恢复起来,可比以前没有使用ASM的时候复杂的多,这个数据库的所有数据文件的inode信息都会被立即填充为0,只要这一切落盘后,那么如果你想恢复这个数据库的数据就十分困难了。扫描整个ASM磁盘组,然后慢慢拼凑出数据文件是唯一的办法。如果只删除了一个数据库还好办,只有一套数据文件丢失,如果整个ASM磁盘组中多次删除过数据库,那么可能会有很多file_id相同的数据块需要做判断,那就十分复杂了。为了避免这种情况出现,经常备份ALIAS文件(当某个文件删除时,ALIAS文件中的相关项目立即也会被填充为0)、file directory文件,是一种十分好的习惯(不过有这个习惯的用户少之又少)。懂ASM数据结构的朋友可以写一个工具用于备份和恢复alias文件和file directory文件。如果没有这个编程能力的朋友,直接通过asmcmd定期把这个文件备份一下,对于今后出事后恢复数据也是很有帮助的。
ASM是一个十分复杂的体系,不过其文件分配表的结构确是十分简单的。如果有朋友有兴趣写个工具,从ASM中读取文件,也是很容易实现的。ASM通过一系列元数据进行管理。这些元数据类似数据库的数据字典。元数据从形式上分为物理元数据和虚拟元数据。所谓物理元数据,是指记录在磁盘固定位置的数据,主要有:磁盘头、分配表、空闲空间表和伙伴状态表。而虚拟元数据是指以文件的形式存在的元数据,位置不固定,主要有:文件目录、磁盘目录、活动变化目录、继续操作目录、模板目录、别名目录、属性目录、过期目录和注册表等。元数据的每个块为4096字节,每个块都有着相应的结构。
首先我们简单了解一下AU的概念,AU是分配单元,ASM的存储是以AU为单位分配的。10G缺省AU_SIZE是1M,如果要使用非缺省AU_SIZE,需要使用隐含参数。在11G中,这个隐含参数变成了标准参数了。
其次,ASM里的所有数据都是以文件形式组织的。每个文件包含N个AU(除了METADATA文件外)。
首先我们要了解的是DISK HEADER,每个DG的DISK都有一个HEAD,其位置是文件头部(如果以0为第一个块的话,那就是0号块),DISKHEADER其实就是每个DISK的AU 0的BLOCK 0。我们使用kfed来看看:
[grid@localhost ~]$kfed read /dev/oracleasm/disks/ASMDISK1 aun=0
由于篇幅限制,省略