Original
2016-06-17
赵恩东 译
沃趣科技
原作者:Bane Radulovic
译者: 赵恩东
审核: 魏兴华
DBGeeK社群联合出品
kfed - ASM metadata editorkfed是一个没有官方文档记录的ASM工具,它可以用来读取和修改ASM的元数据块。它本身是一个独立的工具,独立于ASM实例,因此不管实例是否启动,ASM磁盘组是否mount ,它都可以正常使用。kfed最为强大的地方在于它可以修复ASM损坏的元数据。kfed的二进制文件在最近的ASM版本中直接可用,如果你没有在$ORACLE_HOME/bin看到,可以通过如下步骤来编译获得:译者注,在11G之前的版本,kfed工具默认没有编译,需要手工编译后才能使用。11G之后版本软件安装完成后就已经对kfed完成了编译,直接可以使用。
kfed read使用kfed来可以读取一个ASM元数据块(4K大小),它的语法是:命令行参数的介绍:aun-读取的AU号,如果不提供值,默认为AU 0aus-AU的大小,默认为1048576字节(1MB),如果磁盘组不是默认的AU大小,那么需要在命令行中显式的指定AU的大小blkn-读取的块号,默认为块0或者是AU的第一个blockdev-ASM磁盘或设备名称。注意dev关键字可省略,但是磁盘名是必须输入的。
Use kfed to read ASM disk header block接下来是一个使用kfed工具的例子,展示了读取ASM磁盘/dev/sda1的磁盘头:上面的kfed命令非常的简短,大多使用了默认值,等价于下面这个(所有的参数都显式的设置成了它的默认值):我们能够看到上面kfed的输出被很好的格式化方便我们的阅读,元数据块的输出也根据实际的内容做了分组。在本例中,kfbh区域显示了块头数据,最重要的有kfbh.type-块类型,这里为KFBTYP_DISKHEAD,表明为磁盘头。我们通过kfed工具查看ASM磁盘头元数据块的实际内容,kfdhdb区域:kfdhdb.dsknum代表本磁盘在磁盘组中的编号为0,kfdhdb.grptyp代表磁盘组的冗余级别为normal,kfdhdb.hdrsts代表磁盘头的状态为member,kfdhdb.dskname代表磁盘的名称为DATA_0000等等。如果想了解磁盘头的详细信息,可以参照本系列【ASM disk header 】篇。
Use kfed to read any ASM metadata block下一个例子里我们来展示下读取ASM File Directory block-文件目录块,为了能够达到此目的,我们需要使用kfed命令:上面我通过指定AU 10和块1来读取ASM的文件目录块(kfbh.type KFBTYP_FILEDIR也说明了这是文件目录块),如果读者对这块不太熟悉,可以参照本系列的【ASM File Directory】篇来了解如何定位到ASM文件目录块。
Is my ASM metadata block corrupt如果一块磁盘本应属于某个ASM磁盘组,但是ASM磁盘头的kfbh.type部分却显示了KFBTYP_INVALID,那么这说明了ASM的磁盘头已经损坏,但是也别着急下结论,你查看的是否是正确的磁盘?是否是正确的磁盘分区?是否还可以通过其他的名字访问磁盘(多路径环境),如果你还不够确定或者你的磁盘头确实已经损坏,可以联系Oracle支持来解决问题。以上的办法适用于所有的ASM元数据块,如果ASM期待读取到一个ASM元数据块,然后读取到了一堆的无意义的值,它将标注这个kfbh.type内容为KFBTYP_INVALID,同时ORA-15196也会出现在ASM或者DB的alert日志中。(取决于哪一个实例发现了这个问题)
kfed writekfed write命令可以对一个ASM元数据块进行写入,语法是:上面新的命令行的参数含义:text - 新块内容的一个文本文件checksum - yes,计算和写入正确的checksum值,注意文本文件中的checksum值不需要一定是正确的,写入时checksum参数如果设置的是yes,会自动进行计算。
Use kfed to write the correct checksum to ASM metadata blockASM元数据块可能看上去是好的,但是事实上已经损坏,例如,元数据块的checksum值可能是错误的,这种情况下我们需要去纠正它,其实,如果仅仅是checksum值不正确,可以很容易通过kfed读取这个块然后再写回的方式进行纠正,kfed工具会计算新的checksum值,然后把正确的checksum值写回。接下来我们用一个完整的例子来演示如何修复一个元数据块的不正确的checksum值,此元数据块位于磁盘/dev/sda1的AU 0,块2。注意,遇到任何ASM元数据块的损坏都请联系Oracle的技术支持。
kfed findkfed的find命令会检查一个AU上的所有块,然后返回每一个块的类型:find命令一定程度上跟之前的read命令很想象,但是find命令会对指定AU上的所有块进行读取操作。(read只会操作一个块)
Use kfed find command to verify blocks in AU0接下来我们通过kfed find命令识别AU 0上所有块:输出的结果如预期,块0为 type 1,块1为type 2,其他的所有块为type 3:译者注:块0为磁盘头,块1为磁盘的 Free space table,块2-块255为磁盘的Allocation Table,对于Free space table的内容参考本系列的【Free space table】章节,对于Allocation Table的内容参考本系列的【Allocation Table】章节。如果你看到任何其他别的输出,说明了存在一个毁坏ASM元数据块,这种情况下请联系Oracle的支持寻求帮助。由于我的AU大小是1MB,因此在这个AU上有256个块,如果你的AU大小为4MB,上面同样的命令会返回1024个块。我已经强调过,kfed的find命令只能查看ASM元数据块的类型,不能查看实际的元数据块的内容,一些ASM元数据块的损坏其实是块内容的损坏,例如块类型是正确的,但是块的内容已经损坏。这种毁坏只能在ASM读取的时候才能检测到,这种情况下,ORA-15196错误会抛出。
结论kfed工具是一个低调的,但是非常强大的工具,上面我们只是显示了几个命令,它还有很多其他的命令可以用,例如格式化一个空的ASM文件,检查ASM元数据块的健康性,展示数据结构的大小,以及执行一些鲜为人知的操作。关于译者赵恩东,沃趣科技数据库技术工程师,主要参与公司产品实施、测试、维护以及优化。
往期精彩ASM 翻译系列第一弹:基础知识 ASM AU,Extents,Mirroring 和 Failgroups
ASM 翻译系列第二弹:ASM 12C 版本新特性
ASM 翻译系列第三弹:基础知识 About ASM disk groups, disks and files
关于沃趣杭州沃趣科技股份有限公司创建于2012年,是专注为用户提供基于高性能、高可用、可扩展的开放数据库平台整体架构解决方案的国产厂商。沃趣的产品已广泛应用于证券、保险、医疗、广电传媒、银行、电信、能源电力、快递物流、公共事业、大型企业等,为这些行业用户持续提供行业解决方案及服务支持。研发中心位于杭州,同时在北京、上海、成都、兰州、沈阳建立了分支机构,负责国内的销售和服务。我们始终坚信,数据是驱动企业创新的源动力!坚持围绕企业数据库做好一件事
——让高性能触手可及!