AMDU-- ASM文件转移工具

简介:

      近日遇到一个问题,就是ASM diskgroup无法挂载,通过分析之后,发现有会快存在,但是由于没有备份,没有办法重建diskgroup并从backup恢复--所以所以所以....备份很重要啊!不然,哭!!是早晚的事情!
通过解决这个问题,我在自己的测试环境测试了如何在ASM diskgroup无法mount的情况下,尽量挽救数据文件。

这里使用到oracle 工具AMDU,该具体信息可以参考AMDU functionality and usage (Doc ID 855791.1)


1. 由于diskgroup无法挂载,SPFILE、CONTROLFILE、DATAFILE都无法读取
根据步骤,我们首先需要恢复spfile文件,spfile文件存在的意义就是找到control_files的位置,如果spfile无法访问,需要查找备份。
1
2
SQL> show parameter control_files
+DATA/db/controlfile/current. 260.804295233 , +FRA/db/controlfile/current. 256.804295237
2. 通过ASM实例找到asm_diskstring
1
2
3
4
5
SQL> show parameter disk
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
asm_diskgroups                       string      DATA, FRA
asm_diskstring                       string      /dev/sd*
3. 查找asm disk的路径,后续要指定diskstring来扫描磁盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> select NAME,STATE,TYPE,OFFLINE_DISKS,VOTING_FILES  from v$asm_diskgroup;     
  SQL> col PATH  for  a50
  SQL> col name  for  a10
  SQL>  set  line  200
  SQL> select DISK_NUMBER,GROUP_NUMBER,PATH,name from v$asm_disk;
DISK_NUMBER GROUP_NUMBER PATH                                               NAME
----------- ------------ -------------------------------------------------- ----------
           1             2  /dev/oracleasm/disks/ASMDISK5                      FRA_0001
           0             2  /dev/oracleasm/disks/ASMDISK4                      FRA_0000
           2             1  /dev/oracleasm/disks/ASMDISK3                      DATA_0002
DISK_NUMBER GROUP_NUMBER PATH                                               NAME
----------- ------------ -------------------------------------------------- ----------
           1             1  /dev/oracleasm/disks/ASMDISK2                      DATA_0001
           0             1  /dev/oracleasm/disks/ASMDISK1                      DATA_0000
4. 在diskgroup mount状态,是不能使用amdu导出文件的
执行amdu命令开始导出,遇到错误
1
2
3
4
$  amdu -diskstring  '/dev/oracleasm/disks/ASMDISK*'  -extract data. 260
amdu_2013_07_03_17_29_13/
AMDU- 00204 : Disk N0005  is  in  currently mounted diskgroup DATA
AMDU- 00201 : Disk N0005:  '/dev/oracleasm/disks/ASMDISK1'
检查发现磁盘组mount
1
2
3
4
5
6
7
8
$ crsctl status res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS
--------------------------------------------------------------------------------
ora.DATA.dg
                ONLINE  ONLINE       single-db
ora.FRA.dg
                ONLINE  ONLINE       single-db
5. 导出控制文件
1
2
3
4
5
$  amdu -diskstring  '/dev/oracleasm/disks/ASMDISK*'  -extract data. 260
amdu_2013_07_03_17_46_07/
[oracle@Single-DB amdu]$ cd amdu_2013_07_03_17_46_07/
[oracle@Single-DB amdu_2013_07_03_17_46_07]$ ls
DATA_260.f  report.txt


6. 尝试挂载control file
发现spfile也存放在磁盘组中无法nomount
1
2
3
4
5
6
7
8
9
10
$ sqlplus /  as  sysdba
SQL> startup nomount;
ORA- 01078 : failure  in  processing system parameters
ORA- 01565 : error  in  identifying file  '+DATA/db/spfiledb.ora'
ORA- 17503 : ksfdopn: 2  Failed to open file +DATA/db/spfiledb.ora
ORA- 15056 : additional error message
ORA- 17503 : ksfdopn:DGOpenFile05 Failed to open file +DATA/db/spfiledb.ora
ORA- 17503 : ksfdopn: 2  Failed to open file +DATA/db/spfiledb.ora
ORA- 15001 : diskgroup  "DATA"  does not exist or  is  not mounted
ORA- 06512 : at line  4

7. 那就编辑一个新的pfile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ cp init.ora spfilebk.ora
$ vi spfilebk.ora
~~~~~~~~~~~~~~~
db_name= 'DB'
sga_target=1G
processes =  150
audit_trail = 'db'
db_block_size= 8192
db_domain= ''
db_recovery_file_dest_size=2G
open_cursors= 300
remote_login_passwordfile= 'EXCLUSIVE'
undo_tablespace= 'UNDOTBS1'
control_files = /u01/amdu/amdu_2013_07_03_17_46_07/DATA_260.f
compatible = '11.2.0'
~~~~~~~~~~~~~~~
8. 通过导出的控制文件启动数据库到mount模式,成功启动,说明AMDU导出的数据时正确的,继续。。。。。
1
2
3
4
5
6
7
8
9
10
$ sqlplus /  as  sysdba
SQL> startup nomount pfile= '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfilebk.ora' ;
ORACLE instance started.
Total System Global Area  1068937216  bytes
Fixed Size                   2220200  bytes
Variable Size              281022296  bytes
Database Buffers           780140544  bytes
Redo Buffers                 5554176  bytes
SQL> alter database mount;
Database altered.
9. 查看数据文件的位置,然后一一导出
1
2
3
4
5
6
7
8
9
10
11
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
+DATA/db/datafile/system. 256.804295135
+DATA/db/datafile/sysaux. 257.804295137
+DATA/db/datafile/undotbs1. 258.804295139
+DATA/db/datafile/users. 259.804295141
$  amdu -diskstring  '/dev/oracleasm/disks/ASMDISK*'  -extract data. 256      <<<<<<<<<<<<<<system
$  amdu -diskstring  '/dev/oracleasm/disks/ASMDISK*'  -extract data. 257      <<<<<<<<<<<<<<sysaux
$  amdu -diskstring  '/dev/oracleasm/disks/ASMDISK*'  -extract data. 258      <<<<<<<<<<<<<<undotbs1
$  amdu -diskstring  '/dev/oracleasm/disks/ASMDISK*'  -extract data. 259      <<<<<<<<<<<<<<users .
10. 重命名数据文件,并移动到同一个目录下,准备挂载数据文件
1
2
3
4
5
6
7
8
$ mv amdu_2013_07_03_18_12_56/DATA_257.f sysaux. 257.804295137
$ mv amdu_2013_07_03_18_22_23/DATA_259.f users. 259.804295141
$ mv amdu_2013_07_03_18_23_06/DATA_258.f undotbs1. 258.804295139
$ ll
-rw-r--r--  1  oracle dba  545267712  Jul   3  18 : 14  sysaux. 257.804295137
-rw-r--r--  1  oracle dba  702554112  Jul   3  18 : 11  system. 256.804295135
-rw-r--r--  1  oracle dba   99622912  Jul   3  18 : 23  undotbs1. 258.804295139
-rw-r--r--  1  oracle dba    5251072  Jul   3  18 : 22  users. 259.804295141
11. 挂载前需要修改pfile文件,下面是open数据库是control file如何识别不同路径的datafile, 我使用convert参数来解决(也可以是用set newname的方式)
db_file_name_convert='+DATA/db/datafile','/u01/amdu/amdu_datafile'
添加完pfile,启动数据库,最终成功启动数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> startup pfile= '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfilebk.ora' ;
[oracle@Single-DB ~]$ sqlplus /  as  sysdba
Connected to an idle instance.
SQL> startup pfile= '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfilebk.ora' ;
ORACLE instance started.
Total System Global Area  1068937216  bytes
Fixed Size                   2220200  bytes
Variable Size              281022296  bytes
Database Buffers           780140544  bytes
Redo Buffers                 5554176  bytes
Database mounted.
Database opened.
SQL>  select status, instance_name  from v$instance;
STATUS       INSTANCE_NAME
------------ ----------------
OPEN         db
总结,备份很重要!!
由于是在我测试库上进行的实验,我没有破坏数据文件来完全模拟客户问题。
但是通过这个测试,我们可以确认的是,在ASM diskgroup无法挂载的情况下,我们是有办法将数据文件读出(即使是坏的),然后我们在针对具体的坏块尝试block恢复(估计没有备份,这个也没辙了)。
但是至少,数据文件摆在我们面前了,我们还有其他很多办法去尝试修复,再不行,也只是丢失部分数据,因为其中可能只是个别数据文件的个别block损坏。
总之,数据文件弄出来了,剩下的,继续研究吧。









本文转自 hsbxxl 51CTO博客,原文链接:http://blog.51cto.com/hsbxxl/1334650,如需转载请自行联系原作者

目录
相关文章
|
监控 Java Android开发
【字节码插桩】AOP 技术 ( “字节码插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )
【字节码插桩】AOP 技术 ( “字节码插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )
298 0
【字节码插桩】AOP 技术 ( “字节码插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )
|
Oracle 关系型数据库 数据库
|
Oracle 关系型数据库 数据库管理
|
存储 关系型数据库 Oracle
ASM管理命令行三工具:KFOD、KFED和AMDU
ASM管理命令行三工具:KFOD、KFED和AMDU ASM(Automatic Storage Management)是Oracle目前主推的软集群存储策略。
1103 0
|
SQL Oracle 关系型数据库
【ASM】ASM数据文件和OS文件(FILESYSTEM)转移方法总结
【ASM】ASM数据文件和OS文件(FILESYSTEM)转移方法总结 blog文档结构图:   1  说明 本blog介绍了各种asm数据文件和filesystem文件之间的转换方法,有的记录了过程,有的没有记录过程只记录了相关代码,大家若有兴趣可以自行测试。
855 0