Oracle 11g 新特性 -- SecureFiles 說明

darren__chan發表於2015-05-19

一. Oracle SecureFiles 說明

1.1 現有LOB實施中的問題

 

在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

 

 

1.2 Oracle SecureFiles 說明

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)  空間和記憶體增強功能

 

1.3 啟用SecureFiles 儲存

使用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’;

 

1.4 SecureFiles:高階功能

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)  透明加密

 

1.5 SecureFiles:儲存選項

MAXSIZE 是新的儲存子句,用於控制SecureFiles 的物理儲存屬性。MAXSIZE 指定與儲存子句級別相關的最大段大小。

 

RETENTION 指定SecureFiles 的以下項:

(1)  MAX 在達到段MAXSIZE 後重新使用舊版本。

(2)  MIN 在指定的最短時間內保留舊版本。

(3)  AUTO 是預設設定,主要對空間和時間進行折中使之達到平衡。這是自動確定的。

(4)  NONE 儘可能重用舊版本。

 

使用ALTER TABLE 語句更改RETENTION 僅影響該語句執行後建立的空間。

對於SecureFiles,不再需要指定CHUNK、PCTVERSION、FREEPOOLS、FREELISTS 和FREELIST GROUPS。為了與現有指令碼相相容,將對這些子句進行分析但不解釋它們。

 

1.6 建立SecureFiles

 

可使用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 列的表。

 

1.7 共享I/O池

為了支援共享記憶體(與程式全域性區(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 保留一個鎖定。

 

1.8 更改SecureFiles

 

使用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);

 

 

1.9 訪問SecureFiles 後設資料

 

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 塊視為已使用的空間。

 

1.10 遷移到SecureFiles

使用LOB 介面超集,可輕鬆從BasicFile LOB 進行遷移。遷移到SecureFiles 有兩種建議方法:分割槽交換和聯機重新定義。

 

分割槽交換:

(1)  需要與表中最大分割槽相等的額外空間

(2)  可在交換期間維護索引

(3)  可將工作量分散到多個較小的維護視窗

(4)  要求表或分割槽離線以執行交換

 

聯機重新定義(建議做法)

(1)  不要求表或分割槽離線

(2)  可並行進行

(3)  要求額外儲存空間等於整個表,並且所有LOB 段均可用

(4)  要求重建所有全域性索引

 

這些解決方案通常意味著使用輸入LOB列中的資料所用磁碟空間兩倍的空間。但是,使用分割槽和按分割槽執行這些操作有助於降低所需的磁碟空間。

 

1.11 SecureFiles 監視

 

為了顯示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

 

二.示例

 

2.1 修改DB_SECUREFILE引數

 

在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

 

 

2.2 建立 SecureFile LOBs

完整語法參考:

http://docs.oracle.com/cd/B28359_01/appdev.111/b28393/adlob_smart.htm

 

 

2.2.1 基本型別

 

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.

 

 

2.2.2 LOB Deduplication 重複值

 

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>

 

2.2.3 LOB Compression 壓縮

 

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

--壓縮的空間又釋放出來了。

 

2.2.4 LOB Encryption 加密

    SecureFileLobs 的加密依賴wallet 或者HardwareSecurity Model (HSM)來儲存encryption key。 所以在建立加密的SecureFile之前,必須先建立並開啟一個wallet。

 

2.2.4.1 建立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;

 

2.2.4.2 示例

    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.

 

2.2.5 LOB Cache and Logging

 

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

);

 

2.2.6 使用PL/SQL APIs 對LOBs 屬性進行檢視與修改

 

2.2.6.1 DBMS_LOB package

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

 

 

2.2.6.2 DBMS_SPACE package

    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

 

2.2.7 Migrating to SecureFiles  從BasicFile遷移到SecureFiles

 

將列從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分割槽表 總結

http://blog.csdn.net/tianlesoftware/article/details/4717318

 

 

 

 

 

 

---------------------------------------------------------------------------------------

版權所有,文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任!

Skype:    tianlesoftware

QQ:       tianlesoftware@gmail.com

Email:    

Blog:     http://blog.csdn.net/tianlesoftware

Weibo:    

Twitter:  

Facebook: 

Linkedin: 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29863023/viewspace-1661799/,如需轉載,請註明出處,否則將追究法律責任。

相關文章