ORACLE11GR1 中的SecureFiles
SecureFiles在Oracle 11g中是用來替代large object (LOB),原來的LOB仍然存在,只是用SECUREFILE關鍵字來說明,SECUREFILE關鍵字以來表示一種新的儲存方式,它允許加密,空間壓縮和刪除重複資料。
初始化引數
SecureFile 功能可用要求COMPATIBLE 引數設為 11.0.0.0.0或者更高.
DB_SECUREFILE 初始化引數控制預設的資料庫關於LOB儲存的行為,允許的值包括:
- ALWAYS – 所有在ASSM 表空間的LOB都建立成 SecureFile LOB.在非 ASSM 表空間的LOB建立成 BasicFile LOB除非顯示說明為SecureFiles. BasicFile 儲存選項被忽略,如果未指明,SecureFile 作為預設儲存選項。
- FORCE – 所有的 LOB被建立成 SecureFile LOB. 如果 LOB 建立在非ASSM表空間, 則會丟擲一個錯誤。 BasicFile 儲存選項被忽略,如果未指明,SecureFile 作為預設儲存選項。
- PERMITTED – 預設值, 當指定SECUREFILE 關鍵字時,建立為SecureFile LOB ,預設儲存方法是BASICFILE。
- NEVER – 不允許建立成SecureFile LOBs
- IGNORE – 不允許建立成 SecureFile LOB, 如果有因為SecureFile 儲存選項的錯誤都會被忽略。
- 引數是動態的,因此可以在ALTER SYSTEM 命令中使用.
SQL> ALTER SYSTEM SET db_securefile = 'FORCE';
System altered.
SQL> ALTER SYSTEM SET db_securefile = 'PERMITTED';
System altered.
下面的例子假設DB_SECUREFILE 初始化引數值為預設的PERMITTED。
建立SecureFile LOBs
基礎
透過為LOB儲存指定SECUREFILE關鍵字來建立 SecureFile LOB。第一個表是傳統型別,第二個是SecureFile型別。
create table contracts_basic
(
contract_id number(12),
contract_name varchar2(80),
file_size number,
orig_file blob
)
tablespace users
lob (orig_file)
(
tablespace users
enable storage in row
chunk 4096
pctversion 20
nocache
nologging
);
create table contracts_sec
(
contract_id number(12),
contract_name varchar2(80),
file_size number,
orig_file blob
)
tablespace users
lob (orig_file)
store as securefile
(
tablespace users
enable storage in row
chunk 4096
pctversion 20
nocache
nologging
)
/
使用下面的過程裝載資料,假設SECFILE 目錄下有一個contract.pdf 檔案
SQL> create directory secfile as '/opt/oracle/';
Directory created.
SQL> host ls /opt/oracle/con*.pdf
/opt/oracle/contract.pdf
declare
l_size number;
l_file_ptr bfile;
l_blob blob;
begin
l_file_ptr := bfilename('SECFILE', 'contract.pdf');
dbms_lob.fileopen(l_file_ptr);
l_size := dbms_lob.getlength(l_file_ptr);
for ctr in 1 .. 100 loop
insert into contracts_sec
(
contract_id,
contract_name,
file_size,
orig_file
)
values
(
ctr,
'Contract '||ctr,
null,
empty_blob()
)
returning orig_file into l_blob;
dbms_lob.loadfromfile(l_blob, l_file_ptr, l_size);
end loop;
commit;
dbms_lob.close(l_file_ptr);
end;
/
LOB 刪除重複資料
SecureFiles 的DEDUPLICATE選項允許在LOB的表或者分割槽級刪除重複的入口。這個過程允許防止過度重複。而 KEEP_DUPLICATES 選項顯示的避免刪除重複。可以使用Alter table 語句修改該選項,例如:
SQL> alter table contracts_sec
2 modify lob(orig_file)
3 (deduplicate)
4 /
使用下面的過程可以檢視所佔用的空間:
declare
l_segment_name varchar2(30);
l_segment_size_blocks number;
l_segment_size_bytes number;
l_used_blocks number;
l_used_bytes number;
l_expired_blocks number;
l_expired_bytes number;
l_unexpired_blocks number;
l_unexpired_bytes number;
begin
select segment_name
into l_segment_name
from dba_lobs
where table_name = 'CONTRACTS_SEC';
dbms_output.put_line('Segment Name=' || l_segment_name);
dbms_space.space_usage(
segment_owner =>USER,
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
);
dbms_output.put_line('segment_size_blocks => '|| l_segment_size_blocks);
dbms_output.put_line('segment_size_bytes => '|| l_segment_size_bytes);
dbms_output.put_line('used_blocks => '|| l_used_blocks);
dbms_output.put_line('used_bytes => '|| l_used_bytes);
dbms_output.put_line('expired_blocks => '|| l_expired_blocks);
dbms_output.put_line('expired_bytes => '|| l_expired_bytes);
dbms_output.put_line('unexpired_blocks => '|| l_unexpired_blocks);
dbms_output.put_line('unexpired_bytes => '|| l_unexpired_bytes);
end;
/
對於keep_duplicates 的LOB:
Segment Name=SYS_LOB0000069919C00004$$
segment_size_blocks => 10272
segment_size_bytes => 84148224
used_blocks => 2101
used_bytes => 17211392
expired_blocks => 5888
expired_bytes => 48234496
unexpired_blocks => 2247
unexpired_bytes => 18407424
對於deduplicate的LOB:
Segment Name=SYS_LOB0000069919C00004$$
segment_size_blocks => 10272
segment_size_bytes => 84148224
used_blocks => 22
used_bytes => 180224
expired_blocks => 3712
expired_bytes => 30408704
unexpired_blocks => 6502
unexpired_bytes => 53264384
主要是比較used_bytes 值,可以看出deduplicate後,LOB所佔用空間大大減少。具體能減少多少,還是看重複率。
LOB 壓縮
SecureFiles 的 COMPRESS 選項能夠在表或者分割槽級壓縮 LOB內容 。壓縮程度使用 MEDIUM或者 HIGH 關鍵字來說明。如果未指明壓縮程度,則指MEDIUM。壓縮會帶來效能上的影響。LOB上的壓縮不影響表的影響,反之亦然。下面的例子裡說明了壓縮後的空間使用情況。
SQL> alter table contracts_sec
modify lob(orig_file)
(keep_duplicates nocompress );
Table altered.
繼續使用前面的過程顯示空間使用情況:
Segment Name=SYS_LOB0000069919C00004$$
segment_size_blocks => 11296
segment_size_bytes => 92536832
used_blocks => 2101
used_bytes => 17211392
expired_blocks => 1023
expired_bytes => 8380416
unexpired_blocks => 8135
unexpired_bytes => 66641920
SQL> alter table contracts_sec
modify lob(orig_file)
( compress HIGH);
Table altered.
Segment Name=SYS_LOB0000069922C00004$$
segment_size_blocks => 11680
segment_size_bytes => 95682560
used_blocks => 2101
used_bytes => 17211392
expired_blocks => 3840
expired_bytes => 31457280
unexpired_blocks => 5699
unexpired_bytes => 46686208
好像沒什麼效果,大概可能和我這個PDF檔案本身就是壓縮有關。
LOB 加密
SecureFile LOB的加密依賴於walle或者Hardware Security Model (HSM)來持有金鑰。wallet setup 的安裝可參考 和 ,。
SecureFiles的 ENCRYPT 選項可以完LOB內容在塊級的加密。USING 子句定義了使用哪種加密演算法(3DES168, AES128, AES192, or AES256), 預設是 'AES192'. 對於SecureFile 壓縮,NO SALT選項不可用。具體不做詳細介紹。
LOB Cache and Logging
Basicfile 和 SecureFile LOBs共享一些基本的 caching 和logging 選項. 常見的caching 選項有:
- CACHE – LOB資料放在 buffer cache.
- CACHE READS - LOB 資料只有當在讀的時候才放在buffer cache ,寫操作不放。NOCACHE
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9036/viewspace-521316/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle SecureFiles 替代之前的 LOBOracle
- Using Oracle SecureFiles LOBsOracle
- Summary Note Index for BasicFiles and SecureFilesIndex
- oracle11gr1 RMAN bakcup and restoreOracleREST
- Oracle 11g新特性之SecureFilesOracle
- Oracle 11g 新特性 -- SecureFiles 說明Oracle
- SecureFiles LOBs基礎知識之儲存篇
- 【Oracle】Windows安裝oracle11gR1 database 11.1.0.6OracleWindowsDatabase
- oracle11gR1開始使用者的密碼區分大小寫。Oracle密碼
- Oracle 20c 新特性:Online SecureFiles Defragmentation 線上的 LOB 碎片整理OracleFragment
- Python 中的類(中)Python
- 面試中聊到的javascript中的繼承面試JavaScript繼承
- php中$$str中”$$”的解釋PHP
- java中的引用與c中的指標Java指標
- JavaScript中的thisJavaScript
- JavaScript 中的 this !JavaScript
- JavaScript 中的 !!JavaScript
- swift 中的 ??Swift
- C#中刪除DataTable中的行的方法C#
- 學習中遇到的javabean中的scope問題JavaBean
- toString().intern()中的intern()中的作用和使用
- 資料流中的中位數
- (中級) CSS中的“正常”(normal)值CSSORM
- excel 中,選中的行,變色Excel
- statspack中報告中的等待事件事件
- pytorch中中的模型剪枝方法PyTorch模型
- while中的continue和if中的continue的區別While
- MySQL中複製資料表中的資料到新表中的操作教程MySql
- Ext 中 如何將grid的資料傳到tab中的html段中HTML
- 迴圈中的非同步&&迴圈中的閉包非同步
- Redis 中的原子操作(1)-Redis 中命令的原子性Redis
- 解決IDEA中maven中的module是灰色的IdeaMaven
- Swift中URL處理中的注意點Swift
- Python中的類和物件(中級)Python物件
- gcc-avr中中斷的寫法GCVR
- 深度解析VC中的訊息(中) (轉)
- toLua中Lua呼叫C#中的類C#
- Java 中的 CopyOnWriteJava