在Oracle Database 11g中,外部表的功能得到了进一步的增强,现在通过DATAPUMP卸载数据时可以直接进行压缩或加密,而外部表通过指定解压缩的外部程序,也可以读取压缩格式的外部文件。
1. 卸载数据压缩
在Oracle 10g中,可写外部表将数据以非压缩格式卸载到本地,如果需要跨网络传输,可能需要进一步的压缩,否则会带来大量的网络流量,在Oracle Database 11g中,数据库允许在卸载数据时同时进行压缩,压缩使得卸载的转储文件对于空间需求大大缩减。
下面通过对比来比较一下压缩的效率。
在Windows上,以非压缩格式卸载数据,转储文件占用7,221,248 Bytes的空间:
D:\oracle\admin\eyglee\dpdump>dir
2010/10/07 14:50 7,221,248 DP_ALL_OBJECTS.DMP
2010/10/07 14:50 45 DP_ALL_OBJECTS_4572_3248.log
通过压缩格式转储数据,在建表语句中增加了一行
ACCESS PARAMETERS (COMPRESSION ENABLED)
执行如下卸载过程:
CREATE TABLE dp_all_objects_compress
ORGANIZATION EXTERNAL
(
TYPE oracle_datapump
DEFAULT DIRECTORY data_pump_dir
ACCESS PARAMETERS (COMPRESSION ENABLED)
LOCATION ( 'DP_ALL_OBJECTS_COMPRESS.DMP' )
)
AS
SELECT *
FROM all_objects;
比较前后两个文件大小,注意到压缩文件仅有819,200 Bytes,压缩率近9倍,非常有效地缩减了空间使用:
D:\oracle\admin\eyglee\dpdump>dir *.DMP
2010/10/07 14:50 7,221,248 DP_ALL_OBJECTS.DMP
2010/10/07 15:03 819,200 DP_ALL_OBJECTS_COMPRESS.DMP
当然压缩的过程会有一些额外的CPU消耗,数据卸载速度也会比非压缩方式稍慢。
2.卸载数据加密
在Oracle Database 11g中,新增了对于外部文件加密的功能,通过加密可以对敏感数据进行保护,是数据库安全性方面的重要增强。使用这一特性需要启用wallet,本书前面章节已经创建了wallet,现在只需打开就可以实现数据加密:
SQL> alter system set wallet open identified by "eygle";
系统已更改。
SQL> CREATE TABLE dp_all_objects_encryption
2 ORGANIZATION EXTERNAL
3 (
4 TYPE oracle_datapump
5 DEFAULT DIRECTORY data_pump_dir
6 ACCESS PARAMETERS (ENCRYPTION ENABLED)
7 LOCATION ( 'DP_ALL_OBJECTS_ENCRYPTION.DMP' )
8 )
9 AS
10 SELECT *
11 FROM all_objects;
表已创建。
现在创建的非压缩加密文件大小和非压缩方式的文件一致:
D:\oracle\admin\eyglee\dpdump>dir *.dmp
2010/10/07 14:50 7,221,248 DP_ALL_OBJECTS.DMP
2010/10/07 15:03 819,200 DP_ALL_OBJECTS_COMPRESS.DMP
2010/10/07 15:18 7,221,248 DP_ALL_OBJECTS_ENCRYPTION.DMP
如果试图用常规方式去查看内容,可以看到显示的都是加密过后的代码:
D:\oracle\admin\eyglee\dpdump>strings DP_ALL_OBJECTS_ENCRYPTION.DMP
"SYS"."U"
IBMPC/WIN_NT-8.1.0
ZHS16GBK
11.02.00.00.00
001:001:000001:000001
8{)Z5
"jnH
HNHMGxQ
HA)E
KJwg=<
cA2Ln
{CvE
Gn.h
CTvLc4{
I%)t
HCYf
.W&&Z
[5
这样就实现了卸载数据的加密。