love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

How to extract datafiles from asm diskgroup?

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: How to extract datafiles from asm diskgroup?

我们知道从11g开始oracle自身就提供了amdu工具,可以用来抽取asm 磁盘组中的文件。该软件也可以
用于10g版本,我这里来做个演示,并对一些细节进行说明,以回答几个网友的疑问:

如下是该磁盘组的map情况:

下面来对上面amdu的map文件进行描述:

N0001 D0000 R00 A00000000 F00000000 I0 E00000000 U00 C00256 S0001 B0000000000

第1列:应该是逻辑的disk编号,data01磁盘组包含2个disk,分别是/dev/sdb,/dev/sde所以分别是1和4.
这个你可以从amdu的report.txt看到。
第2列:asm内部定义的disk number号,data01磁盘组包含2个disk,所以/dev/sdb是0,/dev/sde是1. 这里
需要说明的是,asm里面都是从0开始定义的。
第3列:未知
第4列:应该是表示的au号。
第5列:asm内部定义的file number号。这里有一点需要注意的是,asm里面file number 0~6都是元数据。
数据文件的file number都是从256开始的,实际就是对应的kfbh.block.obj。
第6列:未知
第7列:未知
第8列:未知
第9列:表示该au所分配的block大小,我这里block size是4096,由于au size是1m,所以该值基本上都是256。

第10列:未知
第11列:这里是表示的是指针,或者你可以理解为offset。你可以看到后面的每个数据都是我们的au(1m)的整数倍。

虽然上面有部分信息,我们不清楚含义,不过没关系,我们所了解的信息就足够了。

从上面我们可以看到,该磁盘组中有4个datafile,起对应的asm file number分别是:256,257,266,267.

下面我们来进行抽取:

到最后,可能还有人会有疑问,假如我的asm 磁盘组无法mount了,需要进行抽取,但是
我如何进行文件的对应呢? 比如这里抽取出来的file 256我怎么知道该文件是什么呢?
是system还是user,还是sysaux(虽然这里我知道是system) ?

我们知道asm alias directory是在第6个位置,所以我直接读取第6个block,如下:

从上面信息,我们可以看到,alias directory 信息是存在第49个au里面,ok,我们来看第49个au的信息:

上面的结果灰常的清楚了,我所需要的就是读取datafile,当然如果是恢复的话,可能还需要抽取redo和archivelog,这里不多说:

我们可以看到,其实我这个测试库仅仅只有上面6个datafile,那每个datafile所对应的file number呢?如下:

这里以system为例,你在asm看到的该file名实际上是:system.256.776886753。当你知道了
所有的datafile对应关系之后,那么一切就非常简单了。 如果你的asm 实例无法mount,那么需要恢复时,
可以手工用amdu将datafile全部抽取出来,然后找到上面的asm alias对应关系,将文件逐一重命名,最后
重建controlfile即可,当然,你可以可以直接抽取controlfile。

最后,如果是要实现最大程度的恢复,可能你还需要抽取redo和archivelog,方法都是一样的,不多说。

补充:
1. 实际上,只有你能把文件都抽取处理啊,将数据库mount以后,即使不知道文件名,也是可以进行rename操作的。
2. 目前odu是支持asm的,可以直接抽取数据文件,貌似比amdu更强悍一些,由于admu本身对数据的要求较高,某些情况下
可能使用amdu是无法抽取的,使用odu反而可以。
3. dul10 目前也是支持asm 的,大家可以测试一下。

Leave a Reply

You must be logged in to post a comment.