| 特性 | BasicFiles (傳統) | SecureFiles (11g+) |
|---|---|---|
| 存儲格式 | 舊版 LOB 格式 | 全新設計,支援隨機讀寫、流式 IO |
| 去重 | 不支援 | DEDUPLICATE 表/分區級塊級去重 |
| 壓縮 | 不支援 | COMPRESS (LOW/MEDIUM/HIGH) |
| 加密 | 不支援 | ENCRYPT (AES128/192/256, TDE 整合) |
| 效能 | 基準 | 隨機讀寫提升 3-10x,順序讀寫持平 |
| 相容性 | 所有版本 | 需 COMPATIBLE ≥ 11.0.0、ASSM 表空間 |
| 值 | 行為 | 建議場景 |
|---|---|---|
| PERMITTED (默認) | 顯式指定 SECUREFILE 才用新格式,否則 BasicFiles | 漸進式遷移、混合工作負載 |
| ALWAYS | ASSM 表空間強制 SecureFiles,非 ASSM 退回 BasicFiles | 全新系統、統一標準 |
| FORCE | 所有 LOB 強制 SecureFiles,非 ASSM 報錯 | 強制合規、測試環境 |
| NEVER | 禁止 SecureFiles,忽略 SECUREFILE 關鍵字 | 舊應用相容、問題排查 |
| IGNORE | 同 NEVER 但不報錯,靜默降級 | 緊急降級 |
動態修改:ALTER SYSTEM SET db_securefile = 'ALWAYS' SCOPE=BOTH;
CREATE TABLE secure_lob_demo (
id NUMBER PRIMARY KEY,
doc_clob CLOB,
img_blob BLOB,
json_data JSON -- 19c+ 原生類型,底層 SecureFiles
)
LOB (doc_clob) STORE AS SECUREFILE secure_clob (
TABLESPACE users
ENABLE STORAGE IN ROW -- 小 LOB (<4KB) 存行內
CHUNK 8K -- 讀寫塊大小,8K/16K/32K
RETENTION -- 保留舊版本支援一致性讀
CACHE -- 緩存到 Buffer Cache
COMPRESS MEDIUM -- 壓縮等級
DEDUPLICATE -- 去重(同表/分區內)
ENCRYPT USING 'AES256' -- 加密,需 TDE 錢包開啟
)
LOB (img_blob) STORE AS SECUREFILE secure_blob (
TABLESPACE users
NOCACHE -- 大二進制不緩存
NOCOMPRESS -- 已壓縮格式 (JPG/PNG) 不再壓縮
KEEP_DUPLICATES -- 明確禁用去重
);
-- 無去重表
CREATE TABLE nodup (id NUMBER, c CLOB)
LOB(c) STORE AS SECUREFILE (KEEP_DUPLICATES);
-- 去重表
CREATE TABLE dedup (id NUMBER, c CLOB)
LOB(c) STORE AS SECUREFILE (DEDUPLICATE);
-- 插入 1000 行相同 10KB 文本
DECLARE v_clob CLOB := RPAD('X', 10000, 'X');
BEGIN
FOR i IN 1..1000 LOOP INSERT INTO nodup VALUES (i, v_clob); END LOOP;
FOR i IN 1..1000 LOOP INSERT INTO dedup VALUES (i, v_clob); END LOOP;
COMMIT;
END;
/
-- 統計段大小
SELECT segment_name, bytes/1024/1024 mb FROM user_segments
WHERE segment_name IN ('SECURE_CLOB', 'DEDUP_CLOB');
結果:
| 表 | 段大小 | 空間節省 |
|---|---|---|
| nodup (KEEP_DUPLICATES) | ~18.4 MB | 基準 |
| dedup (DEDUPLICATE) | ~0.25 MB | 98.6% |
去重對**高重複率**(日志、郵件附件、模板文檔)效果驚人;低重複率數據開銷大於收益,建議 KEEP_DUPLICATES。
| 等級 | 算法 | CPU 開銷 | 壓縮比 | 適用場景 |
|---|---|---|---|---|
| LOW | LZO | 極低 | ~2x | 高寫入吞吐、文本/JSON/日志 |
| MEDIUM (默認) | ZLIB | 中等 | ~3-4x | 通用文本、XML、源碼 |
| HIGH | ZLIB 最佳 | 高 | ~5-6x | 歸檔數據、唯讀分析表 |
壓縮/去重可組合:COMPRESS MEDIUM DEDUPLICATE 先去重再壓縮,空間節省疊加。
-- 1. 配置錢包 (僅一次)
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/etc/oracle/wallet' IDENTIFIED BY "WalletPass#123";
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "WalletPass#123";
ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY IDENTIFIED BY "WalletPass#123" WITH BACKUP;
-- 2. 建表指定加密
CREATE TABLE encrypted_lob (
id NUMBER PRIMARY KEY,
secret CLOB
)
LOB (secret) STORE AS SECUREFILE (
ENCRYPT USING 'AES256'
ENCRYPT SALT -- 默認加鹽,防彩虹表
-- NO SALT 可選,若需索引/去重則必須 NO SALT
);
注意:加密 LOB **不支援去重**(除非 NO SALT),**不支援壓縮**(加密後熵高無法壓縮)。三者互斥,按安全/空間/效能優先級三選一或二選一。
-- 方法 1:在線重定義 (DBMS_REDEFINITION,零停機)
-- 方法 2:CTAS + 重建索引/約束/權限(停機窗口)
CREATE TABLE new_t AS
SELECT * FROM old_t
LOB (clob_col) STORE AS SECUREFILE (COMPRESS MEDIUM DEDUPLICATE);
-- 重建索引、約束、權限、同義詞
DROP TABLE old_t;
RENAME new_t TO old_t;
-- 方法 3:ALTER TABLE MOVE LOB (12c+,支援 ONLINE)
ALTER TABLE old_t MOVE LOB (clob_col) STORE AS SECUREFILE (COMPRESS MEDIUM) ONLINE;
-- SecureFiles 專用統計
SELECT * FROM v$securefile_timer; -- 計時器統計
SELECT * FROM v$securefile_optimization; -- 優化器統計
-- 段級空間
SELECT segment_name, bytes, blocks
FROM user_segments
WHERE segment_type = 'LOBSEGMENT' AND segment_name LIKE 'SECURE%';
ENCRYPT(犧牲去重/壓縮)。DEDUPLICATE + COMPRESS MEDIUM(空間節省 90%+)。NOCACHE NOCOMPRESS KEEP_DUPLICATES(避免無效 CPU)。CACHE COMPRESS MEDIUM(平衡讀寫與空間)。DB_SECUREFILE=ALWAYS + ASSM 表空間,統一 SecureFiles 標準。SecureFiles 將 LOB 從「存儲負擔」轉變為「可計算、可壓縮、可去重、可加密的智能數據單元」,是 11g 以降存儲引擎最大亮點之一。