SecureFile功能是oracle 11g中對大對象(LOB)存儲格式的完全重新設計實現,原來的LOB存儲格式現在通稱為BASIXFILE,它仍然是默認的存儲方法,但是SECURFILE關鍵字開啟了新的存儲方法,它允許加密、利用壓縮節約空間和數據重復消除。
初始化參數
SecureFile功能在初始化參數COMPATIBLE設置我11.0.0.0.0或更高時可用。
DB_SECUREFILE初始化參數控制數據庫對LOB存儲格式的默認行為,允許的值有:
◆ALWAYS - 在ASSM表空間中的所有LOB對象以SecureFile LOB的格式創建,在非ASSM表空間中的所有LOB對象以BasicFile LOB的格式創建(除非明確地指出要以SecureFile格式創建),在沒有指定選項的情況下,BasicFile存儲格式選項被忽略,SecureFile默認存儲格式選項被使用。
◆ FORCE - 所有LOB對象都以SecureFile LOB格式創建,如果是在一個非ASSM表空間中創建LOB,會出現錯誤,在沒有指定選項的情況下,BasicFile存儲格式選項被忽略,SecureFile默認存儲格式選項被使用。
◆PERMITTED - 默認設置,當使用了SECUREFILE關鍵字時它允許SecureFile LOB存儲格式,默認存儲方法是BASICFILE。
◆NEVER - 不允許創建SecureFile LOB對象。
◆IGNORE - 防止創建SecureFile LOB,使用SecureFile存儲選項時忽略所有錯誤。
這個參數是動態的,因此它可以使用ALTER SYSTEM命令設置。
|
下面的例子假設DB_SECUREFILE初始化參數設置為默認值PERMITTED。
創建SecureFile LOB
基礎
SecureFile LOB通過在LOB存儲子句后添加SECUREFILE關鍵字來創建,下面的代碼顯示創建了兩個表,第一個使用的是原來的存儲格式,第二個使用的是SecureFile存儲格式。
|
LOB重復消除
SecureFile的DEDUPLICATE選項允許在表或分區一級上的一個LOB內消除重復數據,正如你預料的那樣,這個技術與預防重寫導致系統開銷增大,KEEP_DUPLICATE選項明確地阻止重復消除,下面的例子對比了普通的SecureFile和重復消除SecureFile的空間使用情況。
|
注意重復消除段要小很多,空間節約依賴于LOB段內的重復程度,重復模式可以使用ALTER TABLE命令進行重新設置。
ALTER TABLE deduplicate_tab MODIFY LOB(clob_data) (
KEEP_DUPLICATES
);
EXEC DBMS_STATS.gather_table_stats(USER, 'deduplicate_tab');
COLUMN segment_name FORMAT A30
SELECT segment_name, bytes
FROM user_segments
WHERE segment_name IN ('KEEPDUP_LOB', 'DEDUP_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
DEDUP_LOB 76808192
KEEPDUP_LOB 68091904
2 rows selected.
SQL>
LOB壓縮
SecureFile的COMPRESS選項在表或分區一級上開啟了對LOB內容的壓縮,使用關鍵字MEDIUM和HIGH表示壓縮的等級,如果沒有指定壓縮等級,就默認為MEDIUM,對LOB內容進行壓縮會增加系統開銷,因此使用高等級的壓縮可能會對系統性能產生不良影響,SecureFile LOB的壓縮功能不影響表壓縮,反之亦然,下面的例子對比了使用普通的SecureFile LOB和啟用壓縮功能的SecureFile LOB的空間利用情況。
|
ALTER TABLE deduplicate_tab MODIFY LOB(clob_data) (
KEEP_DUPLICATES
);
EXEC DBMS_STATS.gather_table_stats(USER, 'deduplicate_tab');
COLUMN segment_name FORMAT A30
SELECT segment_name, bytes
FROM user_segments
WHERE segment_name IN ('KEEPDUP_LOB', 'DEDUP_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
DEDUP_LOB 76808192
KEEPDUP_LOB 68091904
2 rows selected.
SQL>
LOB壓縮
SecureFile的COMPRESS選項在表或分區一級上開啟了對LOB內容的壓縮,使用關鍵字MEDIUM和HIGH表示壓縮的等級,如果沒有指定壓縮等級,就默認為MEDIUM,對LOB內容進行壓縮會增加系統開銷,因此使用高等級的壓縮可能會對系統性能產生不良影響,SecureFile LOB的壓縮功能不影響表壓縮,反之亦然,下面的例子對比了使用普通的SecureFile LOB和啟用壓縮功能的SecureFile LOB的空間利用情況。
|
COMMIT;
END;
/
EXEC DBMS_STATS.gather_table_stats(USER, 'nocompress_tab');
EXEC DBMS_STATS.gather_table_stats(USER, 'compress_tab');
COLUMN segment_name FORMAT A30
SELECT segment_name, bytes
FROM user_segments
WHERE segment_name IN ('COMPRESS_LOB', 'NOCOMPRESS_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
COMPRESS_LOB 131072
NOCOMPRESS_LOB 71565312
2 rows selected.
SQL>
我們可以看到壓縮的LOB段比沒有壓縮的LOB段明顯要小得多,空間節約的程度依賴于LOB段數據的存儲類型。
可以使用ALTER TABLE命令重新設置壓縮模式。
|
LOB加密
SecureFile LOB的加密功能依賴于錢夾或硬件安全模型(HSM)掌管加密密鑰,錢夾設置與透明數據加密(TDE)和表空間加密描述的一樣,因此在嘗試下面的例子前先完成那兩個實驗。
SecureFile的ENCRYPT選項執行塊級別的LOB內容加密,一個可選的USING子句定義了使用哪種加密算法(3DES168, AES128, AES192, 或AES256),默認使用AES192算法,NO SALT選項對于SecureFile加密不可用,加密是應用在每一列上的,因此它會影響所有使用LOB的分區,DECRPT選項用于明確地阻止加密,下面的例子顯示了使用加密的SecureFile LOB數據類型創建表。
|
ALTER TABLE命令可以用于加密或解密現有的列,要切換加密算法你必須使用REKEY選項。
|
加密是不受原來的導入導出工具或表空間傳輸支持的,因此必須使用數據泵導入導出工具來傳輸數據。
LOB緩存和日志
BasicFile和SecureFile LOB共享了部分基礎的緩存和日志選項,常見的緩存選項有:
◆CACHE - LOB數據被放在緩沖區中。
◆CACHE READES - 僅讀取LOB數據過程中它放在緩沖區中,寫操作時不放進去。
◆NOCACHE - LOB數據不放在緩沖區中,這是BasicFile和SecureFile LOB的默認值。
基本的日志選項有:
◆LOGGING - 創建和修改LOB時產生完全重做日志,這是默認設置。
◆NOLOGGING - 操作不記錄在重做日志中,因此不能恢復,在首次創建和巨大的載入過程中有用。
而且,SecureFile LOB還有一個日志選項FILESYSTEM_LIKE_LOGGING,只記錄元數據,在出現故障后仍然允許段的恢復。
CACHE選項意味著LOGGING,因此你不能將CACHE與NOLOGGING或FILESYSTEM_LIKE_LOGGING合在一起使用。
下面的代碼顯示了一個在表創建過程中和創建后明確設置了緩存和日志選項的例子。
|
DBMS_LOB包用于訪問BasicFile和SecureFile LOB,SETOPTIONS存儲過程和GETOPTIONS函數允許在每個LOB列上設置壓縮、加密和重復消除選項。
|
DBMS_SPACE包括SPACE_USAGE存儲過程,它返回有關所有LOB段中的LOB磁盤空間的消耗情況,這個存儲過程也可以用于ASSM表空間。
|
segment_type => 'LOB',
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;
/
遷移到SecureFile
目前還沒有方法可以自動將一個BasicFile列遷移到SecureFile LOB列,相反,你必須使用下面的方法手動轉換數據:
◆CREATE TABLE ... AS SELECT ...
◆INSERT INTO ... SELECT ...
◆表在線重定義
◆導出/導入
◆創建一個新列,用原始列的值更新新列,然后刪除舊列
◆創建一個新列,用原始列的值更新新列,重命名表,用原始表名創建一個僅引用新列的視圖
除導出/導入方法外,在轉換包含有大量數據的LOB時,所有選項都需要注意磁盤空間的數量。
oralce流目前不支持SecureFile,因此要避免遷移使用了流的LOB對象。