集群损坏,如何抢救抽取数据?

来源:这里教程网 时间:2026-03-03 22:40:42 作者:

AMDUASM 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、抓紧导出数据

相关推荐