随着数据库新版本的推广ASM肯定会越来越被重视。在11g里未出来之前,能做的很有限,想要copyASM里一个文件出来,只有用DD和exec dbms_file_transfer.copy_file(),如果块坏了,那只能用DD找到对应的文件DD出来,再做BBED分析。在11G里出了AMDU,这个可以使用在10G上。下面了解下其用法,并和DD对比,起一个抛砖的作用。
AMDU是oracle 11g自带的一款asm文件抽取工具,也可以给oracle 10g用,用法参见oraclemetalink 553639.1:
下载下来:
unzip amdu_X86-64.zip
export LD_LIBRARY_PATH=./
抽取spfile
SQL>select name,file_number,alias_index,file_incarnation from v$asm_alias where name like'%spfile%';
NAME FILE_NUMBER ALIAS_INDEX FILE_INCARNATION
spfile.266.866828907 266 477 866828907
spfiledb.ora 266 227 866828907
[grid@mysql-1]$ amdu -diskstring '/dev/raw/raw*' -extract data.266
[grid@mysql-1]$ strings DATA_266.f
db1.__db_cache_size=134217728
db2.__db_cache_size=146800640
db1.__java_pool_size=4194304
db2.__java_pool_size=4194304
db1.__large_pool_size=8388608
db2.__large_pool_size=8388608
db2.__oracle_base='/opt/oracle' #ORACLE_BASEset from environment
…………..
抽取看来是没有问题的。如有兴趣可以继续跟踪下amdu的抽取流程:
strace -o amdu.log amdu -diskstring'/dev/raw/raw*' -extract data.266
我们这里同样用DD演示:
SQL> SELECT a.GROUP_KFFXP, a.DISK_KFFXP,a.AU_KFFXP, b.path,c.name
FROM x$kffxp a, v$asm_disk b, v$asm_alias c
WHERE a.number_kffxp = c.file_number
AND a.GROUP_KFFXP = b.group_number
AND a.disk_kffxp = b.disk_number
AND b.group_number=1
AND c.name LIKE'%spfile%';
GROUP_KFFXP DISK_KFFXP AU_KFFXP PATH NAME
1 0 208 /dev/raw/raw4 spfiledb.ora
1 0 208 /dev/raw/raw4 spfile.266.866828907
确定块大小:
SQL>select name,block_size,allocation_unit_size,state,type from v$asm_diskgroup;
NAME BLOCK_SIZE ALLOCATION_UNIT_SIZE STATE TYPE
DATA 4096 4194304 CONNECTED EXTERN
ARCH 4096 0 DISMOUNTED
这里block_size为4K,au_size为4M.
$dd if=/dev/raw/raw4 bs=4096 count=1 skip=212992 of=spfile.ora
说明:skip=208*1024
[grid@mysql-1 ~]$ strings spfile.ora
db1.__db_cache_size=134217728
db2.__db_cache_size=150994944
……………………………………………………….
db1.thread=1
db2.thread=4
db1.undo_tablespace='UNDOTBS1'
db2.undo_tablespace='UNDOTBS4'
抽取文件:
SQL>select file#,name,bytes/1024/1024 from v$datafile where name like '%users%';
FILE# NAME BYTES/1024/1024
4 +DATA/db/users01.dbf 2728.75
5 +DATA/db/datafile/users.274.896306467 100
#amdu -diskstring '/dev/raw/raw*'-extract data.274
#cat report.txt
**************************EXTRACTING FILE DATA.274 **************************
Creating file: DATA_274.f
Extraction wrote: 104865792 bytes
Stripe size: 4194304 bytes
Stripe columns: 1
Mirror copies: 1
Block size: 8192 bytes
File size: 12801 blocks
File type: 2
Extent size #1: 4294967295 extentsof 1 AUs
Extent size #2: 0 extents of 1 AUs
Extent size #3: 0 extents of 1 AUs
Extent size #4: 4294967295 extentsof 1 AUs
Creation time: 2015/11/2022:01:07.797000
Modified time: 2015/12/1820:00:00.000000
Data extents in file: 26
Dataextents found: 26
Blocks not found: 0 blocks
dbv验证
[grid@mysql-1]$ dbv file=DATA_274.f blocksize=8192
DBVERIFY: Release11.2.0.4.0 - Production on Fri Dec 18 22:28:15 2015
Copyright (c) 1982,2011, Oracle and/or its affiliates. Allrights reserved.
DBVERIFY - Verification starting : FILE =/home/grid/amdu_2015_12_18_22_21_11/DATA_274.f
DBVERIFY -Verification complete
Total PagesExamined : 12800
Total PagesProcessed (Data) : 252
Total PagesFailing (Data) : 0
Total PagesProcessed (Index): 0
Total PagesFailing (Index): 0
Total PagesProcessed (Other): 131
Total PagesProcessed (Seg) : 0
Total PagesFailing (Seg) : 0
Total PagesEmpty : 12417
Total Pages MarkedCorrupt : 0
Total PagesInflux : 0
Total Pages Encrypted : 0
Highest blockSCN : 4075933 (0.4075933)
这里和x$视图对比一下:
SELECTa.GROUP_KFFXP, a.DISK_KFFXP, a.AU_KFFXP, b.path,c.name
FROM x$kffxp a, v$asm_disk b, v$asm_alias c
WHERE a.number_kffxp = c.file_number
AND a.GROUP_KFFXP = b.group_number
AND a.disk_kffxp= b.disk_number
AND b.group_number=1
AND c.name LIKE '%USERS.274%';
结果就不一一展示了,总计是26个AU,每个4M,正好100+4=104M.另外也可以看出,这里数据文件已打散。
这里再用DD,DD出这些块,然后合并,过程如下:
1 取出相应的块
SQL>select'dd if='||b.path||' bs=4194304 count=1 skip='||au_kffxp||'of=users_'||XNUM_KFFXP||'.dbf'
FROM x$kffxp a,v$asm_disk b, v$asm_alias c
WHERE a.number_kffxp = c.file_number
AND a.GROUP_KFFXP = b.group_number
AND a.disk_kffxp = b.disk_number
AND b.group_number=1
AND c.name LIKE '%USERS.274%'
order by XNUM_KFFXP
dd if=/dev/raw/raw4 bs=4194304 count=1 skip=392 of=users_0.dbf
dd if=/dev/raw/raw2 bs=4194304 count=1 skip=571 of=users_1.dbf
dd if=/dev/raw/raw3 bs=4194304 count=1 skip=384 of=users_2.dbf
dd if=/dev/raw/raw4 bs=4194304 count=1 skip=393 of=users_3.dbf
dd if=/dev/raw/raw2 bs=4194304 count=1 skip=572 of=users_4.dbf
dd if=/dev/raw/raw3 bs=4194304 count=1 skip=385 of=users_5.dbf
dd if=/dev/raw/raw2 bs=4194304 count=1 skip=573 of=users_6.dbf
dd if=/dev/raw/raw4 bs=4194304 count=1 skip=394 of=users_7.dbf
dd if=/dev/raw/raw2 bs=4194304 count=1 skip=574 of=users_8.dbf
dd if=/dev/raw/raw3 bs=4194304 count=1 skip=386 of=users_9.dbf
dd if=/dev/raw/raw2 bs=4194304 count=1 skip=575 of=users_10.dbf
dd if=/dev/raw/raw4 bs=4194304 count=1 skip=395 of=users_11.dbf
dd if=/dev/raw/raw3 bs=4194304 count=1 skip=387 of=users_12.dbf
dd if=/dev/raw/raw2 bs=4194304 count=1 skip=704 of=users_13.dbf
dd if=/dev/raw/raw4 bs=4194304 count=1 skip=396 of=users_14.dbf
dd if=/dev/raw/raw2 bs=4194304 count=1 skip=705 of=users_15.dbf
dd if=/dev/raw/raw3 bs=4194304 count=1 skip=388 of=users_16.dbf
dd if=/dev/raw/raw2 bs=4194304 count=1 skip=706 of=users_17.dbf
dd if=/dev/raw/raw4 bs=4194304 count=1 skip=397 of=users_18.dbf
dd if=/dev/raw/raw3 bs=4194304 count=1 skip=389 of=users_19.dbf
dd if=/dev/raw/raw2 bs=4194304 count=1 skip=707 of=users_20.dbf
dd if=/dev/raw/raw4 bs=4194304 count=1 skip=398 of=users_21.dbf
dd if=/dev/raw/raw2 bs=4194304 count=1 skip=708 of=users_22.dbf
dd if=/dev/raw/raw3 bs=4194304 count=1 skip=390 of=users_23.dbf
dd if=/dev/raw/raw2 bs=4194304 count=1 skip=709 of=users_24.dbf
dd if=/dev/raw/raw4 bs=4194304 count=1 skip=399 of=users_25.dbf
2 执行上述结果,导出
3 合并
SQL>SELECT
'ddif=uses_'||XNUM_KFFXP||'.dbf bs=4194304 count=1seek='||XNUM_KFFXP||' of=users.274.dbf'
FROM x$kffxp a, v$asm_disk b, v$asm_alias c
WHERE a.number_kffxp = c.file_number
AND a.GROUP_KFFXP = b.group_number
AND a.disk_kffxp = b.disk_number
AND b.group_number=1
AND c.name LIKE'%USERS.274%'
orderby XNUM_KFFXP
dd if=users_0.dbf bs=4194304 count=1 seek=0of=users.274.dbf
dd if=users_1.dbf bs=4194304 count=1 seek=1of=users.274.dbf
dd if=users_2.dbf bs=4194304 count=1 seek=2of=users.274.dbf
dd if=users_3.dbf bs=4194304 count=1 seek=3of=users.274.dbf
dd if=users_4.dbf bs=4194304 count=1 seek=4of=users.274.dbf
dd if=users_5.dbf bs=4194304 count=1 seek=5of=users.274.dbf
dd if=users_6.dbf bs=4194304 count=1 seek=6of=users.274.dbf
dd if=users_7.dbf bs=4194304 count=1 seek=7of=users.274.dbf
dd if=users_8.dbf bs=4194304 count=1 seek=8of=users.274.dbf
dd if=users_9.dbf bs=4194304 count=1 seek=9of=users.274.dbf
dd if=users_10.dbf bs=4194304 count=1seek=10 of=users.274.dbf
dd if=users_11.dbf bs=4194304 count=1seek=11 of=users.274.dbf
dd if=users_12.dbf bs=4194304 count=1seek=12 of=users.274.dbf
dd if=users_13.dbf bs=4194304 count=1seek=13 of=users.274.dbf
dd if=users_14.dbf bs=4194304 count=1seek=14 of=users.274.dbf
dd if=users_15.dbf bs=4194304 count=1seek=15 of=users.274.dbf
dd if=users_16.dbf bs=4194304 count=1seek=16 of=users.274.dbf
dd if=users_17.dbf bs=4194304 count=1seek=17 of=users.274.dbf
dd if=users_18.dbf bs=4194304 count=1seek=18 of=users.274.dbf
dd if=users_19.dbf bs=4194304 count=1seek=19 of=users.274.dbf
dd if=users_20.dbf bs=4194304 count=1seek=20 of=users.274.dbf
dd if=users_21.dbf bs=4194304 count=1seek=21 of=users.274.dbf
dd if=users_22.dbf bs=4194304 count=1seek=22 of=users.274.dbf
dd if=users_23.dbf bs=4194304 count=1seek=23 of=users.274.dbf
dd if=users_24.dbf bs=4194304 count=1seek=24 of=users.274.dbf
dd if=users_25.dbf bs=4194304 count=1seek=25 of=users.274.dbf
4 对比验证
[grid@mysql-1amdu_2015_12_21_13_39_36]$ dbv file=DATA_274.f
DBVERIFY: Release 11.2.0.4.0 - Production onMon Dec 21 13:41:09 2015
Copyright(c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
DBVERIFY- Verification starting : FILE =/home/grid/users/amdu_2015_12_21_13_39_36/DATA_274.f
DBVERIFY- Verification complete
TotalPages Examined : 12800
TotalPages Processed (Data) : 252
TotalPages Failing (Data) : 0
TotalPages Processed (Index): 0
TotalPages Failing (Index): 0
TotalPages Processed (Other): 131
TotalPages Processed (Seg) : 0
TotalPages Failing (Seg) : 0
TotalPages Empty : 12417
TotalPages Marked Corrupt : 0
TotalPages Influx : 0
TotalPages Encrypted : 0
Highestblock SCN : 4075933(0.4075933)
[grid@mysql-1amdu_2015_12_21_13_39_36]$ dbv file=users.274.dbf
DBVERIFY:Release 11.2.0.4.0 - Production on Mon Dec 21 13:41:17 2015
Copyright(c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
DBVERIFY- Verification starting : FILE =/home/grid/users/amdu_2015_12_21_13_39_36/users.274.dbf
DBVERIFY- Verification complete
TotalPages Examined : 12800
TotalPages Processed (Data) : 252
TotalPages Failing (Data) : 0
TotalPages Processed (Index): 0
TotalPages Failing (Index): 0
TotalPages Processed (Other): 131
TotalPages Processed (Seg) : 0
TotalPages Failing (Seg) : 0
TotalPages Empty : 12417
TotalPages Marked Corrupt : 0
TotalPages Influx : 0
TotalPages Encrypted : 0
Highestblock SCN : 4075933(0.4075933)
两者在dbv验证都可以通过。
附:x$kffxp简要说明:
GROUP_KFFXP :磁盘组编号
NUMBER_KFFXP :文件编号
PXN_KFFXP :物理区号
XNUM_KFFXP :逻辑区号
LXN_KFFXP :0=primary, 1=first mirror, 2=secondmirror
DISK_KFFXP :磁盘编号
AU_KFFXP:AU号