2411g新特性SecureFilesWord文档下载推荐.docx
- 文档编号:20010077
- 上传时间:2023-01-15
- 格式:DOCX
- 页数:18
- 大小:25.94KB
2411g新特性SecureFilesWord文档下载推荐.docx
《2411g新特性SecureFilesWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《2411g新特性SecureFilesWord文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
过去,在OracleDatabase11g推出之前,您可能会按照以下方式定义表:
createtablecontracts_basic
(
contract_idnumber(12),
contract_namevarchar2(80),
file_sizenumber,
orig_fileblob
tablespaceusers
lob(orig_file)
tablespaceusers
enablestorageinrow
chunk4096
pctversion20
nocache
nologging
);
\
实际的文件以二进制格式存储在ORIG_FILE列中。
各种参数指明在操作期间不应对LOB进行缓存并记入日志中,应按表行存储,块大小应为4KB并存储在表空间USERS中。
由于您没有明确指定,因此LOB在OracleDatabase11g中以常规格式(BasicFiles)存储。
如果您希望将LOB存储为SecureFile,只需在创建表时放入一个子句storeassecurefile,如下所示:
createtablecontracts_sec
storeassecurefile
/
要创建SecureFileLOB,您需要满足两个条件,而这两个条件都是默认设置,因此您可能已经满足。
▪初始化参数db_securefile应设为permitted(默认设置)。
我会在后面解释该参数的作用。
▪在其中创建securefile的表空间应启用自动段空间管理(ASSM)。
在OracleDatabase11g中,表空间创建的默认模式为ASSM,因此该表空间可能已经这样设置。
如果没有,则需要在一个新的ASSM表空间上创建SecureFile。
表创建完成后,您可以加载数据,方式与11g之前的常规LOB(BasicFile)相同。
不需要更改应用程序,也不需要记住某些特殊的语法。
下面是一个载入该表的小程序。
declare
l_sizenumber;
l_file_ptrbfile;
l_blobblob;
begin
l_file_ptr:
=bfilename('
SECFILE'
'
contract.pdf'
dbms_lob.fileopen(l_file_ptr);
l_size:
=dbms_lob.getlength(l_file_ptr);
forctrin1..100loop
insertintocontracts_sec
(
contract_id,
contract_name,
file_size,
orig_file
)
values
ctr,
'
Contract'
||ctr,
null,
empty_blob()
returningorig_fileintol_blob;
dbms_lob.loadfromfile(l_blob,l_file_ptr,l_size);
endloop;
commit;
dbms_lob.close(l_file_ptr);
end;
该程序将contract.pdf文件分100次载入表的100个行中。
您应该已经为存储contract.pdf文件的操作系统目录定义了一个名为SECFILE的目录对象。
下面的示例指明contract.pdf文件在/opt/oracle中的位置。
SQL>
createdirectorysecfileas’/opt/oracle’;
将LOB存储为SecureFile后,您就可以获得很多能优化操作的特性。
下面就是其中一些很有用的特性。
重复消除
重复消除可能是SecureFiles中最受欢迎的特性,它由于操作系统文件在某些高端文件系统中相对于数据库驻留BLOB的优势而备受推崇。
假设一个表有五条记录,每条记录有一个BLOB。
其中三个BLOB是完全相同的。
如果能够只存储该BLOB一次而在其他两个记录上只存储对该副本的引用将极大地减少空间消耗。
这在操作系统文件中是可行的,但在OracleDatabase10gLOB中则无法实现。
但是如果使用SecureFiles,只需通过一个称为重复消除的属性即可轻松搞定。
可以在表创建时指定该属性,也可以在以后将其修改为:
altertablecontracts_sec
2modifylob(orig_file)
3(deduplicate)
4/
Tablealtered.
使用重复消除后,数据库计算每行中各列的散列值并进行相互比较。
如果有匹配的散列值,则存储该散列值而不是实际的BLOB。
新记录插入时会计算其散列值,如果其散列值与其他散列值匹配,则插入散列值;
否则存储实际的值。
下面,我们来看看进行重复消除过程后的空间节省情况。
可以通过程序包DBMS_SPACE检查LOB段中的空间消耗。
下面是一个显示空间消耗的程序:
declare
l_segment_namevarchar2(30);
l_segment_size_blocksnumber;
l_segment_size_bytesnumber;
l_used_blocksnumber;
l_used_bytesnumber;
l_expired_blocksnumber;
l_expired_bytesnumber;
l_unexpired_blocksnumber;
l_unexpired_bytesnumber;
selectsegment_name
intol_segment_name
fromdba_lobs
wheretable_name='
CONTRACTS_SEC'
;
dbms_output.put_line('
SegmentName='
||l_segment_name);
dbms_space.space_usage(
segment_owner=>
ARUP'
segment_name=>
l_segment_name,
segment_type=>
LOB'
partition_name=>
NULL,
segment_size_blocks=>
l_segment_size_blocks,
segment_size_bytes=>
l_segment_size_bytes,
used_blocks=>
l_used_blocks,
used_bytes=>
l_used_bytes,
expired_blocks=>
l_expired_blocks,
expired_bytes=>
l_expired_bytes,
unexpired_blocks=>
l_unexpired_blocks,
unexpired_bytes=>
l_unexpired_bytes
);
segment_size_blocks=>
||l_segment_size_blocks);
segment_size_bytes=>
||l_segment_size_bytes);
used_blocks=>
||l_used_blocks);
used_bytes=>
||l_used_bytes);
expired_blocks=>
||l_expired_blocks);
expired_bytes=>
||l_expired_bytes);
unexpired_blocks=>
||l_unexpired_blocks);
unexpired_bytes=>
||l_unexpired_bytes);
该脚本显示LOB各种与空间有关的统计信息。
进行重复消除过程之前,输出如下:
SegmentName=SYS_LOB0000070763C00004$$
1072
8781824
601
4923392
448
3670016
0
进行重复消除之后:
1456
11927552
7
57344
127
1040384
1296
10616832
仅以上输出的一个度量标准就足以说明问题:
used_bytes。
它显示了LOB列存储的字节数。
使用重复消除之前,需要占用4,923,392字节或5MB,但使用重复消除后,该值缩减为57,344字节或大约57KB,差不多是原来值的1%。
这是因为重复消除过程发现了100个具相同值的行(回忆一下,我们将同一个值放到了所有行的LOB列中)。
重复消除过程只保留了一行而使其他行成为指针。
您也可以反向进行重复消除过程:
3(keep_duplicates)
之后,如果您再检查空间:
829
6791168
您将发现USED_BYTES增加为原来大约5MB的值。
压缩
SecureFiles的另一个特性是压缩。
可以使用以下SQL压缩LOB中存储的值:
3(compresshigh)
现在,如果您运行空间查找PL/SQL块:
201
1646592
1229
10067968
您将发现used_bytes这一度量标准由5MB降至现在的1,646,592,即大约1.5MB。
压缩与重复消除不同。
压缩在每行的LOB列内部发生—每个LOB列单独压缩。
在重复消除过程中,所有行都受到检查,列中的重复值将进行删除并替换为指针。
如果您有两个完全不同的行,重复消除不会减少占用空间;
但是压缩可以优化LOB值的空间。
除了对表执行重复消除过程,您还可以对表进行压缩。
由于压缩占用CPU周期,因此如果数据压缩量不大,可能并不值得进行压缩。
例如,如果您有大量已经压缩过的JPEG照片,那么进一步的压缩不会节省任何空间。
但是,如果您有一个作为CLOB存储的XML文档,那么压缩可以节省大量空间。
SecureFiles压缩自动检测数据是否可压缩并仅在压缩可以节省空间时占用CPU周期。
OracleText索引可以在压缩过的SecureFilesLOB上安装。
较之文件系统中的压缩文件,这是在Oracle数据库中存储非结构化数据的主要好处。
此外,请注意,LOB压缩与表压缩无关。
压缩表CONTRACTS_SEC并不会压缩LOB。
LOB压缩仅在您执行上述SQL时才会发生。
在OracleDatabase11g第2版中,除了HIGH和MEDIUM两个选项外,还提供了第三个压缩选项:
LOW。
顾名思义,该选项的压缩率比较低,但占用的CPU也要少得多,能够更快速地完成压缩。
这种方法使用类似于快速Lempel–Ziv–Oberhumer(LZO)算法的基于块的无损压缩。
我们来看一个使用SecureFilesLOW压缩的表的示例:
createtabledocs
doc_idnumber,
clearancevarchar2(20),
doc_bodyclob
LOB(doc_body)storeassecurefile
compresslow
如果您省略了LOW子句,则默认选项为MEDIUM。
LOW压缩不仅适用于表创建,还可用于更改已有的列。
我们来看一个使用相同表和列的示例。
首先,我们将该列修改为未压缩:
altertabledocs
2modifyLOB(doc_body)
3(
4nocompress
5)
6/
现在,我们将该列修改为使用LOW压缩:
4compresslow
加密
您可以对SecureFiles使用透明数据库加密,就像您将对任何列所做的一样。
下面说明如何使用AES128位加密对列orig_fileLOB进行加密。
altertablecontracts_sec
modifylob(orig_file)
(encryptusing'
AES128'
启用加密之前,您需要设置加密钱夹。
(加密钱夹的完整描述可以在此OracleMagazine文章中找到。
)下面是总结的几个步骤:
1.在sqlnet.ora中设置参数(如果尚未设置)以指定钱夹的位置:
2.ENCRYPTION_WALLET_LOCATION=
3.(SOURCE=
4.(METHOD=FILE)
5.(METHOD_DATA=
6.(DIRECTORY=/opt/oracle/orawall)
7.)
8.)
目录/opt/oracle/orawall应该已经存在;
如果不存在,则应创建该目录。
9.创建钱夹:
10.altersystemsetencryptionkeyauthenticatedby"
mypass"
这将创建口令为mypass的钱夹并将其打开。
11.上述步骤只需执行一次。
钱夹创建并打开后,只要数据库在运行它就会一直打开(除非人为关闭)。
如果数据库重启,您需要通过以下语句打开钱夹:
12.altersystemsetencryptionwalletopenidentifiedby"
当SecureFileLOB列得到加密后,该表所有行的列值都会得到加密。
加密后,您不能在表中使用常规导出或导入;
您需要使用DataPump。
您可以查看视图dba_encrypted_columns了解哪些列已得到加密以及加密的方式。
selecttable_name,column_name,encryption_alg
2fromdba_encrypted_columns
3/
TABLE_NAMECOLUMN_NAMEENCRYPTION_ALG
-----------------------------------------------------------------------------
CONTRACTS_SECORIG_FILEAES128bitskey
缓存
较之数据库驻留对象,在操作系统文件中存储非结构化数据的优势之一是缓存工具。
文件可以在操作系统的文件缓冲区中进行缓存。
数据库驻留对象还可以在数据库缓冲区缓存中进行缓存。
但是,在某些情况下,缓存可能会损害性能。
LOB通常都很大(该术语大对象就是因此得名),如果它们进入缓冲区缓存,大多数其他的数据块将需要被推送出缓存以便为要进来的LOB腾出空间。
该LOB可能以后永远都不会使用,但是它进入缓冲区缓冲却会导致某些必需的数据块被赶出去。
因此,在大多数情况下,您可能希望对LOB禁用缓存。
在针对CONTRACTS_SEC的示例脚本中,您使用了nocache子句来禁用缓存。
要为LOB启用缓存,您可以对该表进行以下更改:
modifylob(orig_file)
(cache)
这将启用LOB缓存。
注意该缓存只引用LOB。
表的其余部分放入缓冲区缓存,并遵循任何其他表的逻辑(无论该表上的LOB缓存如何设置)。
缓存的优点是非常依赖于应用程序。
在处理缩略图的应用程序中,使用缓存可能会提高性能。
但是,对于大型文档或图像,最好关闭缓存。
您可以通过securefiles进行控制。
日志记录
日志记录子句决定LOB中的数据更改如何记录到重做日志流中。
与任何其他数据一样,默认设置为完全日志记录,但是由于LOB中的数据通常都很大,在某些情况下,您可能希望不进行日志记录。
上述示例中的NOLOGING子句就可以实现该目的。
SecureFiles为该子句提供了另一个值filesystem_like_logging,如下所示:
createtablecontracts_sec_fs
filesystem_like_logging
注意以黑体显示的行,它将LOB元数据记录到重做日志中,而不是记录整个LOB。
这类似于文件系统。
文件元数据记录到文件系统日志中。
同样,SecureFiles上的该子句会加速崩溃后的恢复。
管理
数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2411 特性 SecureFiles