Life is DUL without it
经常有人在论坛上谈及DUL,问DUL的相关内容,要DUL。还有人不清楚DUL是什么东东,谁写的,做什么用的。一直想写一篇关于DUL稍完整些的文档,目的有两个,(1)让不知道dul的人知道这是一个什么的东西,心里好有一个生存的底线,(2)让用过dul的人有一个参考,放于身边,比英文的guide看起来更轻松、实用。
Life is DUL without it这句话是退出DUL工具时的一句提示,感觉非常有意思,找了英语精进的人也动用了在线的翻译也没准确表达出这句话的含义。我想,作者想表达的是DUL某些时侯同生命一样重要,就像一株救命的稻草,在特别的时侯会挽救生命。
DUL是一个什么样的程序
DUL是Data Unloader的缩写,是一个荷兰的Oracle工程师开发的,他的名字为Bernard Van Duijnen。DUL是一个C开发的小程序,编译后整个程序只有一个文件,大小也不过几百KB,它工作时不需Oracle RDBMS以及任何的Oracle的程序、组件,它可以直接从一个坏了数据库的数据文件中读取数据,生成IMP或SQL*Loader可以识别的文件。它观注的只是数据。存储过程、触发器、视图及建表语句这些脚本DUL是不生成的,不过如果系统表空间数据文件存在,可以通过数据字典表(sys.source$)折中的把这些脚本得到。
自Oracle 6.x这个数据库版本,For各种平台(Hp-unix,Aix,solaris,SCO Unix,Linux,windows…)的各个版本的Oracle都有Dul的相应版本。这个工具是Oracle不做技术支持的,也没有BUG的修订,它不是我们常规备份恢复操作的一个替代产品,而是在所有可能用到的手段都试过而不能解决问题时最后的一个数据挽救的方式。DUL可以用简单的一个命令卸载(unload)一个表,一个schema或整个库。DUL支持跨平台的Unload,比如可以将hp-unix平台的数据库的数据文件传到Aix平台做Unload操作。同时DUL的鲁棒性也非常的好,它不会因为数据库坏的不成样子hang住,或停在一点不动。总之,DUL是一个十分优秀的工具。
什么时侯用?
如果你的备份做的到位,可能你永远也用不到它。DUL是在一些特殊的情况下被用到的,例如在数据库没有有效的备份,系统表空间发生了损坏,而一些常规的手段(包括使用非文档参数(Undocument parameter),使用诊断事件,BBED或ORAPATCH工具修正)都无能为力无法解决问题时DUL才会被用到,它被称为last resort,即最后一种方法,也就是所有可能的方法你都试过了且不能解决问题时,才该用DUL。
哪里可以获得DUL
DUL不是一个商用化的产品,Oracle不卖、不提供也不支持它的使用。DUL只有在Oracle的内部网站才可以下载到,因此也只有Oracle的Supporter才能下载到有这个工具,如果与Oracle的Supporter熟悉,没准他私底下会给你一个,这个工具也因此有一些流落到民间,被一些人收入囊中,奉为珍宝。
不同的平台、不同版本的数据库都有相应的DUL软件,9.x及之前DUL是没有License限制的,也就是有这个工具可以无限制的使用,不过最新的DUL在这方面已经改进了,kamus说最新DUL拿到手只能用一个月。
关于这一小点稍总结一下,获得DUL有以下几种途径:
如果你是Oracle的Supporter,可以在内部网站下载,地址为:http://www.nl.oracle.com/support/dul/
如果你有Oracle的Supporter的朋友可以向他们要一个,itpub也几位斑竹都到Oracle了,如coolyl,kamus,lunar。
一些dul流落到民间,可以向有这软件的朋友要一个,不过他们不一定有你需要的那个。
使用前最好有哪些东西
数据库可能用尽各种方式启动不了,但要保证所有要挽救的数据所在的数据文件是完好的,且数据文件越新越好。数据文件的完好程度也决定了挽救回数据多少的完好程度,数据文件的坏块越来丢失的数据也越多。
最好有数据文件的列表。因为DUL工作的控制文件需要这些信息,光知道文件名是不够的,还需要数据文件所属的表空间的号(ts#),及数据文件号(rfile#),这些信息都位于v$datafile视图,因此在每次加数据文件后备份一下v$datafile视图相当必要。
应用所用到表等对象的数据字典或这些对象创建的DDL脚本。当系统表空间数据文件丢失时,DUL可以通过扫描发现表,但是无法明确哪张表叫什么名字,如果你对你的应用很了解也行,但大部分的时侯可能都不清楚扫描出来的对象对应的是哪张表,因此有对象的创建脚本是很有帮助的,存储过程、触发器、视图这些Object也可以很容易的重建回来。生成整个库的DDL脚本很容易,执行带FULL=y ROWS=n的EXP就可以了,也可以通过Dbartisan这样的工具去做。
你要对你的数据库、操作系统的有充足的了解;要有空间的准备,因为数据导出需要空间,备份原库或新库都需要空间;要有充足的耐心,特别是处理系统表空间数据文件丢失这样的情况,DBA这个工作的本身也要求这个人要胆大心细、有耐心及钻研精神。
Obj$或Dba_objects的备份,因为在无system表空间时,如果有这方面的备份会减轻很多工作。