DBF文件数据恢复

背景

    由于机房意外断电导致oracle数据库控制文件损坏,数据库实例无法正常启动。在网上查阅了很多资料,有很多讲如何重建控制文件恢复数据的,但是我并没有成功。最后打算换个思路,利用现有工具帮我实现数据恢复。

准备

    1.数据恢复工具AUL(如有需要请联系本人获取)
    2.待恢复DBF数据文件


DBF文件数据恢复_第1张图片
数据准备
  • system01.dbf:记录系统运行信息,包含所有数据库字典,PL/SQL程序代码及其他系统信息
  • undotbs01.dbf:存放回退信息,即DML操作后的旧数据信息
  • sysaux01.dbf:system文件的辅助文件,存放支持oracle系统活动的多种工具如logminer
  • users01.dbf:新建用户未指定存储空间是,默认数据存放在该文件中
  • temp01.dbf:临时表空间数据
  • user1_data.dbf:这是你即将恢复的数据所在的表空间,名字依实际情况而定

恢复步骤

    1.解压AUL6.zip,解压后的文件包括一个exe和一个dll文件。杀毒软件会报木马,我当时为了恢复数据还是冒险打开了,但没有发现什么异常,所以可以忽略。
    2.在aul6.exe同级目录下建两个文件,system.cfg和userdata.cfg,system.cfg中使用的两个dbf是oracle系统的dbf,userdata.cfg中使用的dbf是新建数据库中存放数据的dbf,其不含有表名/结构等信息,仅存放裸数据。
     - 在system.cfg文件中键入:
    0 0 E:\AUL\SYSTEM01.DBF
    0 0 E:\AUL\UNDOTBS01.DBF
     - 在userdata.cfg文件中键入:
    0 0 E:\AUL\USER1_DATA.DBF
    3.双击aul.exe打开命令窗口,输入open system.cfg,正常会出现如下图所示结果:


DBF文件数据恢复_第2张图片

4.依次执行下面四条命令:
unload table user$;
unload table obj$;
unload table tab$;
unload table col$;
执行完后,aul6.exe同级目录下会生产四个大小均不为0的文件:aulusr.txt, aulobj.txt,aultab.txt, aulcol.txt,如果有文件大小为0,则说明存在问题。


DBF文件数据恢复_第3张图片
执行命令

DBF文件数据恢复_第4张图片
执行结果

5.打开aulusr.txt,可找到你要恢复数据所属用户的名称,比如此处我们要恢复的数据用户是user1。
DBF文件数据恢复_第5张图片

6.执行命令:open userdata.cfg,回车,正常情况,效果应与打开system.cfg时效果相同,输出数据块大小、数量等信息。

7.执行命令:list table user1 to user1.txt;回车,生成所有待导出数据表脚本,此处user1即数据表的用户名。在aul6.exe同级目录下找到user1.txt,正常情况该文件大小不为0,打开,找到待恢复的数据表,把其它记录(大多为系统表)全部删除,保存,将文件扩展名改为sql。如下图:
1.jpg

8.执行命令:@user1.sql;执行完后,aul6.exe同级目录下一个表会生成3个文件,如图:
DBF文件数据恢复_第6张图片
1.jpg

9.打开PLSQL连接一个正常的数据库,执行POI_syntax.sql文件,创建数据表。


DBF文件数据恢复_第7张图片
SQL执行

DBF文件数据恢复_第8张图片
SQL执行结果

10.使用oracle自带的sqlldr命令装载文本数据,新开cmd窗口,将路径切换到aul6.exe同级目录下,执行命令:sqlldr usr/pwd control=ACCOUNT_MANAGE_sqlldr.ctl;回车,usr/pwd为你当前数据库的用户名/密码,需与plsql登录时用户名/密码相同。正常情况命令执行结束时会输出逻辑记录计数,表示插入了多少条记录,且在aul6.exe同级目录下生成日志文件account_manage_sqlldr.log,包含执行结果的详细信息。
DBF文件数据恢复_第9张图片

11.查看数据表,数据已成功恢复。有时候可能会因为新旧数据库环境不一致导致中文乱码,这个解决方法十分简单。可以自己写一段代码直接从POI.txt读取数据写入数据库。
DBF文件数据恢复_第10张图片
1.jpg

你可能感兴趣的:(DBF文件数据恢复)