下面是用AUL 4.0.0 Beta版本恢复Windows上10g R2数据库BLOB数据的一个演示, 首先是创建测试表:

SQL> CREATE TABLE T_BLOBDEMO
  2  (
  3    ID NUMBER,
  4    BLOB1 BLOB,
  5    BLOB2 BLOB,
  6    BLOB3 BLOB
  7  )
  8  LOB(BLOB3) STORE AS (DISABLE STORAGE IN ROW)
  9  /

Table created.

SQL> INSERT INTO T_BLOBDEMO VALUES (1, '3031323334', NULL, NULL);

1 row created.

    提交后, 到SYS用户执行ALTER SYSTEM CHECKPOINT命令, 将数据写入数据文件中, 然后就可以用AUL 4来恢复了. 在上面的例子中, 我们将BLOB1字段更新为"01234"这几个字母, 来看一下恢复出来的对不对?

AUL> UNLOAD TABLE anysql.t_blobdemo;
2006-12-17 21:43:27
Unload OBJD=9966 FILE=4 BLOCK=4859 CLUSTER=0 ...
1|01234
2006-12-17 21:43:27

    接下来用AnySQL来将一个图片文件(test.jpg)更新到BLOB2和BLOB3字段中:

ASQL> set queryonly false
ASQL> var p_lob blob
ASQL> define p_lob=test.jpg

ASQL> update t_blobdemo set blob2=:p_lob, blob3=:p_lob;

1 rows affected.

ASQL> commit;

Commit Succeed.

    接下来再次CHECKPOINT一下, 然后用AUL 4来恢复, 指定LOB_STORAGE选项为1来将LOB存放为各自的文件:

AUL> set lob_storage 1
  Current LOB_STORAGE is : 1-FILE
AUL> UNLOAD TABLE anysql.t_blobdemo to t_blobdemo.txt;
2006-12-17 21:46:42
Unload OBJD=9966 FILE=4 BLOCK=4859 CLUSTER=0 ...
2006-12-17 21:46:42

    来看一下T_BLOBDEMO.TXT文件中的内容:

C:\MYDUL>cat t_blobdemo.txt
1|LOB_010012FF_1F39.dat|LOB_010012FF_1F63.dat|LOB_010012FF_1FB8.dat

    再到OS中来看一下生成的文件, 第一个文件应当只包括"01234"这几个数字, 其他两个文件我将他们重命名为JPG文件, 并用图片查看工具查看, 打开完全没有问题.

C:\MYDUL>cat LOB_010012FF_1F39.dat
01234

C:\MYDUL>dir LOB*.jpg
Volume in drive C has no label.
Volume Serial Number is 5CF4-08FE

Directory of C:\MYDUL

2006-12-17  21:46           252,443 LOB_010012FF_1F63.jpg
2006-12-17  21:46           252,443 LOB_010012FF_1FB8.jpg
               2 File(s)        504,886 bytes
               0 Dir(s)   9,521,508,352 bytes free

    将生成的SQL*Loader控制文件DIRECT=TRUE去掉, 并将ROWS=50000调小一些(如100), 进行装载:

C:\MYDUL>sqlldr anysql/anysql control=t_blobdemo_sqlldr.ctl

SQL*Loader: Release 10.2.0.1.0 - Production on Sun Dec 17 21:49:54 2006

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Commit point reached - logical record count 1

    现在到数据库中去看一下BLOB2和BLOB3这两个列的长度:

ASQL> select dbms_lob.getlength(blob2) len2,
    2  dbms_lob.getlength(blob3) len3 from t_blobdemo;

  LEN2   LEN3
------ ------
252443 252443
252443 252443

2 rows returned.

    现在已经将恢复出来的数据成功装载到数据库中了, 我将会在不同的平台, 不同的数据库版本上进行这个测试. 如果你有兴趣, 也可以试试.