4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
新闻详情
ASM的文件管理深入解析(内含开源的ASM文件挖掘研究版程序...
来自 : ITPUB 发布时间:2021-03-24
这个视图很容易理解,我把它的主要列介绍一下:
GROUP_KFFXP :磁盘组编号
NUMBER_KFFXP:文件编号
PXN_KFFXP :物理区号
XNUM_KFFXP :逻辑区号
LXN_KFFXP :0=primary, 1=first mirror, 2=second mirror
DISK_KFFXP :磁盘编号
AU_KFFXP :AU号
通常,一个AU就是一个区。逻辑区和物理区的区别是,如果冗余模式是Nomarl,有两个FailGroup,那么文件的每一个AU,可以称为一个逻辑区。它在两个FailGroup中分别各自对应一个AU,每个AU称为物理区。
我想,这个视图不用我再过多介绍了吧。
第四章 ASM文件直接读取
终于到本文的压轴戏了,绕过Oracle,直接读取ASM文件。阅读本章,你就需要点编程基础了。程序不长,一共只不过300多行而已。其实如查你仔细阅读了本文前面的内容,而且也都理解了,那么,你应该感觉到了,自己开发一个这样的程序并非难事。
如果你曾经是专业的C程序员,看到Kfed的输出,你应该就感觉到了,它输出的结果就是Struct。比如AU的位置信息,直接AU的Struct叫kfffde,间接AU叫kffixe,结构都一样,可以如下定义:
typedef struct XPTR
{
unsigned int au;
unsigned short int disk;
unsigned char flags;
unsigned char chk;
}XPTR;
XPTR *kfffde,* kffixe;
这个结构会占用8个字节,一个4096字节的块,是可以保存很多AU的。但是,不知出于什么原因,每个文件的AU位置信息在1号文件所占用的第一个块中,只保存前60个AU的位置,编号分别为0至59。这60个AU就是前文中提到的直接AU了。而第61个AU(编号为60),保存文件其他AU的位置分布信息,其他的AU就是间接AU了。
我们只需要参照Kfed的输出结果,定义各种Struct,然后根据直接Open磁盘设备文件,将信息读入各种Struct就行了。
哪么,还有一个难点,如何解读Kfed的输出结果?没关系,我已经考虑到这个问题了,各种Struct的解读,我已经放在本文的后几章。
程序非常简单,我不再过多说明,有问题可以给我留言,请记住我的永久域名:www.MythData.com。
如果哪个公司有进一步完善、开发成产品的需求,只要有钱赚都可以联系我,大家一起合作、一起发财。
不过,说实话,仔细看看我这篇文章,再做做测试,找个廉价的C程序员(刚过二级考试哪种),就能把这个程序写出来,其实根据不需要找我的。

下面测试一下程序,将附件中的程序直接编译:
[root@red1 asm]# gcc -o rdasm rdasm.c
我这里没有报任何错,如果你编译不过去,可以给我留言。下面测试一下:
步1:查看表空间
SQL select file_name,tablespace_name from dba_data_files where tablespace_name=\'RDASM\';
FILE_NAME TABLESPACE_NAME
-------------------------------------------------- ------------------------------
+DG1/data/rdasm.dbf RDASM
以RDASM表空间唯一的数据文件+DG1/data/rdasm.dbf为例,一会儿把它从ASM中读出来。
步2:创建检测表:
SQL create table test1 (id int,cc varchar2(20)) tablespace rdasm;
Table created.
SQL insert into test1 select rownum,\'abc\' from dba_objects;
9904 rows created.
SQL commit;
Commit complete.
在RDASM中创建一个9904行的表,把+DG1/data/rdasm.dbf文件从ASM中读出来后,可以再对查询一下此表的行数,验证读取是否成功。
步3:把RDASM表空间脱机:
SQL alter tablespace rdasm offline;
Tablespace altered.
也可以把表空间设置为热备状态。
步4:查询在ASM中此数据文件的编号:
[oracle@red1 ~]$ export ORACLE_SID=myasm
[oracle@red1 ~]$ sqlplus / as sysdba
SQL select name,file_number from v$asm_alias where name=\'rdasm.dbf\';
NAME FILE_NUMBER
------------------------------------------------ -----------
rdasm.dbf 304
在ASM中,rdasm.dbf的编号为304。
步5:将ASM中的304号文件读取到/home/oracle/304.dbf中:
[root@red1 drasm]# ./rdasm 304 /home/oracle/304.dbf
目前我的程序只支持根据文件编号读取。更进一步的,可以只提供文件名,这个功能还没有实现。
步6:改变一下读出文件的属主:
[root@red1 drasm]# ls -lF /home/oracle/304.dbf
-rw-r-----1 root root 6299648 Oct 19 09:44 /home/oracle/304.dbf
[root@red1 drasm]# chown oracle.oinstall /home/oracle/304.dbf
步7:在数据库中改名:
SQL alter database rename file \'+DG1/data/rdasm.dbf\' to \'/home/oracle/304.dbf\';
Database altered.
将+DG1/data/rdasm.dbf改为/home/oracle/304.dbf 。
步8:恢复、并联机表空间
SQL alter tablespace rdasm online;
alter tablespace rdasm online
*
ERROR at line 1:
ORA-01113: file 18 needs media recovery
ORA-01110: data file 18: \'/home/oracle/304.dbf\'
把RDASM表空间联机,虽然报出了错误,但并不是文件损坏,而是需要恢复,下面把/home/oracle/304.dbf恢复一下:
SQL recover datafile 18 ;
ORA-00279: change 431943 generated at 09/15/2009 05:04:28 needed for thread 1
ORA-00289: suggestion : +DG1/archive/1_54_693785914.dbf
ORA-00280: change 431943 for thread 1 is in sequence #54
Specify log: { RET =suggested | filename | AUTO | CANCEL}
Log applied.
Media recovery complete.
恢复完成后再次联机RDASM表空间,这次可以成功联机:
SQL alter tablespace rdasm online;
Tablespace altered.
步9:测试:
SQL select count(*) from test1;
COUNT(*)
----------
9904
查询一下TEST1表,可以正确把9904行读出来。
怎么样,简单吧,动心了吧,赶快试一下吧:

本文链接: http://asmresearch.immuno-online.com/view-683710.html

发布于 : 2021-03-24 阅读(0)