| 版本 | 大對象類型 | 關鍵特性 | 狀態 |
|---|---|---|---|
| Oracle 7 | LONG, LONG RAW | 2GB 上限、順序訪問、單列、SELECT 返回實際數據、無索引、無 PL/SQL 變量、無分布式 | 已棄用 |
| Oracle 8.0 | LONG, LONG RAW, CLOB, BLOB, NCLOB, BFILE | 引入 LOB 架構:4GB+ 存儲、隨機訪問、多列、SELECT 返回 **LOB 定位器 (Locator)**、支持 DBMS_LOB、內部/外部存儲 | LONG 棄用,LOB 正式商用 |
| Oracle 8i | LOB 增強 | 臨時 LOB、LOB 緩存、並行 DML、Oracle Text 整合、Java LOB API | |
| Oracle 9i | LOB 成熟 | LOB 讀一致性、SecureFile 雛形 (BasicFile)、Data Pump 原生支持、LOB 索引分離 | |
| Oracle 11g | SecureFile LOB | 壓縮/去重/加密、智能內存緩存、更優索引結構、並行度提升 | **現代標準** |
| Oracle 12c+ | SecureFile 增強 | PDB 級 LOB、In-Memory LOB、JSON 存儲優化、Sharding LOB 分片 |
| 類型 | 全稱 | 存儲位置 | 數據類型 | 最大長度 | 讀寫權限 | 典型用途 |
|---|---|---|---|---|---|---|
| CLOB | Character Large Object | 內部 (數據庫中) | 單字節/多字節字符 (數據庫字符集) | 4GB ~ 128TB | 讀寫 | 長文本、XML、JSON、日志、文檔內容 |
| NCLOB | National Character Large Object | 內部 | Unicode 字符 (國家字符集 AL16UTF16/UTF8) | 4GB ~ 128TB | 讀寫 | 多語言文本、需國家字符集語義的場景 |
| BLOB | Binary Large Object | 內部 | 原始二進制 (圖片、音視頻、文檔、加密數據) | 4GB ~ 128TB | 讀寫 | 多媒體、二進制文檔、序列化對象 |
| BFILE | Binary File | **外部** (作業系統文件系統) | 原始二進制 (只讀) | OS 文件系統限制 (通常 8EB+) | **只讀** | 大型靜態媒體文件、歸檔數據、只讀共享數據 |
CREATE TABLE doc_store (
id NUMBER PRIMARY KEY,
content CLOB,
metadata BLOB,
ext_file BFILE
)
LOB (content) STORE AS SECUREFILE content_lob_seg (
TABLESPACE lob_ts
ENABLE STORAGE IN ROW -- 小於 ~4KB 存行內,大於存行外 (默認 ENABLE)
CHUNK 8192 -- 讀寫單元,8KB 標準,不可大於塊大小
RETENTION -- 保留舊版本供讀一致性/閃回 (AUTO/MAX/MIN/NONE)
CACHE -- 緩存 LOB 數據到 Buffer Cache (CACHE/NO CACHE/CACHE READS)
COMPRESS HIGH -- SecureFile 壓縮: LOW/MEDIUM/HIGH
DEDUPLICATE -- SecureFile 去重: 同表/跨表
ENCRYPT USING 'AES256' -- SecureFile 加密: TDE 整合
)
LOB (metadata) STORE AS BASICFILE meta_lob_seg ( -- 舊版 BasicFile
TABLESPACE lob_ts
DISABLE STORAGE IN ROW
CHUNK 8192
PCTVERSION 10 -- BasicFile 版本管理
NOCACHE
);
| 過程/函數 | 功能 | 關鍵參數 | 適用類型 |
|---|---|---|---|
| APPEND | 源 LOB 內容追加到目標 LOB 末尾 | dest_lob IN OUT NOCOPY, src_lob IN | 內部 LOB (CLOB/BLOB/NCLOB) |
| COPY | 從源 LOB 複制數據到目標 LOB (指定量/偏移) | dest_lob IN OUT NOCOPY, src_lob IN, amount IN, dest_offset IN, src_offset IN | 內部 LOB |
| ERASE | 刪除 LOB 部分/全部內容 (置空/截斷) | lob_loc IN OUT NOCOPY, amount IN OUT, offset IN | 內部 LOB |
| TRIM | 將 LOB 長度截斷到指定值 | lob_loc IN OUT NOCOPY, newlen IN | 內部 LOB |
| WRITE | 向 LOB 寫入數據 (指定偏移/量) | lob_loc IN OUT NOCOPY, amount IN, offset IN, buffer IN | 內部 LOB |
| WRITEAPPEND | 追加寫入到 LOB 末尾 | lob_loc IN OUT NOCOPY, amount IN, buffer IN | 內部 LOB |
| READ | 從 LOB 讀取數據到緩衝區 | lob_loc IN, amount IN OUT, offset IN, buffer OUT | 內部/外部 (BFILE) |
| SUBSTR | 提取 LOB 子串 (返回 VARCHAR2/RAW) | lob_loc IN, amount IN, offset IN RETURN VARCHAR2/RAW | 內部/外部 |
| INSTR | 在 LOB 中搜索模式串位置 | lob_loc IN, pattern IN, offset IN, nth IN RETURN INTEGER | 內部/外部 |
| GETLENGTH | 獲取 LOB 長度 (字符/字節) | lob_loc IN RETURN INTEGER | 內部/外部 |
| COMPARE | 比較兩個 LOB 全部/部分值是否相同 | lob_1 IN, lob_2 IN, amount IN, offset_1 IN, offset_2 IN RETURN INTEGER | 內部/外部 |
| LOADFROMFILE | 從 BFILE 載入數據到內部 LOB | dest_lob IN OUT NOCOPY, src_bfile IN, amount IN, dest_offset IN, src_offset IN | BFILE → CLOB/BLOB |
| CREATETEMPORARY | 創建臨時 LOB (會話/調用級生命週期) | lob_loc IN OUT NOCOPY, cache IN, duration IN (SESSION/CALL) | 內部 LOB |
| FREETEMPORARY | 釋放臨時 LOB | lob_loc IN OUT NOCOPY | 內部 LOB |
| CONVERTTOBLOB / CONVERTTOCLOB | 字符集轉換載入 (10g+) | ... csid IN, lang_context IN OUT, warning OUT | 跨字符集遷移 |
-- 1. OS 層創建目錄並授權 oracle 用戶讀取
# mkdir -p /u01/app/oracle/bfile_data
# chown oracle:oinstall /u01/app/oracle/bfile_data
# chmod 750 /u01/app/oracle/bfile_data
-- 2. 數據庫創建 DIRECTORY 對象
CREATE OR REPLACE DIRECTORY ext_media_dir AS '/u01/app/oracle/bfile_data';
GRANT READ ON DIRECTORY ext_media_dir TO app_user;
-- 3. 表中存儲 BFILE
CREATE TABLE media_catalog (
id NUMBER PRIMARY KEY,
title VARCHAR2(200),
media BFILE
);
-- 4. 插入 BFILE (僅存儲指針)
INSERT INTO media_catalog (id, title, media)
VALUES (1, 'Sample Video', BFILENAME('EXT_MEDIA_DIR', 'sample.mp4'));
-- 5. 讀取 BFILE (需 DBMS_LOB.OPEN/CLOSE/READ)
DECLARE
v_bfile BFILE := BFILENAME('EXT_MEDIA_DIR', 'sample.mp4');
v_blob BLOB;
BEGIN
DBMS_LOB.OPEN(v_bfile, DBMS_LOB.LOB_READONLY);
DBMS_LOB.CREATETEMPORARY(v_blob, TRUE);
DBMS_LOB.LOADFROMFILE(v_blob, v_bfile, DBMS_LOB.GETLENGTH(v_bfile));
DBMS_LOB.CLOSE(v_bfile);
-- v_blob 現在包含文件內容,可進一步處理
DBMS_LOB.FREETEMPORARY(v_blob);
END;
/
| 特性 | BasicFile (傳統) | SecureFile (11g+ 推薦) |
|---|---|---|
| 壓縮 | 不支持 | LOW/MEDIUM/HIGH (CPU 換空間,典型 2-10x) |
| 去重 | 不支持 | 表級/跨表級 (同表空間),極大節省重複數據空間 |
| 加密 | TDE 表空間級 | 列級 TDE (AES128/192/256),更細粒度 |
| 內存緩存 | Buffer Cache (LRU) | 智能緩存 (自動熱數據進內存) |
| 索引結構 | 傳統 B-tree | 優化 B-tree (減少爭用、提升並發) |
| 並行 DML | 受限 | 完全支持並行 INSERT/UPDATE/DELETE |
| 空間管理 | Free List / Bitmap | Local Extent Management + ASSM (自動段空間管理) 原生 |
| 性能基準 | 基準 | 讀寫吞吐提升 2-5x,併發擴展性大幅提升 |
| 遷移成本 | 現狀 | `ALTER TABLE ... MODIFY LOB (col) (SECUREFILE);` 在線重組 (需雙倍空間臨時) |