AMDU( ASM Metadata Dump Utility)是Oracle数据库提供的一个强大的、独立的命令行工具。它的核心使命是 在ASM(Automatic Storage Management,自动存储管理)磁盘组(Disk Group)无法挂载(Mount)或发生严重元数据损坏时,提取出几乎所有可用的数据文件。
接下来带大家玩下这个工具
1 、模拟集群无法启动
[root@rac1 ~]# /oracle/grid/crs_1/bin/crsctl stop crs
2 、生成元数据分布报告
[grid@rac1 ~]$ amdu -diskstring '/dev/data' -dump 'DATA' amdu_2023_08_11_12_28_56/ [grid@rac1 amdu_2023_08_11_12_28_56]$ ls DATA_0001.img DATA.map report.txt
report.txt 是磁盘组所包含的每个磁盘的总体说明
DATA.map 记录了磁盘组中元数据文件的扩展分配表及其在 img 文件中的位置
DATA_0001.img 是磁盘组中元数据的 DUMP 映像,每个文件最大为 1 GB
磁盘头损坏的情况下生成DATA 的元数据块布局报告
amdu -diskstring '/dev/oracleasm/disks/*' -ba 'DATA' -ausize 1048576 -blksize 4096
磁盘分配表损坏的情况下生成DATA 的元数据块布局报告
amdu -diskstring '/dev/oracleasm/disks/*' -ba 'DATA' -ausize 1048576 -blksize 4096 -fullscan
3 、生成一个记录所有文件信息的文件
[grid@rac1 amdu_2023_08_11_12_28_56]$ more DATA.map |grep F00000006 N0001 D0000 R00 A00000048 F00000006 I0 E00000000 U00 C00256 S0001 B0048259072
4 、从刚才生成的文件中查找控制文件的fnum ,然后把控制文件给挖出来
[grid@rac1 amdu_2023_08_11_12_28_56]$ more file.text |grep control -A 2 kfade[6].name: control01.ctl ; 0x1fc: length=13 kfade[6].fnum: 295 ; 0x22c: 0x00000127 kfade[6].finc: 1134041455 ; 0x230: 0x4398196f -- kfade[7].name: control02.ctl ; 0x248: length=13 kfade[7].fnum: 294 ; 0x278: 0x00000126 kfade[7].finc: 1134041455 ; 0x27c: 0x4398196f
[grid@rac1 amdu_2023_08_11_12_28_56]$ amdu -diskstring '/dev/data' -dump 'DATA' -norep -nodir -extr DATA.295 -output control01.ctl [grid@rac1 amdu_2023_08_11_12_28_56]$ ls control01.ctl DATA_0001.img DATA.map file.text report.txt
5 、挖出控制文件后,先查找出控制文件中记录的数据文件、redo 日志名字
[grid@rac1 amdu_2023_08_11_12_28_56]$ strings control01.ctl ...... +DATA/orcl/redo02.log +DATA/orcl/redo01.log +DATA/orcl/users01.dbf +DATA/orcl/undotbs01.dbf +DATA/orcl/sysaux01.dbf +DATA/orcl/system01.dbf +DATA/orcl/temp01.dbf +DATA/orcl/example01.dbf +DATA/orcl/undotbs02.dbf +DATA/orcl/redo03.log +DATA/orcl/redo04.log +DATA/orcl/datafile/ogg_tbs.292.1134043213 +DATA/orcl/tempfile/lmtemp3.320.1144437441 ......
6 、根据控制文件中记录的数据名,过滤出每个数据文件和 redo 日志的 fnum
[grid@rac1 ~]$ grep -1 users01.dbf dir2.txt kfade[4].entry.refer.incarn: 0 ; 0x160: A=0 NUMM=0x0 kfade[4].name: users01.dbf ; 0x164: length=11 kfade[4].fnum: 297 ; 0x194: 0x00000129
7 、挖掘出上面查出来的数据文件和redo 日志
[grid@rac1 amdu_2023_08_11_12_28_56]$ amdu -diskstring '/dev/data' -dump 'DATA' -norep -nodir -extr DATA.297 -output users01.dbf [grid@rac1 amdu_2023_08_11_12_28_56]$ amdu -diskstring '/dev/data' -dump 'DATA' -norep -nodir -extr DATA.299 -output undotbs01.dbf [grid@rac1 amdu_2023_08_11_12_28_56]$ amdu -diskstring '/dev/data' -dump 'DATA' -norep -nodir -extr DATA.321 -output sysaux01.dbf [grid@rac1 amdu_2023_08_11_12_28_56]$ amdu -diskstring '/dev/data' -dump 'DATA' -norep -nodir -extr DATA.389 -output system01.dbf ......
[grid@rac1 amdu_2023_08_11_12_28_56]$ ls -rtl total 2301076 -rw-r--r-- 1 grid oinstall 8640 Aug 11 12:29 DATA.map -rw-r--r-- 1 grid oinstall 2860 Aug 11 12:29 report.txt -rw-r--r-- 1 grid oinstall 104882176 Aug 11 12:29 DATA_0001.img -rw-r--r-- 1 grid oinstall 8531810 Aug 11 12:36 file.text -rw-r--r-- 1 grid oinstall 18497536 Aug 11 12:42 control01.ctl -rw-r--r-- 1 grid oinstall 5251072 Aug 11 12:47 users01.dbf -rw-r--r-- 1 grid oinstall 110108672 Aug 11 12:47 undotbs01.dbf -rw-r--r-- 1 grid oinstall 597696512 Aug 11 12:47 sysaux01.dbf -rw-r--r-- 1 grid oinstall 912269312 Aug 11 12:48 system01.dbf -rw-r--r-- 1 grid oinstall 363077632 Aug 11 12:48 example01.dbf -rw-r--r-- 1 grid oinstall 26222592 Aug 11 12:48 undotbs02.dbf -rw-r--r-- 1 grid oinstall 52429312 Aug 11 12:49 redo02.log -rw-r--r-- 1 grid oinstall 52429312 Aug 11 12:49 redo01.log -rw-r--r-- 1 grid oinstall 52429312 Aug 11 12:49 redo03.log -rw-r--r-- 1 grid oinstall 52429312 Aug 11 12:50 redo04.log
[oracle@19c amdutest]$ vi pfile.ora *.audit_file_dest='/oracle/app/admin/orcl/adump' *.compatible='11.2.0.4.0' *.control_files='/home/grid/amdu_2023_08_11_12_28_56/control01.ctl' *.db_block_size=8192 *.db_domain='' *.db_name='orcl' *.diagnostic_dest='/oracle/app' *.dispatchers='(PROTOCOL=TCP) (SERVICE=crmdbXDB)' *.open_cursors=50 *.pga_aggregate_target=490733568 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.sga_target=1472200704 *.undo_tablespace='UNDOTBS1'
8 、rename 数据文件和redo 文件
SQL> startup nomount pfile='D:\oradata\pfile.ora'; ORACLE 例程已经启动。 Total System Global Area 1469792256 bytes Fixed Size 2281336 bytes Variable Size 436207752 bytes Database Buffers 1023410176 bytes Redo Buffers 7892992 bytes SQL> alter database mount; Database altered. SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- +DATA/orcl/system01.dbf +DATA/orcl/sysaux01.dbf +DATA/orcl/undotbs01.dbf +DATA/orcl/users01.dbf +DATA/orcl/example01.dbf +DATA/orcl/undotbs02.dbf +DATA/orcl/datafile/ogg_tbs.292.1134043213 alter database rename file '+DATA/orcl/system01.dbf' to 'D:\oradata\system01.dbf'; alter database rename file '+DATA/orcl/sysaux01.dbf' to 'D:\oradata\sysaux01.dbf'; alter database rename file '+DATA/orcl/undotbs01.dbf' to 'D:\oradata\undotbs01.dbf'; alter database rename file '+DATA/orcl/users01.dbf' to 'D:\oradata\users01.dbf'; alter database rename file '+DATA/orcl/example01.dbf' to 'D:\oradata\example01.dbf'; alter database rename file '+DATA/orcl/undotbs02.dbf' to 'D:\oradata\undotbs02.dbf'; alter database rename file '+DATA/orcl/datafile/ogg_tbs.292.1134043213' to 'D:\oradata\ogg_tbs.292.1134043213'; SQL> select member from v$logfile; MEMBER -------------------------------------------------------------------------------- +DATA/orcl/redo02.log +DATA/orcl/redo01.log +DATA/orcl/redo03.log +DATA/orcl/redo04.log ALTER DATABASE RENAME FILE '+DATA/orcl/redo01.log' to 'D:\oradata\redo01.log'; ALTER DATABASE RENAME FILE '+DATA/orcl/redo02.log' to 'D:\oradata\redo02.log'; ALTER DATABASE RENAME FILE '+DATA/orcl/redo03.log' to 'D:\oradata\redo03.log'; ALTER DATABASE RENAME FILE '+DATA/orcl/redo04.log' to 'D:\oradata\redo04.log'; SQL> alter database open; 数据库已更改。
9、抓紧导出数据
