首页 > Oracle > amdu,从非挂载的asm提取文件

amdu,从非挂载的asm提取文件

ASM是10g时引入的,使用的人不多,偶尔有一些吃“螃蟹”的基本都是用在了linux下做rac,抑或是测着玩,原因在于大家对于新事物还都是观望的态度,传统的裸设备用久了也用熟了。而ASM是一个黑盒,如果ASM坏了,里面的数据文件等各种文件都读不出来岂不傻眼了,干着急没办法,只能求助于Oracle。
从11g开始,Oracle悄无生息的在$ORACLE_HOME/bin目录下多了amdu这个工具,手册上没有这个工具的任何信息,顶多是执行amdu -help会列出这个工具的各种选项,不过google或baidu一下内容就多了,会从各个搜索结果只言片语中立体的了解这个工具,细心一点也会知道Oracle mysupport上的DOC_ID:553639.1简单介绍了这个,Oracle也提供了10g的amdu的版本。
说了这么多,amdu倒底干啥用的,简单的说就是使用它可以从一个崩溃的ASM中把数据文件等各种文件读出来,它的存在为极大的增强最终用户使用asm的信心。它是给Oracle supporter的,不是面向最终用户的。不是每个最终用户都有Oracle服务,所以多学些知识没有坏处,如下以一个测试案例演示一下这个工具的使用。

1 我的环境
CentOS linux 6.5 x86_64的操作系统,Oracle 11.2.0.4版本的Oracle数据库,以/dev/sdb磁盘建了一个名为DATA1的diskgroup,数据库中以+DATA1建了一个名为TBS_DATA1的表空间。

[grid@tt1 ~]$ asmcmd lsdsk -G DATA1
Path
/dev/sdb

SQL> select file#,name from v$datafile;

FILE# NAME
———- ————————————————————
5 +DATA1/tt1/datafile/data_100m_001.dbf
6 +DATA1/tt1/datafile/data_100m_002.dbf

2 rows selected.

SQL>

两个数据文件,每个100MB。

2 测试目标
asm关了,用amdu把data_100m_001.dbf恢复到/yang这个文件系统中.
停:

[grid@tt1 ~]$ crsctl stop has
CRS-2791: Starting shutdown of Oracle High Availability Services-managed resources on ‘tt1’
CRS-2673: Attempting to stop ‘ora.tt1.db’ on ‘tt1’
CRS-2673: Attempting to stop ‘ora.LISTENER.lsnr’ on ‘tt1’
CRS-2677: Stop of ‘ora.LISTENER.lsnr’ on ‘tt1’ succeeded
CRS-2677: Stop of ‘ora.tt1.db’ on ‘tt1’ succeeded
CRS-2673: Attempting to stop ‘ora.DATA1.dg’ on ‘tt1’
CRS-2677: Stop of ‘ora.DATA1.dg’ on ‘tt1’ succeeded
CRS-2679: Attempting to clean ‘ora.DATA1.dg’ on ‘tt1’
CRS-2681: Clean of ‘ora.DATA1.dg’ on ‘tt1’ succeeded
CRS-2673: Attempting to stop ‘ora.asm’ on ‘tt1’
CRS-2677: Stop of ‘ora.asm’ on ‘tt1’ succeeded
CRS-2673: Attempting to stop ‘ora.cssd’ on ‘tt1’
CRS-2677: Stop of ‘ora.cssd’ on ‘tt1’ succeeded
CRS-2673: Attempting to stop ‘ora.evmd’ on ‘tt1’
CRS-2677: Stop of ‘ora.evmd’ on ‘tt1’ succeeded
CRS-2793: Shutdown of Oracle High Availability Services-managed resources on ‘tt1’ has completed
CRS-4133: Oracle High Availability Services has been stopped.

检查:

[grid@tt1 ~]$ crs_stat -t
CRS-0184: Cannot communicate with the CRS daemon.

[grid@tt1 ~]$

确认都已关闭。

3 操作步骤

3.1执行dump操作

[grid@tt1 yang]$ amdu -diskstring ‘/dev/sd*’ -dump DATA1 -noimage
amdu_2014_06_07_21_10_03/

amdu自动在当前目录下生成一以当前时间命令的目录,dump操作默认在这个目录生成三个文件。看一下dump操作结果:

[grid@tt1 yang]$ ls -l
total 4
drwxr-xr-x 2 grid oinstall 4096 Jun 7 21:10 amdu_2014_06_07_21_10_03

[grid@tt1 yang]$ cd amdu_2014_06_07_21_10_03
[grid@tt1 amdu_2014_06_07_21_10_03]$ ls -l
total 12
-rw-r–r– 1 grid oinstall 5280 Jun 7 21:10 DATA1.map
-rw-r–r– 1 grid oinstall 3312 Jun 7 21:10 report.txt

.img文件大且基本用不着,为缩短dump操作时间上面命令加-noimage不生成.img文件。

3.2 文件report.txt
文件report.txt包含服务器的信息, 所使用amdu的选项, 哪些磁盘是DATA1这个diskgroup的成员,每块磁盘有多少AU等信息,如下我们看一下这个文件:

[grid@tt1 amdu_2014_06_07_21_10_03]$ more report.txt
-*-amdu-*-

******************************* AMDU Settings ********************************
ORACLE_HOME = /grid/app/grid/11.2.0
System name: Linux
Node name: tt1
Release: 2.6.32-431.el6.i686
Version: #1 SMP Fri Nov 22 00:26:36 UTC 2013
Machine: i686
amdu run: 07-JUN-14 21:10:03
Endianess: 1

—————————– DISK REPORT N0001 ——————————
Disk Path: /dev/sdb
Unique Disk ID:
Disk Label:
Physical Sector Size: 512 bytes
Disk Size: 20480 megabytes
Group Name: DATA1
Disk Name: DATA1_0000
Failure Group Name: DATA1_0000
Disk Number: 0
Header Status: 3
Disk Creation Time: 2014/05/29 05:50:35.538000
Last Mount Time: 2014/06/03 19:15:46.272000
Compatibility Version: 0x0b200000(11020000)
Disk Sector Size: 512 bytes
Disk size in AUs: 20480 AUs
Group Redundancy: 1
Metadata Block Size: 4096 bytes
AU Size: 1048576 bytes
Stride: 113792 AUs
Group Creation Time: 2014/05/29 05:50:35.194000
File 1 Block 1 location: AU 2
OCR Present: NO

—————————– DISK REPORT N0002 ——————————
Disk Path: /dev/sdc
Unique Disk ID:
Disk Label:
Physical Sector Size: 512 bytes
Disk Size: 20480 megabytes
** NOT A VALID ASM DISK HEADER. BAD VALUE IN FIELD blksize_kfdhdb **

***************** Slept for 6 seconds waiting for heartbeats *****************

************************** SCANNING DISKGROUP DATA1 **************************
Creation Time: 2014/05/29 05:50:35.194000
Disks Discovered: 1
Redundancy: 1
AU Size: 1048576 bytes
Metadata Block Size: 4096 bytes
Physical Sector Size: 512 bytes
Metadata Stride: 113792 AU
Duplicate Disk Numbers: 0

—————————- SCANNING DISK N0001 —————————–
Disk N0001: ‘/dev/sdb’
AMDU-00204: Disk N0001 is in currently mounted diskgroup DATA1
AMDU-00201: Disk N0001: ‘/dev/sdb’
** HEARTBEAT DETECTED **
Allocated AU’s: 3217
Free AU’s: 17263
AU’s read for dump: 66
Block images saved: 14853
Map lines written: 66
Heartbeats seen: 1
Corrupt metadata blocks: 0
Corrupt AT blocks: 0

———————— SUMMARY FOR DISKGROUP DATA1 ————————-
Allocated AU’s: 3217
Free AU’s: 17263
AU’s read for dump: 66
Block images saved: 14853
Map lines written: 66
Heartbeats seen: 1
Corrupt metadata blocks: 0
Corrupt AT blocks: 0

******************************* END OF REPORT ********************************

能看到/dev/sdb上每人AU为1MB

3.3 文件DATA1.map
文件DATA1.map包含了文件、磁盘及AU的对应关系,是amdu最有用的一个文件,让我们看一下其内容:

[grid@tt1 amdu_2014_06_07_21_10_03]$ more DATA1.map
N0001 D0000 R00 A00000000 F00000000 I0 E00000000 U00 C00256 S0000 B0000000000
N0001 D0000 R00 A00000001 F00000000 I0 E00000000 U00 C00256 S0000 B0000000000
N0001 D0000 R00 A00000002 F00000001 I0 E00000000 U00 C00256 S0000 B0000000000
N0001 D0000 R00 A00000003 F00000002 I0 E00000000 U00 C00256 S0000 B0000000000
N0001 D0000 R00 A00000004 F00000003 I0 E00000000 U00 C00256 S0000 B0000000000
N0001 D0000 R00 A00000005 F00000003 I0 E00000001 U00 C00256 S0000 B0000000000

N0001 D0000 R00 A00003073 F00000269 I1 E00000000 U00 C00256 S0000 B0000000000
N0001 D0000 R00 A00003175 F00000270 I1 E00000000 U00 C00256 S0000 B0000000000
[grid@tt1 amdu_2014_06_07_21_10_03]$

看这一块,A00003073 F00000269代表的是N0001这块磁盘中的第3073个AU包含ASM 269这个文件。

3.4 确认一下data_100m_001.dbf这个数据文件对应ASM上的哪个文件
如果ASM是mounted状态这事好办了,可现在恰恰不是这样,不过还有是办法的
ASM 无数据文件6是alias目录, 如果你问我是咋知道的,我只能说Oracle就这么定义的,是Oracle supporter告诉我的。所以通过查DATA.map文件, 我能找到ASM文件6相应的AU

[grid@tt1 amdu_2014_06_07_21_10_03]$ grep F00000006 DATA1.map
N0001 D0000 R00 A00000048 F00000006 I0 E00000000 U00 C00256 S0000 B0000000000
[grid@tt1 amdu_2014_06_07_21_10_03]$

相当幸运,只有一行,通过它我们知道N0001这块磁盘的第48个AU包含alias目录,通过report.txt我们知道其为/dev/sdb这块磁盘,这块磁盘的AU大小为1MB,如下用kfed命令查看一下alias目录。

[grid@tt1 amdu_2014_06_07_21_10_03]$ ls -l /dev/sdb
brw-rw—- 1 grid asmadmin 8, 16 Jun 7 21:19 /dev/sdb

[grid@tt1 amdu_2014_06_07_21_10_03]$ kfed read /dev/sdb aun=48 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 11 ; 0x002: KFBTYP_ALIASDIR


可见确实其为alias目录。
确认一下data_100m_001.dbf对应哪个asm文件:

for (( i=0; i<256; i++ )) do kfed read /dev/sdb aun=48 blkn=$i |grep -1 "data_" done kfade[9].entry.refer.incarn: 0 ; 0x2dc: A=0 NUMM=0x0 kfade[9].name: data_100m_001.dbf ; 0x2e0: length=17 kfade[9].fnum: 269 ; 0x310: 0x0000010d -- kfade[11].entry.refer.incarn: 0 ; 0x374: A=0 NUMM=0x0 kfade[11].name: data_100m_002.dbf ; 0x378: length=17 kfade[11].fnum: 270 ; 0x3a8: 0x0000010e

256哪来的?其实就是C00256,可以见到data_100m_001.dbf对应的是asm 269这个文件。

3.5 extract文件到文件系统就简单了
执行如下命令:

[grid@tt1 amdu_2014_06_07_21_10_03]$ amdu -diskstring=”/dev/sd*” -extract DATA1.269 -output data_100m_001.dbf -noreport -nodir

[grid@tt1 amdu_2014_06_07_21_10_03]$ ls -l *dbf
-rw-r–r– 1 grid oinstall 104865792 Jun 7 23:55 data_100m_001.dbf
[grid@tt1 amdu_2014_06_07_21_10_03]$

amdu选项说明:
-diskstring: DG的对应于OS上的设备.
-extract: 提取.
-output: 输出文件名,默认在当前目录.
-noreport: 不生成report.txt文件
-nodir: 不生成目录

4 校验提取的文件

[grid@tt1 amdu_2014_06_07_21_10_03]$ dbv file=data_100m_001.dbf BLOCKSIZE=8192

DBVERIFY: Release 11.2.0.4.0 – Production on Sun Jun 8 02:11:33 2014

Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.

DBVERIFY – Verification starting : FILE = /yang/amdu_2014_06_07_21_10_03/data_100m_001.dbf

DBVERIFY – Verification complete

Total Pages Examined : 12800
Total Pages Processed (Data) : 129
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 77
Total Pages Failing (Index): 0
Total Pages Processed (Other): 146
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 12448
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 475899 (0.475899)
[grid@tt1 amdu_2014_06_07_21_10_03]$

可见提取的没有问题。

分类: Oracle 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.