今天我们通过一则真实的案例来认识oracle 自带工具AMDU,无需将磁盘组mount即可实现数据分析,轻松进行数据恢复。某日,我们收到了一则香港用户ASM破坏案例,请求数据恢复。
灾难描述:这则案例是由于存储误操作引起的:
1.用户进行存储维护和磁盘添加操作
2.维护后发现CRS无法启动
3.检查发现OCR盘损坏,ASM磁盘组受损
4.经用户反复确认,故障原因是因为误操作磁盘导致的ASM磁盘受损
5.为减少意外,客户请求在不更改配置等的情况下安全抽取数据
6.数据库为3节点RAC系统
灾难再一次由于疏忽而降临。
技术回放
对于这个案例,我们有多种手段可以进行恢复,只要ASM磁盘组完好,就可以很容易的从中提取数据,本案例我们使用了AMDU工具进行恢复。
AMDU工具
在Oracle 10g中,ASM磁盘组的信息需要在Mount之后才能通过内部视图查询,如果磁盘组因为故障无法正常加载,那么信息将不可用,这为诊断带来了诸多不便。
从Oracle 11g开始,Oracle提供了一个工具AMDU用于协助诊断,通过这个工具可以在磁盘组加载之前将ASM的元数据抽取出来,用于数据库诊断,这个工具可以向后兼容,引入到10g中。
通过amdu –h可以查看详细的帮助说明,缺省的调用amdu,会自动生成一个以时间命名的目录,该目录下生成的报告文件会记录磁盘组的相关信息:
[oracle@enmou1 ~]$ amdu
amdu_2015_03_29_10_28_41/
[oracle@enmou1 ~]$ cd amdu_2015_03_29_10_28_41/
[oracle@enmou1 amdu_2015_03_29_10_28_41]$ls
report.txt

该报告的主要内容如下:
[oracle@enmou1 amdu_2015_03_29_10_28_41]$more report.txt
-*-amdu-*-
 
*********************** AMDUSettings ****************
ORACLE_HOME = /u01/app/db/11.2.0
System name:    Linux
Node name:      enmou1
Release:        2.6.18-128.el5
Version:        #1 SMP Wed Dec 17 11:41:38 EST 2008
Machine:        x86_64
amdu run:       29-MAR-11 10:28:41
Endianess:      1
---------------------Operations ---------------
********************** DISCOVERY*****************
 
定义特定的参数可以获得ASM磁盘组内部的区间分配等详细信息。以下命令指定转储CRSDG的磁盘组信息,除了报告文件外,还生成了map和img信息文件:
[oracle@enmou1 ~]$ amdu -diskstring '/dev/oracleasm/disks/VOL*'-dump 'CRSDG'
amdu_2015_03_29_10_36_03/
[oracle@enmou1 ~]$ cd amdu_2015_03_29_10_36_03/
[oracle@enmou1 amdu_2015_03_29_10_36_03]$ls
CRSDG_0001.img  CRSDG.map report.txt

这里MAP文件的信息如下,其内容描述了ASM元数据在磁盘组中的位置,最后部分就是指针信息:
 
而IMG文件则是元数据块的镜像转储,为2进制文件,这些文件在ASM出现故障时,可以用于收集信息,分析故障。
AMDU的一个重要参数是extract,该参数可以用于从ASM磁盘组中抽取数据文件,以下是AMDU的帮助信息摘录:
 
这个选项可以用于直接从ASM磁盘组中抽取数据文件。
文件分析
由于磁盘组不能Mount,控制文件也无法访问,我们需要首先分析数据库的文件分布情况,进而通过文件的ASM存储序号来进行文件抽取。
通过告警日志,可以找到数据库的控制文件信息,如下所示,控制文件的ASM文件号是270:
 
随后可以通过amdu提取控制文件:
su - oracle
mkidr –p /u01/d02
cd /u01/d02
amdu -extract DG_REDO.270

取得控制文件之后,可以通过控制文件内容获得数据库的数据文件、日志文件分布情况,以下是从控制文件中获得的信息输出:
 
有了文件分布信息,接下来的恢复就大大简化了。
AMDU文件恢复
获得了文件的分布信息之后,就可以使用amdu工具进行文件提取工作。根据如上的数据文件和日志文件信息,抽取对应的日志文件和数据文件,创建如下脚本:
amdu -extract DG_DATA.282
amdu -extract DG_DATA.278
amdu -extract DG_DATA.281
amdu -extract DG_DATA.280
amdu -extract DG_DATA.279
amdu -extract DG_DATA.277
amdu -extract DG_DATA.276
amdu -extract DG_DATA.284
amdu -extract DG_DATA.283
amdu -extract DG_REDO.274
amdu -extract DG_REDO.273
amdu -extract DG_REDO.276
amdu -extract DG_REDO.275
amdu -extract DG_REDO.272
amdu -extract DG_REDO.271

运行以上脚本,就可以将相应的数据文件和日志文件从磁盘组中提取出来,然后将这些文件整合到一个统一的目录中。
通过配置好的参数文件和抽取的控制文件,可以将数据库启动到 mount 状态,具体过程如下:

export ORACLE_SID=d02
startupnomountpfile='/u01/d02/ora.pfile'
alter database mount;

接下来编写类似如下的文件重命名脚本,将文件指向统一的存储目录:
 
在这个案例中,由于文件和日志完好,数据库随后就可以被成功打开。
 
对于特定的文件,通过以下测试可以验证amdu的恢复过程和文件完好性:
+DG_DATA/proda02/datafile/users.271.768047753'

通过amdu提取文件:
[oracle@oracle]$ amdu -diskstring'/dev/oracleasm/disks/DISK*' -extract 'DG_DATA.271'
   amdu_2015_02_22_02_02_09/

通过更名来重定向数据文件:
SQL> ALTER DATABASE RENAME FILE'+DG_DATA/proda02/datafile/users.271.768047753'
     to'/u01/amdu_2015_02_22_02_02_09/DG_DATA_271.f';
   Database altered.
SQL> alter database open;
Database altered.
SQL> select name from v$datafilewherename like 'DG%';
NAME
--------------------------------------------------------------------------------
/u01/amdu_2015_02_22_02_02_09/DG_DATA_271.f

这个案例的幸运之处在于磁盘组未发生更为严重的损坏,数据文件和日志文件都是完好的,而Oracle的AMDU工具在这种情况下为我们提供了便利的恢复手段。
 
案例警示

这类案例我们已经遭遇了很多,在这里我们再次郑重的提示以下内容:
1.存储的使用分配应当自始至终建立和维护详细的档案
鉴于众多惨痛的数据灾难,结合标准化流程要求,我们建议用户对于数据库的存储规划、分配,建立详细的档案记录,在进行后续的维护操作时,需要严格通过文档进行对比确认,必须严格杜绝低级的误操作行为。

标准化和文档维护不仅仅是流程和管理的需要,也是为技术人员屏蔽错误,保障数据安全的基本要求。我们不能够把文档当做过场或可有可无的摆设,必须将其上升到数据安全的保障层面。
2.涉及到存储的调整,必须多部门协同反复确认
由于底层存储对于数据库的核心作用,我们必须在进行维护时反复确认维护计划,并且通过多部门来统一协调、共同确认,避免流程割裂导致的误操作行为。
常规的存储维护在企业中被定义为系统或存储部门的责任,但是运行于其上的数据库是数据存储的核心使用者,在存储维护的过程中,一定需要数据部门的介入和确认。对于Oracle数据库来说,由于前期的存储划分可能非常零散,包括OCR、VOTING、REDO、DATA等都可能存在独立的存储分区,所以如果不进行严格管理,在后期维护中就可能对其中的部分存储卷产生误操作,导致破坏。
当然,关于备份的重要性,如何强调都不为过,始终保有有效的备份才能够在出现问题时有备无患。

本文引自:
http://mp.weixin.qq.com/s?__biz=MjM5MDAxOTk2MQ==&mid=2650271495&idx=1&sn=7a699b5bd2fd9e4a9c1287da6d77d86a&scene=0#wechat_redirect

数据恢复:AMDU数据抽取恢复的更多相关文章

  1. Linux服务器数据备份恢复策略

    一.Linux 备份恢复基础 1.什么是备份 最简单的讲,备份数据的过程就是拷贝重要的数据到其他的介质之上(通常是可移动的),以保证在原始数据丢失的情况下可以恢复数据.一次备份可能是简单的 cp命令, ...

  2. 实战 SQL Server 2008 数据库误删除数据的恢复

    SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可.但是,这个恢复需要有两个前提条件: 1. 至少有一个误删除之前的数据库完全备份. 2. 数据库的恢复模式(Recovery m ...

  3. [转]实战 SQL Server 2008 数据库误删除数据的恢复

    实战 SQL Server 2008 数据库误删除数据的恢复 关键字:SQL Server 2008, recover deleted records 今天有个朋友很着急地打电话给我,他用delete ...

  4. SQL Server 2008 数据库误删除数据的恢复

    原文:SQL Server 2008 数据库误删除数据的恢复 原文:http://www.cnblogs.com/dudu/archive/2011/10/15/sql_server_recover_ ...

  5. oracle误删除数据的恢复方法

    学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些问题时,我开始寻找答案. 今天主要以oracle数据库 ...

  6. mysql用户授权及数据备份恢复

    用户授权与权限撤销 修改数据库管理员从本机登陆的密码测试: mysqladmin -hlocalhost -uroot -p password "新密码" Enter passwo ...

  7. Oracle误删除数据的恢复方法(转)

    来源:原创网站北京北亚数据恢复中心,转载须注明出处. 学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些 ...

  8. Mysql binlog备份数据及恢复数据,学会这个,我在也不怕删库跑路啦~

    导读 我一直都主张,技多不压身(没有学不会的技术,只有不学习的人),多学一项技能,未来就少求人一次.网上经常听到xxx删库跑路,万一真的遇到了,相信通过今天的学习,也能将数据再恢复回来~~~ 当然啦, ...

  9. Oracle实时数据抽取项目问题总结

    Oracle实时数据抽取项目问题总结 项目背景介绍 项目主要是将Oracle.MySQL.SQLServer.Db2等其他数据库的实时变更数据同步到其他异构数据库中.本篇文章主要是讨论oracle的实 ...

随机推荐

  1. 7 -- Spring的基本用法 -- 7... 创建Bean的3种方式

    7.7 创建Bean的3种方式 ① 调用构造器创建Bean. ② 调用静态工厂方法创建Bean. ③ 调用实例工厂方法创建Bean. 7.7.1 使用构造器创建Bean实例. 使用构造器来创建Bean ...

  2. C++ mysql 乱码

    C++读mysql数据库中的中文显示出来的是乱码 在连接到数据库后加上这么一句 mysql_query(pMYSQL, "SET NAMES GB2312"); 或者 mysql_ ...

  3. Extended VM Disk In VirtualBox or VMware (虚拟机磁盘扩容)

    First, Clean VM all snapshot, and poweroff your VM. vmdk: vmware-vdiskmanager -x 16GB myDisk.vmdk vd ...

  4. scala中隐式转换之隐式转换调用类中本不存在的方法

    /** * Created by root * Description : 隐式转换调用类中本不存在的方法 */ class Person(name : String){ def getPersonN ...

  5. 流媒体服务器+EasyDarwin+EasyPusher+VLC+Red5+OBS+Unity+RTSP+RTMP+FFMPEG

    最近有个需求在Unity中直播桌面,着用到了视频流. ------------------------------ VLC自身有流服务器功能,但是非常慢非常慢,还是用VLC拉流吧,好像大家也是这么做的 ...

  6. psutil的使用

    psutil是Python中广泛使用的开源项目,其提供了非常多的便利函数来获取操作系统的信息. 此外,还提供了许多命令行工具提供的功能,如ps,top,kill.free,iostat,iotop,p ...

  7. Eclipse新建动态web工程项目出现红叉解决方案

    问题描述:之前新建动态web工程一直没有问题,今天新建一个项目后项目名称上突然出现小红叉,子目录文件没有红叉. 解决过程:一开始想到的就是编译器的level设置,调整了一下,仍然没有解决. 然后在标记 ...

  8. luanet分布式lua框架

    luanet最初只是一个网络框架,它简单的封装了一些网络相关接口然后暴露到lua中,让lua可以构建简单的网络应用. 随着我的手游服务器的开发,我发现在C语言中要实现一个简洁易用的RPC调用接口并不容 ...

  9. sklearn 中的 Pipeline 机制 和FeatureUnion

    一.pipeline的用法 pipeline可以用于把多个estimators级联成一个estimator,这么 做的原因是考虑了数据处理过程中一系列前后相继的固定流程,比如feature selec ...

  10. 【linux系列】Centos下安装mysql数据库

    前言 为了测试方便,通常我们会自己安装数据库,以下是在Centos上安装Mysql的操作. 一.检查自己是否安装了MySQL数据库 [root@s201 /home/mysql]#rpm -qa |g ...