Oracle 12c 新特性(一)

jelephant發表於2015-12-05

在第一部分中,我們將介紹:

  1. 線上遷移活躍的資料檔案

  2. 表分割槽或子分割槽的線上遷移

  3. 不可見欄位

  4. 相同欄位上的多重索引

  5. DDL日誌

  6. 臨時undo

  7. 新的備份使用者特權

  8. 如何在RMAN中執行SQL語句

  9. RMAN中的表級別恢復

  10. PGA的大小限制問題

 

  1. 線上重新命名和重新定位活躍資料檔案

  不同於以往的版本,在Oracle資料庫12c R1版本中對資料檔案的遷移或重新命名不再需要太多繁瑣的步驟,即把表空間置為只讀模式,接下來是對資料檔案進行離線操作。在12c R1中,可以使用ALTER DATABASE MOVE DATAFILE這樣的SQL語句對資料檔案進行線上重新命名和移動。而當此資料檔案正在傳輸時,終端使用者可以執行查詢,DML以及DDL方面的任務。另 外,資料檔案可以在儲存裝置間遷移,如從非ASM遷移至ASM,反之亦然。

  重新命名資料檔案:

SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users01.dbf' TO '/u00/data/users_01.dbf';

  從非ASM遷移資料檔案至ASM:

SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '+DG_DATA';

  將資料檔案從一個ASM磁碟群組遷移至另一個ASM磁碟群組:

SQL> ALTER DATABASE MOVE DATAFILE '+DG_DATA/DBNAME/DATAFILE/users_01.dbf ' TO '+DG_DATA_02';

  在資料檔案已存在於新路徑的情況下,以相同的命名將其覆蓋:

SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '/u00/data_new/users_01.dbf' REUSE;

  複製檔案到一個新路徑,同時在原路徑下保留其複製:

SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '/u00/data_new/users_01.dbf' KEEP;

  當透過查詢v$session_longops動態檢視來移動檔案時,你可以監控這一過程。另外,你也可以引用alert.log,Oracle會在其中記錄具體的行為。

 

  2. 表分割槽或子分割槽的線上遷移

  在Oracle 12c R1中遷移表分割槽或子分割槽到不同的表空間不再需要複雜的過程。與之前版本中未分割槽表進行線上遷移類似,表分割槽或子分割槽可以線上或是離線遷移至一個不同的表 空間。當指定了ONLINE語句,所有的DML操作可以在沒有任何中斷的情況下,在參與這一過程的分割槽或子分割槽上執行。與此相反,分割槽或子分割槽遷移如果是 在離線情況下進行的,DML操作是不被允許的。

  示例:

SQL> ALTER TABLE table_name MOVE PARTITION|SUBPARTITION partition_name TO tablespace tablespace_name;
   SQL> ALTER TABLE table_name MOVE PARTITION|SUBPARTITION partition_name TO tablespace tablespace_name UPDATE INDEXES ONLINE;

  第一個示例是用來在離線狀況下將一個表分割槽或子分割槽遷移至一個新的表空間。第二個示例是線上遷移表分割槽或子分割槽並維護表上任何本地或全域性的索引。此外,當使用ONLINE語句時,DML操作是不會中斷的。

  重要提示:

  • UPDATE INDEXES語句可以避免出現表中任何本地或全域性索引無法使用的情況。
  • 表的線上遷移限制也適用於此。
  • 引入加鎖機制來完成這一過程,當然它也會導致效能下降並會產生大量的redo,這取決於分割槽和子分割槽的大小。

 

  3. 不可見欄位

  在Oracle 11g R1中,Oracle以不可見索引和虛擬欄位的形式引入了一些不錯的增強特性。繼承前者併發揚光大,Oracle 12c R1中引入了不可見欄位思想。在之前的版本中,為了隱藏重要的資料欄位以避免在通用查詢中顯示,我們往往會建立一個檢視來隱藏所需資訊或應用某些安全條 件。

  在12c R1中,你可以在表中建立不可見欄位。當一個欄位定義為不可見時,這一欄位就不會出現在通用查詢中,除非在SQL語句或條件中有顯式的提及這一欄位,或是 在表定義中有DESCRIBED。要新增或是修改一個不可見欄位是非常容易的,反之亦然。

  SQL> CREATE TABLE emp (eno number(6), ename name varchar2(40), sal number(9) INVISIBLE);
  SQL> ALTER TABLE emp MODIFY (sal visible);

  你必須在INSERT語句中顯式提及不可見欄位名以將不可見欄位插入到資料庫中。虛擬欄位和分割槽欄位同樣也可以定義為不可見型別。但臨時表,外部表和叢集表並不支援不可見欄位。

 

  4. 相同欄位上的多重索引

  在Oracle 12c R1之前,一個欄位是無法以任何形式擁有多個索引的。或許有人會想知道為什麼通常一個欄位需要有多重索引,事實上需要多重索引的欄位或欄位集合是很多的。 在12c R1中,只要索引型別的形式不同,一個欄位就可以包含在一個B-tree索引中,同樣也可以包含在Bitmap索引中。注意,只有一種型別的索引是在給定 時間可用的。

 

  5. DDL日誌

  在之前的版本中沒有可選方法來對DDL操作進行日誌記錄。而在12c R1中,你現在可以將DDL操作寫入xml和日誌檔案中。這對於瞭解誰在什麼時間執行了create或drop命令是十分有用的。要開啟這一功能必須對 ENABLE_DDL_LOGGING 初始引數加以配置。這一引數可以在資料庫或會話級加以設定。當此引數為啟用狀態,所有的DDL命令會記錄在$ORACLE_BASE/diag /rdbms/DBNAME/log|ddl 路徑下的xml和日誌檔案中。一個xml中包含DDL命令,IP地址,時間戳等資訊。這可以幫助確定在什麼時候對使用者或表進行了刪除亦或是一條DDL語句 在何時觸發。

  開啟DDL日誌功能

SQL> ALTER SYSTEM|SESSION SET ENABLE_DDL_LOGGING=TRUE;

  以下的DDL語句可能會記錄在xml或日誌檔案中:

  • CREATE|ALTER|DROP|TRUNCATE TABLE
  • DROP USER
  • CREATE|ALTER|DROP PACKAGE|FUNCTION|VIEW|SYNONYM|SEQUENCE

 

  6. 臨時undo

  每個Oracle資料庫包含一組與系統相關的表空間,例如SYSTEMSYSAUXUNDO & TEMP, 並且它們在Oracle資料庫中每個都用於不同的目的。在Oracle 12c R1之前,臨時表生成的undo記錄是儲存在undo表空間裡的,通用表和持久表的undo記錄也是類似的。而在12c R12的臨時undo功能中,臨時undo記錄可以儲存在一個臨時表中,而無需再儲存在undo表空間內。這樣做的主要好處在於:減少undo表空間,由 於資訊不會被記錄在redo日誌中,所以減少了redo資料的生成。你可以在會話級別或者資料庫級別來啟用臨時undo選項。

  啟用臨時undo功能

  要使用這一新功能,需要做以下設定:

  • 相容性引數必須設定為12.0.0或更高
  • 啟用 TEMP_UNDO_ENABLED 初始化引數
  • 由於臨時undo記錄現在是儲存在一個臨時表空間中的,你需要有足夠的空間來建立這一臨時表空間
  • 對於會話級,你可以使用:ALTER SYSTEM SET TEMP_UNDO_ENABLE=TRUE;

  查詢臨時undo資訊

  以下所列的字典檢視是用來檢視或查詢臨時undo資料相關統計資訊的:

  • V$TEMPUNDOSTAT
  • DBA_HIST_UNDOSTAT
  • V$UNDOSTAT

  要禁用此功能,你只需做以下設定:

SQL> ALTER SYSTEM|SESSION SET TEMP_UNDO_ENABLED=FALSE;

 

  7. 備份特定使用者特權

  在11g R2中,引入了SYSASM特權來執行ASM的特定操作。同樣地,在12c中引入了SYSBACKUP特權用來在 RMAN中執行備份和恢復命令。因此,你可以在資料庫中建立一個本地使用者並在不授予其SYSDBA許可權的情況下,透過授予SYSBACKUP許可權讓其能夠 在RMAN中執行備份和恢復相關的任務。

$ ./rman target "username/password as SYSBACKUP"

 

  8. 如何在RMAN中執行SQL語句

  在12c中,你可以在不需要SQL字首的情況下在RMAN中執行任何SQL和PL/SQL命令,即你可以從RMAN直接執行任何SQL和PL/SQL 命令。如下便是在RMAN中執行SQL語句的示例:

  RMAN> SELECT username,machine FROM v$session;
  RMAN> ALTER TABLESPACE users ADD DATAFILE SIZE 121m;

 

  9. RMAN中的表恢復和分割槽恢復

  Oracle資料庫備份主要分為兩類:邏輯和物理備份。每種備份型別都有其自身的優缺點。在之前的版本中,利用現有物理備份來恢復表或分割槽是不可行 的。為了恢復特定物件,邏輯備份是必需的。對於12c R1,你可以在發生drop或truncate的情況下從RMAN備份將一個特定的表或分割槽恢復到某個時間點或SCN。

  當透過RMAN發起一個表或分割槽恢復時,大概流程是這樣的:

  • 確定要恢復表或分割槽所需的備份集
  • 在恢復表或分割槽的過程中,一個輔助資料庫會臨時設定為某個時間點
  • 利用資料泵將所需表或分割槽匯出到一個dumpfile
  • 你可以從源資料庫匯入表或分割槽(可選)
  • 在恢復過程中進行重新命名操作

  以下是一個透過RMAN對錶進行時間點恢復的示例(確保你已經對稍早的資料庫進行了完整備份):

  RMAN> connect target "username/password as SYSBACKUP";
  RMAN> RECOVER TABLE username.tablename UNTIL TIME 'TIMESTAMP…'
  AUXILIARY DESTINATION '/u01/tablerecovery'
  DATAPUMP DESTINATION '/u01/dpump'
  DUMP FILE 'tablename.dmp'
  NOTABLEIMPORT -- this option avoids importing the table automatically.(此選項避免自動匯入表)
    REMAP TABLE 'username.tablename': 'username.new_table_name'; -- can rename table with this option. (此選項可以對錶重新命名)

  重要提示:

  • 確保對於輔助資料庫在/u01檔案系統下有足夠的可用空間,同時對資料泵檔案也有同樣保證
  • 必須要存在一份完整的資料庫備份,或者至少是要有SYSTEM相關的表空間備份

  以下是在RMAN中應用表或分割槽恢復的限制和約束:

  • SYS使用者表或分割槽無法恢復
  • 儲存於SYSAUX和SYSTEM表空間下的表和分割槽無法恢復
  • 當REMAP選項用來恢復的表包含NOT NULL約束時,恢復此表是不可行的

 

  10. 限制PGA的大小

  在Oracle 12c R1之前,沒有選項可以用來限制和控制PGA的大小。雖然你設定某個大小為PGA_AGGREGATE_TARGET 的初始引數,Oracle會根據工作負載和需求來動態地增大或減小PGA的大小。而在12c中,你可以透過開啟自動PGA管理來對PGA設定硬性限制,這 需要對PGA_AGGREGATE_LIMIT 引數進行設定。因此,你現在可以透過設定新的引數來對PGA設定硬性限制以避免過度使用PGA。

  SQL> ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=2G;
  SQL> ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=0; --disables the hard limit

  重要提示:

  當超過了當前PGA的限制,Oracle會自動終止/中止會話或程式以保持最合適的PGA記憶體。  

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

相關文章