试用ODU软件恢复corrupt block

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 试用ODU软件恢复corrupt block

试用ODU软件恢复corrupt block

Oracle的数据恢复处理,有各种方法工具支持,在这方面,我算是一个新手,也是处于不断的学习中。

业界有一些著名的恢复软件,简单罗列一下,

1. Oracle DUL

是 Oracle公司内部的数据库恢复工具,由在荷兰的Oracle Support,Bernard van Duijnen开发,需要注意的是,DUL不是Oracle的一个产品,不是一个受Oracle支持的产品。DUL被严格限制为Oracle Support售后支持部门内部使用,其使用在国外需要经过Oracle公司的内部审批,首先你必须购买了Oracle的标准服务PS才可能用到DUL, 否则甚至没有资格使用DUL。之所以被严格控制的一个原因是其采用了部分Oracle源代码,所以必须被严格控制。

DUL 可以从已经损坏严重的数据库中抽取数据, DUL可以直接扫描Oracle Datafile数据文件,并识别表头块segment header,访问Extent盘区信息,并从中读取实际行数据。后续DUL能生成SQLLDR形式的导入文件,或者EXP格式的DMP文件。如果SYSTEM表空间数据文件还在,那么DUL读取Oracle数据字典。否则DUL采取采用的形式实际读取行,并根据内部算法判断字段类型,字段长度。DUL直接从Oracle Datafile抽取数据,而无需Oracle数据库实例。 DUL兼容ORACLE 6,7,8和9以及10g,11g,12c。

DUL User’s and Configuration Guide V10.2.4.27:

http://www.askmaclean.com/wp-content/uploads/2014/01/DUL-Users-and-Configuration-Guide-V10.2.4.27.pdf

2. Oracle ODU

试用ODU软件恢复corrupt block

Oracle Database Unloader,是类似于Oracle DUL的一款恢复软件,他的作者是两位ACED,老熊和dbsnake。ODU用于直接从Oracle数据库的数据文件中获取表数据。在各种原因造成的数 据库不能打开时,可用于抢救数据,最大限度地减少数据丢失。ODU软件同样不需要运行Oracle软件,直接读取数据文件解析数据。支持的Oracle数 据库版本包括7,8i,9i,10g,11g,12c。其他支持和介绍,可以参考:http://www.oracleodu.com/cn/。

3. PRM-DUL

作 者是诗檀软件,Maclean Liu。为了解决ORA-00600、数据库打不开、ASM Diskgroup无法Mount、SELECT报错、硬盘/存储/文件系统故障引起的数据库问题、丢失数据文件。相关介绍,可以参考http: //www.parnassusdata.com/oracle-recovery-landing/index.html。

4. AUL(MyDUL)

作 者是楼方鑫(d.b.c.a),AUL可以脱离Oracle软件从Oracle数据文件中直接读取数据。如果无法正常启动Oracle数据,并且没有有效 备份可供恢复时,例如, 丢失SYSTEM表空间,表被意外删除或Truncate,或数据文件有严重坏块。可以选择AUL(Feature Overview)作为最后的恢复手段,同Oracle提供的恢复服务相比,成本相对较低廉。但目前应该未有更新了。

5. mydul

和 d.b.c.a的软件同名了,这是我从itpub论坛看见的一款,作者wzsh-Sun,软件目前支持Linux,AIX下Oracle 9i,10g各种block_size的数据库的挖掘,和上面几种相比,从支持力度上看,要弱一些,但貌似开源了,具体可以参考 http://www.itpub.net/thread-550802-1-1.html。

总体来看,(2)和(3)可以正常使用,但均未收费版本,免费版本有限制,(1)是Oracle内部人员使用,(4)已经不再更新,(5)通用性弱一些。

最近正巧,有一个存在corrupt block的数据文件,尝试使用ODU恢复,趁机学习一下。一些参考资料:

ODU用户手册下载:

http://www.oracleodu.com/soft/ODUUserGuide_cn.pdf ODU官方链接: http://www.oracleodu.com/cn/ 老熊博客中关于ODU的文章: http://www.laoxiong.net/category/odu

老熊博客中关于ODU的文章:

不同平台版本,可以下载,

http://www.oracleodu.com/cn/download

试用ODU软件恢复corrupt block

要运行odu需要一些配置文件,包括如下两个,

  1. config.txt配置文件,如下红色字体,为更改了默认的配置,其他配置项采用默认参数,

byte_order little block_size  8192 block_buffers 1024 db_timezone -7 client_timezone 8 asmfile_extract_path   /asmfile data_path   /DATA/oracle/odu lob_path    /odu/data/lob charset_name US7ASII ncharset_name AL16UTF16 output_format text lob_storage infile clob_byte_order big trace_level 1 delimiter | unload_deleted no file_header_offset 0 is_tru64 no record_row_addr no convert_clob_charset yes use_scanned_lob  yes trim_scanned_blob yes lob_switch_dir_rows 20000 db_block_checksum yes db_block_checking yes rdba_file_bits 10

compatible 11

compatible 11

这两个参数含义,

DATA_PATH

DATA_PATH指定恢复的数据所存储的目录,如果需要恢复的数量量非常大,可以用这个参数值指定一个与ODU软件所在目录不同的路径。注意这个参数指定的目录必须是已经存在的,ODU不会自动创建这个目录。
可以使用相对路径,也可以使用绝对路径。默认值为”data”,表示恢复的数据缺省保存在ODU软件所在目录的data子目录中。
在数据恢复时,应该首先估算需要的存储空间用于存储恢复的数据。建议将DATA_PATH设置为单独的容量足够大的文件系统。

COMPATIBLE

用于指定数据库的版本。默认值为10,即10g。这个参数的有效值为Oracle的主版本号, 从7至12。

  1. control.txt配置文件,为需要进行恢复的数据文件,包括文件编号、表空间号、文件路径、数据块量,等一系列信息,

#ts fno   rfno     filename   block_size  is_big_file header_offset blocks 0 1 1 /DATA/oracle/oradata/DATA/system01.dbf 9 12 12 /DATA/oracle/oradata/DATA/data01.dbf

其中#ts、fno这些信息,可以使用如下SQL,得到control.txt需要的数据文件配置,

SQL SELECT name, file#, ts#, rfile# FROM v$datafile;

/DATA/oracle/oradata/DATA/system01.dbf    1    0    1 /DATA/oracle/oradata/DATA/sysaux01.dbf    2    1    2 /DATA/oracle/oradata/DATA/undotbs01.dbf  3    2    3 /DATA/oracle/oradata/DATA/users01.dbf      4    4    4

...

/DATA/oracle/oradata/DATA/data01.dbf       12   9   12

...

值得注意的是,ODU并不是从文件号为1的数据文件中得到bootstrap$地址进而得到数据字 典,而是从ODU控制文件的第一行指定的文件中得到bootstrap$地址。所以,需要将SYSTEM表空间中的第1个数据文件放置于control.txt中的第1行,如下所示,第二行的data01.dbf为需要恢复的文件,

#ts fno   rfno     filename   block_size  is_big_file header_offset blocks 0 1 1 /DATA/oracle/oradata/DATA/system01.dbf 9 12 12 /DATA/oracle/oradata/DATA/data01.dbf

如果第一行不是system01.dbf,就会得到如下的错误:

can not get bootstrap$ address from SYSTEM tablespace

执行odu指令,进入操作控制台,可以看出,初始化加载了config.txt,以及control.txt配置文件,

./odu
Oracle Data Unloader trial version 4.1.3
Copyright (c) 2008,2009,2010,2011 XiongJun. All rights reserved.

Web: http://www.oracleodu.com Email: magic007cn@gmail.com

loading default config.......

byte_order little block_size  8192 block_buffers 1024 error at line 3. db_timezone -7 Invalid db timezone:-7 client_timezone 8 Invalid client timezone:8 asmfile_extract_path   /asmfile data_path   /DATA/oracle/odu lob_path    /odu/data/lob charset_name US7ASII charset name 'US7ASII' not found,will use default charset ZHS16GBK ncharset_name AL16UTF16 output_format text lob_storage infile clob_byte_order big trace_level 1 delimiter | unload_deleted no file_header_offset 0 is_tru64 no record_row_addr no convert_clob_charset yes use_scanned_lob  yes trim_scanned_blob yes lob_switch_dir_rows 20000 db_block_checksum yes db_block_checking yes rdba_file_bits 10 compatible 11 load config file 'config.txt' successful loading default asm disk file ......

grp# dsk# bsize ausize disksize diskname        groupname       path ---- ---- ----- ------ -------- --------------- --------------- -------------------------------------------- load asm disk file 'asmdisk.txt' successful loading default control file ......

 ts#   fn  rfn bsize   blocks bf offset filename ---- ---- ---- ----- -------- -- ------ --------------------------------------------    0    1    1  8192   896000 N       0 /DATA/oracle/oradata/DATA/system01.dbf    9   12   12  8192  3840000 N       0 /DATA/oracle/oradata/DATA/data01.dbf load control file 'control.txt' successful loading dictionary data......done loading scanned data......done

使用load config可以重新加载config.txt配置,

ODU load config byte_order little block_size  8192 block_buffers 1024 error at line 3. db_timezone -7 Invalid db timezone:-7 client_timezone 8 Invalid client timezone:8 asmfile_extract_path   /asmfile data_path   /DATA/oracle/odu lob_path    /odu/data/lob charset_name US7ASII charset name 'US7ASII' not found,will use default charset ZHS16GBK ncharset_name AL16UTF16 output_format text lob_storage infile clob_byte_order big trace_level 1 delimiter | unload_deleted no file_header_offset 0 is_tru64 no record_row_addr no convert_clob_charset yes use_scanned_lob  yes trim_scanned_blob yes lob_switch_dir_rows 20000 db_block_checksum yes db_block_checking yes rdba_file_bits 10 compatible 11 load config file 'config.txt' successful

执行unload dict加载数据字典信息,

试用ODU软件恢复corrupt block

如果忘了指令,随意输入,会有提示信息,

ODU unload unload dict [block bootstrap block# unload table schema.tablename [object truncate] [partition partition_name] unload table schema.tablename [object scanned] [partition partition_name] unload table schema.tablename object data_obj_id [tablespace ts_no] unload table schema.tablename datafile rfile# block block# [blocks blocks] [partition partition_name] unload object data_obj_id [tablespace ts_no] [cluster cluster_no]  column type [ type [ type......]     type: VARCHAR2 VARCHAR CHAR NUMBER SKIP LONG RAW           DATE LONG_RAW TIMESTAMP TIMESTAMP_TZ TIMESTAMP_LTZ           BINARY_FLOAT BINARY_DOUBLE NVARCHAR2 NCHAR           CLOB NCLOB BLOB unload object data_obj_id [tablespace ts_no] [cluster cluster_no]  sample unload object all [tablespace ts_no] sample unload user schema name

执行scan extent,扫描数据文件区,/DATA/oracle/oradata/DATA/data01.dbf文件容量30G,执行scan extent约为20分钟,

ODU scan extent

scan extent start: 2017-12-26 01:20:15 scanning extent...

scanning extent finished. scan extent completed: 2017-12-26 01:40:20

执行unload table恢复表数据,此处我需要恢复分区表,某一个分区数据,需要注意,如果表名、分区名称是小写,会报错找不着,

ODU unload table user.tbl object scanned partition tbl_2016q1 Using scanned extent. partition 'tbl_2016q1' does not exist.

表名、分区名称,改为大写,提示恢复了114225行的数据,

ODU unload table USER.TBL object scanned partition TBL_2016Q1 Using scanned extent.

Unloading table: TBL,partition: TBL_2016Q1 object ID: 117775 Unloading segment,storage(Obj#=117784 DataObj#=117784 TS#=9 File#=14 Block#=761986 Cluster=0) 114225 rows unloaded

数据恢复完成,odu路径内容如下,

试用ODU软件恢复corrupt block

这些后缀odu的文件,就是恢复出来的一些配置,例如user.odu,显示了数据库用户和角色,

0,SYS 1,PUBLIC 2,CONNECT 3,RESOURCE 4,DBA 5,SYSTEM 6,SELECT_CATALOG_ROLE 7,EXECUTE_CATALOG_ROLE 8,DELETE_CATALOG_ROLE 9,OUTLN 10,EXP_FULL_DATABASE

...

config.txt中的data_path(/DATA/oracle/odu)定义路径,存储了三个文件,这就是恢复出来的数据,

-rw-r--r-- 1 ora11g dba 985 Dec 22 10:35 USER_TBL.sql -rw-r--r-- 1 ora11g dba 970 Dec 22 10:35 USER_TBL.ctl -rw-r--r-- 1 ora11g dba 12M Dec 22 10:36 USER_TBL.txt

其中,

USER_TBL.sql:列出表结构定义。

USER_TBL.ctl:sqlldr控制文件。 USER_TBL.txt:sqlldr数据文件。

可以使用USER_TBL.sql创建表结构,使用USER_TBL.ctl和USER_TBL.txt,用sqlldr工具进行导入,就完成了恢复。

tbl_2016q1分区包含20万数据,但实际只恢复了11万数据,咨询告知,试用版一个block只会恢复1条数据,可以理解,毕竟是一款个人软件,需要保护版权,支持原创,

试用版仅用于测试、学习和验证,只能恢复SYSTEM表空间下的数据,对于其他表空间的数据,仅恢复少量的数据以验证数据可恢复。而正式版在获取LICENSE后能够恢复所有能够恢复的数据。

ODU的使用上还是比较简单,操作并不复杂,帮助信息丰富,足以快速掌握,朋友们有兴趣,可以下载试用。

如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

试用ODU软件恢复corrupt block 试用ODU软件恢复corrupt block
本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 试用ODU软件恢复corrupt block


 上一篇
Xtrabackup实现数据的备份与恢复 Xtrabackup实现数据的备份与恢复
  Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁);mysqldump备份方式是采用的逻辑备份,其最大的缺陷
下一篇 
CBO如何选择相同cost的索引 CBO如何选择相同cost的索引
ACOUG年会杨长老的演讲中,曾提到一个问题, 一条SQL语句,两种执行计划的cost值相同,CBO是如何选择执行计划? 翻译一下问题,创建测试表数据, SQL create table z (a number, b nu