OPEN

    AUL/MyDUL需要一个配置文本文件来指定数据文件的位置, 你可以用任何文本编辑器(如: Notepad, UltraEdit等)来打开和编辑它. 配置文件必须包括三列: 文件号(FILE#), 相对文件号(RFILE#)和文件名. 这三个字段之前请用空格分开, 由于以空格来区分, 因此文件名中不要有空格, 否则请重命名数据文件去掉空格. 注释行请用"#"号开头. 下面是一个配置文件的例子:

#This is demo database
#fileno rfileno filename
1 1  system01.dbf
...

    如果数据文件的文件头(文件中的第二个块)没有损坏, 这时你可以指定任意的文件号和相对文件号, 在AUL/MyDUL打开配置文件时, 会读取存放在文件头中的信息, 并将修正错误的文件号和相对文件号, 否则你必须提供一个正确的值. 当我们用AUL/MyDUL打开后应当看到如下所示的信息:

AUL> open db8i.cfg
*  fno  rfn ver bsize    blocks filename
- ---- ---- --- ----- ---------- ---------------
Y    1    1 02  8192      16384 system01.dbf

    在上面的输出中, 第一列的值应当为"Y", 表示AUL/MyDUL成功打开了数据文件, 否则需要检查块大小(BLOCK SIZE)和字节顺序(BYTE ORDER)两个选项的值. 如果确定这两个也是设对的话, 就可能是文件头坏掉了.

CHECK

    当你在打开配置文件后, 发现一些设置错误(BLOCK SIZE, BYTE ORDER, HEAD SIZE), 当你通过"SET"命令更新选项后, 可以通过这个命令让AUL/MyDUL重新读取文件头中的信息, 然后重新打印出数据文件的信息, 输出结果和"OPEN"命令差不多.

AUL : AnySQL UnLoader for Oracle 8/8i/9i/10g, release 3.0.8

(@)Copyright Lou Fangxin 2005, all rights reserved.

AUL> set byte_order big
  Current BYTE_ORDER is : BIG
AUL> open tool.txt
*  ts#  fno  rfn ver bsize    blocks filename
- ---- ---- ---- --- ----- ---------- -----------------------
N    0    1    4 00  8192  16776960 DATA01.DBF
AUL> set byte_order little
  Current BYTE_ORDER is : LITTLE
AUL> check
*  ts#  fno  rfn ver bsize    blocks filename
- ---- ---- ---- --- ----- ---------- -----------------------
Y  21  22  22 02  8192    371200 DATA01.DBF
AUL>

    这个命令没有什么其他作用, 只是为了方便, 你也可以重新运行"OPEN"命令.

SET

    为了正确地恢复你的数据, 可能需要用"SET"命令来设置一些选项的值. 这些选项主要分为三类: 和文件格式有关的, 和恢复的内容或格式有关的, 及与恢复的性能有关的.

    和文件格式有关的三个选项:

  • BLOCK_SIZE: 设置Oracle数据块的大小, 允许的值有: 2048, 4096, 8192 16384和32768, 默认值为8192. 你必要设置准确的值. 在AUL/MyDUL中恢复是基于表空间的, 因此不支持不同的块大小的表空间一起恢复. 因此如果有些对象的块存贮在不同块大小的表空间上, 将不能进行恢复. 这不是Bug, 而是设计上如此.
  • BYTE_ORDER: 这个选项决定数据库的硬件平台的字节对齐方式, 是交叉平恢复的基础. 这个选项只有两个值: BIG和LITTLE. Solaris, AIX64, HPUX, HPUX-IA, IBM zSeries Linux, Mac上是高位字节优先的; 而Windows, Linux IA, Tru64, Open VMS, Linux 64(AMD)是低位字节优先的. 如果这个值不准确, 你可以设上另一个值, 然后运行一下前面讲到的"CHECK"命令.
  • HEAD_SIZE: 在有些平台上(IBM AIX上的裸设备), 操作系统会先保留文件中的一部分空间用于保存系统信息(非Oracle的), 相当于Oracle的内容不是从0这个位置开始的, 而需要设定一个相对位置, 所有Oracle的读写时都需要跳过这一段保留的字节. 默认值是0, 在大部份平台都没有保留区间.

    和恢复格式有关的选项:

  • CHARSET: 控制DMP格式恢复时的字符集, 这里我用的是字符集的代码, 在我网上或数据库中可以查找, 默认值应当为US7ASCII(1). 这个选项仅在OUTPUT_STYLE的值设为DMP时有效. DMP文件中的民族语言字符集永远为UTF8.
  • OUTPUT_STYLE: 控制恢复出来的文件的格式, 可以是文本文件(TXT), 这也是默认值; 或者是817版本的DMP格式. DMP格式在有些情况下是很有用的, 如包括LONG/LONG RAW字段时.
  • FIELD_TAG: 当以文本方式恢复时, 需要指定多个字段间的分隔符号, 默认值为"|". 可以设置最多64个字节长的字符串. 可以使用"\"来作转义字符, 如"\b"表示回退键, "\l"表示"|", "\t"表示TAB键, "\s"表示空格, "\r"表示回车, "\n"表示换行, 也可以用"\xXX"来表示任一字符, 其中大写的"XX"为字符的16进制编码.
  • RECORD_TAG: 当以文本方式恢复时, 需要指定记录间的分隔符号, 默认值为"回车+换行". 可以设置最多64个字节长的字符串. 可以使用"\"来作转义字符, 如"\b"表示回退键, "\l"表示"|", "\t"表示TAB键, "\s"表示空格, "\r"表示回车, "\n"表示换行, 也可以用"\xXX"来表示任一字符, 其中大写的"XX"为字符的16进制编码.
  • LONG_TAG: 以文本方式恢复时, 用来对LONG/LONG RAW/BLOB/CLOB字段的值加上一个特殊的标记. 如这个值设为"#", 则这些字段的值会被放在"<#>"和"</#>"之间, 默认值为空, 不设置.

    和恢复内容有关的选项:

  • COMMITED_ROW: 如果这个选项为为TRUE(默认值为FALSE), 则AUL/MyDUL将只恢复已经提交的记录, 对于没有提交的记录, 将不从回滚段读取旧值而跳过, 设上这个选项将丢失记录.
  • DELETED_ROW: 如设这个选项设为TRUE, 则将偿试恢复已经打上删除标记的记录, 但由于Oracle处理删除记录的方法, 这个功能并不很成功, 容易恢复出乱码或引起程序非法退出, 默认值为FALSE.

    和恢复性能有关的选项:

  • CACHE_SIZE: 设置IO缓冲区的大小, 默认值为256K, 默认值已经足够. 相当于Oracle中的多块读, 在恢复大数据库时将有帮助.
  • BLOCK_CHECK: 是否检查数据块为坏块, 默认为禁用(0), 设为非0的值就为起用. 如果起用了个选项将检查每一个块的块头和块尾的字节是否同匹配, 如果不匹配将跳过这个块.

    "SET"命令是AUL/MyDUL中很重要的命令, 需要理解这些选项的准确含义.

SCAN

    这个命令主要在丢失了SYSTEM时或文件头坏而不能读取EXTENT分配情况时使用, 主要有四个命令:

  • SCAN HEADER: 读出数据文件中决有的Segment Header的信息, 可以告诉你是数据段还是索引段.
  • SCAN DATA: 从每一个EXTENT中读取两个块, 并打印出块的信息, 现在被"SCAN TABLE"的功能替代了.
  • SCAN EXTENT: 当没有SYSTEM时或不能读取EXTENT分配信息时, 可以用这个命令抄描所有的文件, 重新形成EXTENT分配信息保存在名为"AULEXT.TXT"的文件中. 在设计上如果有名为"AULEXT.TXT"的文件存在时, 恢复时将只从这个文件读取对象空间分配信息, 而不从Segment Header或Extent MAP块读取信息.
  • SCAN TABLE: 在没有SYSTEM下极有用的命令, 可以扫描所有的文件, 对每一个Segment(表, 分区, 或IOT表及分区), 读取一个有记录的块, 输出5条样本数据, 并猜测列的类型构造出一句没有SYSTEM下的数据恢复命令, 更多信息请查阅我的Weblog页面.

    对于这个命令, 你可能需要更多的Oracle的内部知识, 才能熟练应用.

UNLOAD (有System表空间时)

    在打开配置文件后, 就可以用"UNLOAD"命令来进行数据恢复了. 如果你的SYSTEM表空间还在, 则先运行以下命令来生成数据字典信息. 然后在恢复前设置各个选项. 先按顺序运行下面的命令来生成数据字典信息:

  • UNLOAD TABLE USER$;
  • UNLOAD TABLE OBJ$;
  • UNLOAD TABLE TAB$;
  • UNLOAD TABLE COL$;

    上述命令将依次生成以下文件: AULUSR.TXT, AULOBJ.TXT, AULTAB.TXT和AULCOL.TXT. 接下来就可以很方便地恢复数据了, 看下面的例子:

AUL : AnySQL UnLoader for Oracle 8/8i/9i/10g, release 3.0.8

(@)Copyright Lou Fangxin 2005, all rights reserved.

AUL> host ls AUL*.txt
AULCOL.TXT  AULOBJ.TXT  AULTAB.TXT  AULUSR.TXT
AUL> open db10g.cfg
*  ts#  fno  rfn ver bsize    blocks filename
- ---- ---- ---- --- ----- ---------- -----------------------------------
Y    0    1    1 a2  8192      39936 C:\ORACLE\ORADATA\SYSTEM01.DBF
Y    1    2    2 a2  8192      16384 C:\ORACLE\ORADATA\UNDOTBS01.DBF
Y    2    3    3 a2  8192      8192 C:\ORACLE\ORADATA\SYSAUX01.DBF
AUL> unload table sys.file$;
2005-11-10 11:46:47
Unload OBJD=17 FILE=1 BLOCK=113 CLUSTER=0 ...
1,2,32768,0,1,0,0,0,8,,4194306
2,2,16384,1,2,0,0,0,5024,,8388610
3,2,8192,2,3,0,0,0,5153,,12582914
2005-11-10 11:46:48
AUL>

    请你在恢复前阅读其他页面, AUL/MyDUL的首页服务指南, 许可证等.

DESC

    当你SYSTEM表空间还存在, 并且已经运行四条命令生成了数据字典信息后, 就可以使用"DESCRIBE"命令来看表结构了, AUL/MyDUL还会列出存贮信息. 列的顺序将不一定和定义的顺序一致, 当有表是分区时, 可以在表名后加一个分区名或子分区名.

DESC owner.tablename [partition]

    下面是一个非分区表例子, 如果指定分区时写错了分区或子分区名, 将不会显示存贮信息:

AUL> desc sys.file$

Storage(OBJ#=17 OBJD=17 TS=0 FILE=1 BLOCK=113 CLUSTER=0)
No. SEQ Column Name                  Type
--- --- ----------------------------- ----------------
  1  1 FILE#                        NUMBER NOT NULL
  2  2 STATUS$                      NUMBER NOT NULL
  3  3 BLOCKS                        NUMBER NOT NULL
  4  4 TS#                          NUMBER
  5  5 RELFILE#                      NUMBER
  6  6 MAXEXTEND                    NUMBER
  7  7 INC                          NUMBER
  8  8 CRSCNWRP                      NUMBER
  9  9 CRSCNBAS                      NUMBER
10  10 OWNERINSTANCE                VARCHAR2(30)
11  11 SPARE1                        NUMBER
12  12 SPARE2                        NUMBER
13  13 SPARE3                        VARCHAR2(1000)
14  14 SPARE4                        DATE

    输出中的第一行是存贮信息, 包括了OBJECT ID, DATA OBJECT ID, 表空间编号, Segment Header所在的文件号和编号, 及表在CLUSTER中的顺序. 分区表如果没有指定分区, 也不会显示存贮信息.

LIST

    当SYSTEM表空间存在时, 可以用LIST命令来查看某个用户下的对象, 这个命令的输出只会显示出对象名, 除了表. 对于表则输出用来恢复数据的命令, 先来看一下命令的语法吧:

LIST { TABLE | VIEW | PROCEDURE | FUNCTION |INDEX | PACKAGE } username

    下面来看一下命令的实际应用:

AUL> list view system
  MVIEW_WORKLOAD
  MVIEW_FILTER
  MVIEW_LOG
  MVIEW_FILTERINSTANCE
  ......

AUL> LIST TABLE SYSTEM
UNLOAD TABLE SYSTEM.MVIEW$_ADV_WORKLOAD TO MVIEW$_ADV_WORKLOAD.txt;
UNLOAD TABLE SYSTEM.MVIEW$_ADV_BASETABLE TO MVIEW$_ADV_BASETABLE.txt;
UNLOAD TABLE SYSTEM.MVIEW$_ADV_SQLDEPEND TO MVIEW$_ADV_SQLDEPEND.txt;
......

    对于一些新增命令, 将在Weblog中反映出来.

(©)版权所有, 2004 - 2008, www.AnySQL.net, 保留所有权利. 本Blog内容仅代表个人观点, 与其他任何组织或公司无关.
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql