在Oracle8i 中,LOB 設計是基於下列假設做出的:
(1) LOB 實例化的大小預計為幾個兆字節。
(2) LOB 通常被視為“單寫多讀”類型的數據。很少進行更新,所以可以為所有類型的更新(大型或小型)對整個塊進行版本化。
(3) 預計很少有批處理會流式處理數據。預計不會出現聯機事務處理(OLTP) 類型的工作量。
(4) 保留的還原量由用戶使用PCTVERSION 和RETENTION 參數進行控制。這是額外的管理工作。
(5) 在假設LOB 大小通常是統一的前提下,CHUNK 大小是一個靜態參數。CHUNK 大小的上限是32 KB。
(6) 預計Oracle RAC 中不會出現高並發性的寫入。
自首次實施後,業務要求已發生了顯著變化。現在LOB 的使用方式與關系數據的相似,用於存儲各種大小的半結構化和非結構化數據。數據大小可以從幾千字節(用於HTML 鏈接)到幾兆兆字節(用於流視頻)不等。
在LOB 中存儲所有文件系統數據的Oracle 文件系統會遇到類似OLTP 的高並發性訪問。隨著Oracle RAC 日益廣泛的應用,必須解決OracleRAC 的可擴展性問題。LOB 空間結構的現有設計不能滿足這些新要求。
Oracle LOB 詳解
http://blog.csdn.net/tianlesoftware/article/details/6905406
Oracle Database 11g 將LOB 數據類型作為Oracle SecureFiles 進行了完全重新設計,顯著改進了應用程序開發的性能、可管理性和易用性。新實施也提供了下一代高級功能,如智能壓縮和透明加密。
使用SecureFiles 時,塊大小介於Oracle 數據塊大小到64MB 之間。Oracle DB 嘗試使數據集中在磁盤的相鄰物理位置,從而將內部碎片降到最低。通過使用可變的塊大小,SecureFiles 避免對不必要的大型LOB 數據塊進行版本化。
SecureFiles 還提供了新的客戶機/服務器網絡層,從而允許在支持更高讀寫性能的服務器和客戶機之間進行高速數據傳輸。SecureFiles自動確定生成重做和還原的最有效方法,因而不需要用戶定義參數。SecureFiles 自動確定是僅為更改生成重做和還原,還是通過生成完整的重做記錄創建新版本。
由於SecureFiles 需要維護各種內存中統計信息以幫助有效地分配內存和空間,所以將其設計為可自適應的智能工具。這樣,由於減少了很難使用不可預測的負荷進行優化的可優化參數數量,可管理性有所提高。
Oracle SecureFiles 重新設計了非結構化(文件)數據的處理方法,提供了以下全新的設計:
(1) 磁盤格式
a) 可變塊大小
(2) 網絡協議
a) 改進的輸入/輸出
(3) 版本化和共享機制
(4) 重做和還原算法
a) 無用戶配置
(5) 空間和內存增強功能
使用DB_SECUREFILE 初始化參數,數據庫管理員(DBA) 可確定SecureFiles 的使用情況,其中有效值為:
(1) ALWAYS:嘗試將ASSM表空間上的所有LOB 創建為SecureFile LOB,但是僅可將自動段空間管理(ASSM) 表空間外的任何LOB 創建為BasicFile LOB
(2) FORCE:強制將所有LOB 創建為SecureFileLOB
(3) PERMITTED:允許創建SecureFiles(默認值)
(4) NEVER:禁止創建SecureFiles
(5) IGNORE:禁止創建SecureFiles,並忽略使用SecureFiles 選項強制創建BasicFiles 而導致的任何錯誤
如果指定了NEVER,則任何指定為SecureFiles 的LOB 均被創建為BasicFiles。如果對BasicFiles 使用任何SecureFiles 特定的存儲選項和功能(如壓縮、加密和取消重復),則會導致異常錯誤。將對任何未指定的存儲選項使用BasicFiles 默認值。
如果指定了ALWAYS,則系統中創建的所有LOB 均會被創建為SecureFiles。必須在ASSM 表空間中創建LOB,否則會發生錯誤。將忽略所有指定的BasicFiles 存儲選項。可以使用ALTER SYSTEM 命令更改所有存儲的SecureFiles 默認值。
SQL>Altersystem set db_securefile=’ALWAYS’;
OracleSecureFiles 實施也提供了下一代高級功能,如智能壓縮和透明加密。壓縮功能支持顯式壓縮SecureFiles。SecureFiles 僅為隨機讀取或寫入訪問透明解壓縮所需的數據塊集,從而自動維護未壓縮和已壓縮的偏移量之間的映射。如果將壓縮級別從MEDIUM 更改為HIGH,則映射會自動進行更新以反映新的壓縮算法。取消重復可自動檢測重復的SecureFile LOB 數據,並通過僅存儲一個副本來節省空間- 減少磁盤存儲空間、I/O 和重做事件記錄。可在表級別或分區級別指定取消重復,但不能跨越分區的LOB。取消重復需要使用高級壓縮選項。
現在可以在適當位置存儲加密的LOB數據,並對其進行隨機讀取和寫入,因而提高了數據的安全性。只能按列加密SecureFile LOB (與透明數據加密相同)。將使用相同的加密算法對LOB 列中的所有分區進行加密。無法對BasicFiles 數據進行加密。SecureFiles 支持行業標准加密算法:3DES168、AES128、AES192(默認)和AES256。加密是高級安全選項的一部分。
注:必須將COMPATIBLE 初始化參數設置為11.0.0.0.0 或更高,才能使用SecureFiles。在11.1.0.0.0 兼容性下BasicFiles(以前的LOB)格式仍然受支持。設置11.0.0.0.0 後不會出現功能降低。
Oracle SecureFiles 提供了下列高級功能:
(1) 智能LOB 壓縮
(2) 取消重復
(3) 透明加密
MAXSIZE 是新的存儲子句,用於控制SecureFiles 的物理存儲屬性。MAXSIZE 指定與存儲子句級別相關的最大段大小。
RETENTION 指定SecureFiles 的以下項:
(1) MAX 在達到段MAXSIZE 後重新使用舊版本。
(2) MIN 在指定的最短時間內保留舊版本。
(3) AUTO 是默認設置,主要對空間和時間進行折中使之達到平衡。這是自動確定的。
(4) NONE 盡可能重用舊版本。
使用ALTER TABLE 語句更改RETENTION 僅影響該語句執行後創建的空間。
對於SecureFiles,不再需要指定CHUNK、PCTVERSION、FREEPOOLS、FREELISTS 和FREELIST GROUPS。為了與現有腳本相兼容,將對這些子句進行分析但不解釋它們。
可使用CREATE TABLE 語句中的存儲關鍵字SECUREFILE 創建帶有LOB 列的SecureFiles。早期數據庫版本中的LOB 實施現在被稱為BasicFiles。將LOB 列添加到表時,可以指定是將其創建為SecureFiles 還是BasicFiles。如果沒有指定存儲類型,LOB 將創建為BasicFiles以確保向後兼容性。
CREATE TABLE func_spec(
id number, doc CLOBENCRYPT USING 'AES128' )
LOB(doc) STORE ASSECUREFILE
(DEDUPLICATE LOB CACHE NOLOGGING);
上面的SQL,創建了一個名為FUNC_SPEC的表,用於將文檔存儲為SecureFiles。在該示例中指定不希望存儲LOB 的重復內容、讀取時將高速緩存LOB,並且對LOB 執行更新時不生成還原。此外,還指定將使用AES128 加密算法對存儲在doc 列中的文檔進行加密。與DEDUPLICATE 相反,KEEP_DUPLICATES 可用在ALTER語句中。
CREATE TABLE test_spec (
id number, doc CLOB)
LOB(doc) STORE AS SECUREFILE
(COMPRESS HIGH KEEP_DUPLICATES CACHENOLOGGING);
上面的SQL,創建一個名為TEST_SPEC的表,用於將文檔存儲為SecureFiles。對於此表,可以存儲重復內容、LOB 將以壓縮格式存儲,並且將高速緩存LOB 而不進行記錄。HIGH 壓縮設置需要進行更多的工作,但可提供更有效的數據壓縮。默認壓縮是MEDIUM。壓縮算法在服務器端實施,允許對LOB 數據進行隨機讀取和寫入,可以通過ALTER 語句對其進行更改。
CREATE TABLE design_spec (id number, docCLOB)
LOB(doc) STORE AS SECUREFILE (ENCRYPT);
CREATE TABLE design_spec (id number,
doc CLOB ENCRYPT)
LOB(doc) STORE AS SECUREFILE;
上面2段代碼都結果相同:使用默認的AES192加密創建具有SecureFilesLOB 列的表。
為了支持共享內存(與程序全局區(PGA)相對)的大型I/O,OracleDatabase 11g 中新增了共享I/O 池內存組件,用於進行直接路徑訪問。這種情況僅適用於將SecureFiles 創建為NOCACHE 時(默認)。共享I/O 池默認大小為零,僅當存在SecureFiles NOCACHE 工作量時,系統才會將其大小增加到高速緩存的4%。由於這是共享資源,因此可由大型並發SecureFiles 工作量使用。與其它池(如大型池或共享池)不同,用戶進程不會生成ORA-04031錯誤,但在釋放更多共享I/O 池緩沖區之前會臨時退回到PGA。
LOB 高速緩存是SecureFiles 體系結構中的新組件,通過收集和批處理數據以及重疊網絡和磁盤I/O改進了LOB 訪問性能。LOB高速緩存從緩沖區高速緩存(常規緩沖區或共享I/O 池的內存)借用內存。由於從緩沖區高速緩存借用的內存實質上適合於執行數據庫I/O,並且適合在I/O 完成後回退到該緩沖區高速緩存,因此可以避免不必要的內存復制。
在多實例Oracle RealApplication Clusters 中,LOB 高速緩存為每個已訪問的LOB 保留一個鎖定。
使用DEDUPLICATE 選項,可以指定在LOB 列的兩行或多行中相同的LOB 數據共享同一數據塊。KEEP_DUPLICATES 與此相反。Oracle使用安全的散列索引檢測重復,並且將具有相同內容的LOB 合並到一個副本中,從而降低存儲空間並簡化存儲管理。LOB 關鍵字是可選的,它可以使語法變得更清楚。
COMPRESS 或NOCOMPRESS 關鍵字分別啟用或禁用LOB 壓縮。新的壓縮設置會更改LOB 段中的所有LOB。
ENCRYPT 或DECRYPT關鍵字可使用透明數據加密(TDE) 打開或關閉LOB 加密。新設置會更改LOB 段中的所有LOB。可將LOB 段更改為僅啟用或僅禁用LOB 加密。也就是說,ALTER 不能用於更新加密算法或加密密鑰。可使用ALTER TABLE REKEY 語法更新加密算法或加密密鑰。結合使用其它選項,在塊級別執行加密可以提高性能(可能為最小的加密量)。
相關示例:
ALTER TABLE t1
MODIFY LOB(a) ( KEEP_DUPLICATES );
ALTER TABLE t1
MODIFY LOB(a) ( DEDUPLICATE LOB );
ALTER TABLE t1
MODIFY PARTITION p1 LOB(a) ( DEDUPLICATELOB );
ALTER TABLE t1
MODIFY LOB(a) ( NOCOMPRESS );
ALTER TABLE t1
MODIFY LOB(a) (COMPRESS HIGH);
ALTER TABLE t1
MODIFY PARTITION p1 LOB(a) ( COMPRESS HIGH);
ALTER TABLE t1 MODIFY
( a CLOB ENCRYPT USING '3DES168');
ALTER TABLE t1 MODIFY PARTITION p1
( LOB(a) ( ENCRYPT );
ALTER TABLE t1 MODIFY
( a CLOB ENCRYPT IDENTIFIED BY ghYtp);
DBMS_LOB 程序包:LOB 繼承取消重復、加密和壓縮的LOB 列設置,也可使用LOB 定位器API 在每個LOB 級別上進行配置。但是不能使用LONG API 配置這些LOB 設置。
必須為這些功能使用以下DBMS_LOB 程序包附加函數:
(1) DBMS_LOB.GETOPTIONS:可使用此函數獲得設置。返回與基於選項類型的預定義常量相對應的整數。
(2) DBMS_LOB.SETOPTIONS:此過程設置功能並允許按LOB 設置這些功能,從而覆蓋默認的LOB 設置。這需要往返服務器以使更改變成永久更改。
DBMS_SPACE.SPACE_USAGE:使現有SPACE_USAGE 過程超載,以返回有關LOB 空間使用情況的信息。它返回LOB 段中所有LOB 使用的塊中的磁盤空間量。該過程僅可對使用ASSM 創建的表空間使用,並且不將屬於BasicFiles 的LOB 塊視為已使用的空間。
使用LOB 接口超集,可輕松從BasicFile LOB 進行遷移。遷移到SecureFiles 有兩種建議方法:分區交換和聯機重新定義。
分區交換:
(1) 需要與表中最大分區相等的額外空間
(2) 可在交換期間維護索引
(3) 可將工作量分散到多個較小的維護窗口
(4) 要求表或分區脫機以執行交換
聯機重新定義(建議做法)
(1) 不要求表或分區脫機
(2) 可並行進行
(3) 要求額外存儲空間等於整個表,並且所有LOB 段均可用
(4) 要求重建所有全局索引
這些解決方案通常意味著使用輸入LOB列中的數據所用磁盤空間兩倍的空間。但是,使用分區和按分區執行這些操作有助於降低所需的磁盤空間。
為了顯示SecureFiles 的使用情況,已對下列視圖進行了修改:
(1) *_SEGMENTS
(2) *_LOBS
(3) *_LOB_PARTITIONS
(4) *_PART_LOBS
SQL> SELECT segment_name, segment_type,segment_subtype
2 FROM dba_segments
3 WHERE tablespace_name = 'SECF_TBS2'
4 AND segment_type = 'LOBSEGMENT'
5 /
SEGMENT_NAME SEGMENT_TYPE SEGMENT_SU
---------------------------------------------- ----------
SYS_LOB0000071583C00004$$ LOBSEGMENTSECUREFILE
在1.3 小節提到這個參數,用來控制SecureFiles的使用。具體可設的參數參考1.3節。
啟用SecureFile功能,數據的compatible 參數必須大於11.0.0.0. db_SecureFile 參數是個動態參數,我們可以直接修改,而不用重啟實例。
[oracle@dave admin]$ ora paramdb_securefile
Session altered.
NAME ISDEFAULT SESMO SYSMOD VALUE
---------------- --------- ----- -------------------------------------------------
db_securefile TRUE TRUE IMMEDIATEPERMITTED
[oracle@dave admin]$ ora param compatible
Session altered.
NAME ISDEFAULT SESMO SYSMOD VALUE
--------------- --------- ----- -------------------------------------------------
compatible FALSE FALSE FALSE 11.2.0.0.0
SQL> alter system setdb_securefile='FORCE';
System altered.
SQL> !ora param db_securefile
Session altered.
NAME ISDEFAULT SESMO SYSMOD VALUE
------------------ --------- -------------- -------------
db_securefile TRUE TRUE IMMEDIATE FORCE
SQL> alter system setdb_securefile='PERMITTED';
System altered.
SQL> !ora param db_securefile
Session altered.
NAME ISDEFAULT SESMO SYSMOD VALUE
------------------ --------- -------------- --------------
db_securefile TRUE TRUE IMMEDIATE PERMITTED
完整語法參考:
http://docs.oracle.com/cd/B28359_01/appdev.111/b28393/adlob_smart.htm
SQL> CREATE TABLE bf_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE AS BASICFILE;
Table created.
SQL> INSERT INTO bf_tab VALUES (1, 'MyCLOB data');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> CREATE TABLE sf_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE;
CREATE TABLE sf_tab (
*
ERROR at line 1:
ORA-43853: SECUREFILElobs cannot be used in non-ASSM tablespace "SYSTEM"
--這裡報錯,創建securefile,必須是ASSM表空間。
SQL> selectTABLESPACE_NAME,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;
TABLESPACE_NAME SEGMEN
-------------------- ------
SYSTEM MANUAL
SYSAUX AUTO
UNDOTBS1 MANUAL
TEMP MANUAL
USERS AUTO
EXAMPLE AUTO
DAVE AUTO
7 rows selected.
SQL> CREATE TABLE sf_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE tablespace dave;
Table created.
SQL> INSERT INTO sf_tab VALUES (1, 'MyCLOB data');
1 row created.
SQL> commit;
Commit complete.
LOB 重復值相關的2個選項:
(1)DEDUPLICATE:不允許出現重復值。
(2)KEEP_DUPLICATES: 允許出現重復值。
SQL> create user dave identified by"dave" default tablespace dave temporary tablespace temp;
User created.
SQL> grant connect,resource to dave;
Grant succeeded.
SQL> conn dave/dave;
Connected.
SQL> CREATE TABLE keep_duplicates_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE keepdup_lob(
6 KEEP_DUPLICATES
7 );
Table created.
SQL> CREATE TABLE deduplicate_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE dedup_lob (
6 DEDUPLICATE
7 );
Table created.
SQL> DECLARE
2 l_clob CLOB := RPAD('X',10000, 'X');
3 BEGIN
4 FOR i IN 1 .. 1000 LOOP
5 INSERT INTOkeep_duplicates_tab VALUES (i, l_clob);
6 END LOOP;
7 COMMIT;
8
9 FOR i IN 1 .. 1000 LOOP
10 INSERT INTO deduplicate_tab VALUES (i, l_clob);
11 END LOOP;
12 COMMIT;
13 END;
14 /
PL/SQL procedure successfully completed.
SQL> EXECDBMS_STATS.gather_table_stats(USER, 'keep_duplicates_tab');
PL/SQL procedure successfully completed.
SQL> EXECDBMS_STATS.gather_table_stats(USER, 'deduplicate_tab');
PL/SQL procedure successfully completed.
SQL> COLUMN segment_name FORMAT A30
SQL> SELECT segment_name, bytes
2 FROM user_segments
3 WHERE segment_name IN ('KEEPDUP_LOB', 'DEDUP_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
DEDUP_LOB 1179648
KEEPDUP_LOB 28442624
2 rows selected.
SQL>
允許重復值的情況下,占用的空間要大很多。我們可以使用alter table 命令來將deplicates改成keep_duplicates:
SQL> ALTER TABLE deduplicate_tab MODIFYLOB(clob_data) (
2 KEEP_DUPLICATES
3 );
Table altered.
SQL> EXECDBMS_STATS.gather_table_stats(USER, 'deduplicate_tab');
PL/SQL procedure successfully completed.
SQL> COLUMN segment_name FORMAT A30
SQL> SELECT segment_name, bytes
2 FROM user_segments
3 WHERE segment_name IN ('KEEPDUP_LOB', 'DEDUP_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
DEDUP_LOB 25296896
KEEPDUP_LOB 28442624
SQL>
SecureFIles的COMPRESS 選項允許在表或者分區級別進行壓縮。 壓縮的級別也分medium 和 high。
默認使用medium。 壓縮會消耗一些資源,所以如果使用high 的壓縮,那麼可能會影響系統的性能。 SecureFiles的壓縮對表的壓縮是沒有影響的。
SQL> CREATE TABLE nocompress_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE AS SECUREFILEnocompress_lob(
6 NOCOMPRESS
7 );
Table created.
SQL> CREATE TABLE compress_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE compress_lob (
6 COMPRESS HIGH
7 );
Table created.
SQL> DECLARE
2 l_clob CLOB := RPAD('X',10000, 'X');
3 BEGIN
4 FOR i IN 1 .. 1000 LOOP
5 INSERT INTO nocompress_tabVALUES (i, l_clob);
6 END LOOP;
7 COMMIT;
8
9 FOR i IN 1 .. 1000 LOOP
10 INSERT INTO compress_tab VALUES (i, l_clob);
11 END LOOP;
12 COMMIT;
13 END;
14 /
PL/SQL procedure successfully completed.
SQL> EXECDBMS_STATS.gather_table_stats(USER, 'nocompress_tab');
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_STATS.gather_table_stats(USER,'compress_tab');
PL/SQL procedure successfully completed.
SQL> COLUMN segment_name FORMAT A30
SQL> SELECT segment_name, bytes
2 FROM user_segments
3 WHERE segment_name IN ('COMPRESS_LOB','NOCOMPRESS_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
COMPRESS_LOB 131072
NOCOMPRESS_LOB 28442624
SQL>
--使用壓縮後,使用空間小很多。
將表compress_tab從壓縮改成非壓縮:
SQL> ALTER TABLE compress_tab MODIFY LOB(clob_data)(
2 NOCOMPRESS
3 );
Table altered.
SQL> EXECDBMS_STATS.gather_table_stats(USER, 'compress_tab');
PL/SQL procedure successfully completed.
SQL> COLUMN segment_name FORMAT A30
SQL> SELECT segment_name, bytes
2 FROM user_segments
3 WHERE segment_name IN ('COMPRESS_LOB','NOCOMPRESS_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
COMPRESS_LOB 26345472
NOCOMPRESS_LOB 28442624
--壓縮的空間又釋放出來了。
SecureFileLobs 的加密依賴wallet 或者HardwareSecurity Model (HSM)來保存encryption key。所以在創建加密的SecureFile之前,必須先創建並打開一個wallet。
在sqlnet.ora 文件裡添加: ENCRYPTION_WALLET_LOCATION 和WALLET_LOCATION參數。
默認位置是:$ORACLE_BASE/admin/$ORACLE_SID/wallet。
--指定ORACLE WALLET的位置,這裡使用ORACLE_HOME/network/admin,在sqlnet.ora裡添加如下內容:
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/product/11.2.0/db_1/network/admin)
)
)
ENCRYPTION_WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/admin/dave/encryption_wallet)
)
)
SQLNET.WALLET_OVERRIDE = TRUE
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 0
--添加完之後,重啟listener,使參數生效。
--創建wallet:包括設置密碼、生成信任文件、並啟動wallet
CONN / AS SYSDBA
-- 10g version
ALTER SYSTEM SET ENCRYPTION KEYAUTHENTICATED BY "myPassword";
-- 11g version
ALTER SYSTEM SET ENCRYPTIONKEY IDENTIFIED BY "myPassword";
當實例重啟後或者wallet被關閉後,必須重新open wallets,這樣才能保護被加密的列:
-- 10g version
ALTER SYSTEM SET ENCRYPTION WALLET OPENAUTHENTICATED BY "myPassword";
-- 11g version
ALTER SYSTEM SET ENCRYPTION WALLET OPENIDENTIFIED BY "myPassword";
ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;
SecureFile的ENCRYPT 在block-level上對LOBS的內容進行加密。可以使用USING 選項來指定使用哪種加密算法:3DES168, AES128, AES192,AES256,默認使用AES192進行加密。
當對SecureFile 進行加密後,NO SALT 選項不可用。加密是基於列來進行,如果是分區表,那麼會影響所有的分區。
DECRYPT選項用來進行解密操作。 具體示例如下:
SQL> conn dave/dave;
Connected.
SQL> CREATE TABLE encrypt_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE encrypt_lob(
6 ENCRYPT USING 'AES256'
7 );
Table created.
--可以使用使用alert 來對已經存在的列進行加密或者解密操作,如果要更換加密算法的類型,必須使用REKEY 選項:
SQL> ALTER TABLE encrypt_tab MODIFY (
2 clob_data CLOB DECRYPT
3 );
Table altered.
SQL> ALTER TABLE encrypt_tab MODIFY (
2 clob_data CLOB ENCRYPT USING '3DES168'
3 );
Table altered.
SQL> ALTER TABLE encrypt_tab REKEY USING'AES192';
Table altered.
注意:
Exp/imp 工具不支持Encryption,所以要對加密的列進行傳輸,必須使用數據泵:expdp/impdp.
BasicFile和SecureFile LOBs 都可以進行caching 和logging的設置,相關說明如下:
caching 值:
(1) CACHE - LOB data is placed in the buffer cache.
(2) CACHE READS - LOB data is only placed in the buffer cacheduring read operations, not write operations.
(3) NOCACHE - LOB data is notplaced in the buffer cache. This is the default optionfor BasicFile and SecureFile LOBs.
Basic的 logging 值:
(1) LOGGING - LOB creation andchanges generate full redo. This is the defaultsetting.
(2) NOLOGGING - The operations are not logged in the redo logs andare therefore not recoverable. This is useful during initial creation andduring large loads that can be replayed in the event of failure.
對與SecureFileLOBs多一個FILESYSTEM_LIKE_LOGGING選項,如果指定該選項,那麼只對metadata 進行logging。
注意:
Cache 選項就意味著進行logging,所以如果指定了Cache,就不能指定logging 或者FILESYSTEM_LIKE_LOGGING.
相關示例:
CREATE TABLE caching_and_logging_tab (
id NUMBER,
clob_data CLOB
)
LOB(clob_data) STORE AS SECUREFILE(
NOCACHE
FILESYSTEM_LIKE_LOGGING
);
ALTER TABLE caching_and_logging_tab MODIFYLOB(clob_data) (
CACHE
);
DBMS_LOB 包可以查看BasicFile和SecureFile LOBs。 SETOPTIONS 過程和GETOPTIONS 函數查看compression, encryption anddeduplication 選項的修改。
CREATE TABLE securefile_tab (
id NUMBER,
clob_data CLOB
)
LOB(clob_data) STORE AS SECUREFILEsecurefile_lob(
encrypt
compress
);
INSERT INTO securefile_tab VALUES (1, 'Dave');
INSERT INTO securefile_tab VALUES (2, 'Oracle');
COMMIT;
SET SERVEROUTPUT ON
DECLARE
l_clob CLOB;
BEGIN
SELECT clob_data
INTO l_clob
FROM securefile_tab
WHERE id = 1
FORUPDATE;
DBMS_OUTPUT.put_line('Compression : ' || DBMS_LOB.getoptions(l_clob, DBMS_LOB.opt_compress));
DBMS_OUTPUT.put_line('Encryption : ' || DBMS_LOB.getoptions(l_clob, DBMS_LOB.opt_encrypt));
DBMS_OUTPUT.put_line('Deduplication: ' || DBMS_LOB.getoptions(l_clob,DBMS_LOB.opt_deduplicate));
ROLLBACK;
END;
/
這裡返回:
Encryption : 2
Deduplication: 0
DBMS_SPACE包的SPACE_USAGE過程可以查看LOBs 占用磁盤空間信息。 該過程只適用與ASSM 表空間。
SET SERVEROUTPUT ON
DECLARE
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
DBMS_SPACE.SPACE_USAGE(
segment_owner => 'TEST',
segment_name =>'SECUREFILE_LOB',
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;
/
這個和我們的show_space 腳本是一樣的。
OracleShow_space 過程 使用示例 與 注釋
http://blog.csdn.net/tianlesoftware/article/details/8151129
將列從BasicFile LOB遷移到SecureFilesLOB,可以使用如下方法:
(1) CREATE TABLE ... AS SELECT ...
(2) INSERT INTO ... SELECT ...
(3) Online tableredefintion.
(4) Export/Import
(5) Create a new column, update the new column with the values in theoriginal column, then drop the old column.
(6) Create a new column, update the new column with the values in theoriginal column, rename the table and create a view with the original name thatonly references the new column.
除了export/import 的方法,其他的方法都需要考慮轉換LOB需要的磁盤空間問題。
Oracle 的Streams 不支持SecureFIles,所以不能使用Streams來遷移LOBs。
在1.10 小節裡,也說明,在不考慮空間的情況下,推薦使用表的在線重定義來進行操作。對於在線重定義,我們在表轉分區表的時候也用過。 參考如下連接的2.3 小節:使用在線重定義:DBMS_REDEFINITION。
Oracle分區表 總結