oracle12c新特性列舉說明

datapeng發表於2018-03-01

一、在第一部分中,我們將介紹:
  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資料庫包含一組與系統相關的表空間,例如SYSTEM,SYSAUX,UNDO & 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

二、第二部分內容包括

  1. 對錶分割槽維護的增強
  2. 資料庫升級的改進
  3. 透過網路恢復資料檔案
  4. 對Data Pump的增強
  5. 實時自動資料診斷監視器(ADDM)
  6. 併發統計資訊收集

  1. 對錶分割槽維護的增強

  在第一部分中,我解釋瞭如何線上或是離線狀態下遷移一個表分割槽或子分割槽到另一個不同的表空間。在本文中,主要介紹表分割槽其他方面的改進。

  新增多個新分割槽

  在Oracle 12c R1之前,一次只可能新增一個新分割槽到一個已存在的分割槽表。要新增一個以上的新分割槽,需要對每個新分割槽都單獨執行一次ALTER TABLE ADD PARTITION語句。而Oracle 12c只需要使用一條單獨的ALTER TABLE ADD PARTITION 命令就可以新增多個新分割槽,這增加了資料庫靈活性。以下示例說明了如何新增多個新分割槽到已存在的分割槽表:

SQL> CREATE TABLE emp_part
    (eno number(8), ename varchar2(40), sal number (6))
  PARTITION BY RANGE (sal)
  (PARTITION p1 VALUES LESS THAN (10000),
   PARTITION p2 VALUES LESS THAN (20000),
   PARTITION p3 VALUES LESS THAN (30000)
  );

  新增兩個新分割槽:

SQL> ALTER TABLE emp_part ADD PARTITION
  PARTITION p4 VALUES LESS THAN (35000),
  PARTITION p5 VALUES LESS THAN (40000);

  同樣,只要MAXVALUE分割槽不存在,你就可以新增多個新分割槽到一個列表和系統分割槽表。

  如何刪除和截斷多個分割槽/子分割槽

  作為資料維護的一部分,DBA通常會在一個分割槽表上進行刪除或截斷分割槽的維護任務。在12c R1之前,對於一個已存在的分割槽表一次只可能刪除或截斷一個分割槽。而對於Oracle 12c, 可以用單條ALTER TABLE table_name {DROP|TRUNCATE} PARTITIONS 命令來撤銷或合併多個分割槽和子分割槽。

  下例說明了如何在一個已存在分割槽表上刪除或截斷多個分割槽:

  SQL> ALTER TABLE emp_part DROP PARTITIONS p4,p5;
  SQL> ALTER TABLE emp_part TRUNCATE PARTITONS p4,p5;

  要保持索引更新,使用UPDATE INDEXES或UPDATE GLOBAL INDEXES語句,如下所示:

  SQL> ALTER TABLE emp_part DROP PARTITIONS p4,p5 UPDATE GLOBAL INDEXES;
  SQL> ALTER TABLE emp_part TRUNCATE PARTITIONS p4,p5 UPDATE GLOBAL INDEXES;

  如果你在不使用UPDATE GLOBAL INDEXES 語句的情況下刪除或截斷一個分割槽,你可以在USER_INDEXES或USER_IND_PARTITIONS 字典檢視下查詢ORPHANED_ENTRIES 欄位以找出是否有索引包含任何的過期條目。

  將單個分割槽分割為多個新分割槽

  在12c中新增強的SPLIT PARTITION 語句可以讓你只使用一個單獨命令將一個特定分割槽或子分割槽分割為多個新分割槽。下例說明了如何將一個分割槽分割為多個新分割槽:

 SQL> CREATE TABLE emp_part
  (eno number(8), ename varchar2(40), sal number (6))
  PARTITION BY RANGE (sal)
  (PARTITION p1 VALUES LESS THAN (10000),
  PARTITION p2 VALUES LESS THAN (20000),
  PARTITION p_max (MAXVALUE)
  );
  SQL> ALTER TABLE emp_part SPLIT PARTITION p_max INTO
  (PARTITION p3 VALUES LESS THAN (25000),
  PARTITION p4 VALUES LESS THAN (30000), PARTITION p_max);

  將多個分割槽合併為一個分割槽

  你可以使用單條ALTER TBALE MERGE PARTITIONS 語句將多個分割槽合併為一個單獨分割槽:

  SQL> CREATE TABLE emp_part
  (eno number(8), ename varchar2(40), sal number (6))
  PARTITION BY RANGE (sal)
  (PARTITION p1 VALUES LESS THAN (10000),
  PARTITION p2 VALUES LESS THAN (20000),
  PARTITION p3 VALUES LESS THAN (30000),
  PARTITION p4 VALUES LESS THAN (40000),
  PARTITION p5 VALUES LESS THAN (50000),
  PARTITION p_max (MAXVALUE)
  );
  SQL> ALTER TABLE emp_part MERGE PARTITIONS p3,p4,p5 INTO PARTITION p_merge;


  如果分割槽範圍形成序列,你可以使用如下示例:

  SQL> ALTER TABLE emp_part MERGE PARTITIONS p3 TO p5 INTO PARTITION p_merge;

  2. 資料庫升級改進

  每當一個新的Oracle版本釋出,DBA所要面臨的挑戰就是升級過程。該部分我將介紹12c中引入的針對升級的兩個改進。

  預升級指令碼

  在12c R1中,原有的utlu[121]s.sql 指令碼由一個大為改善的預升級資訊指令碼preupgrd.sql所取代。除了預升級檢查驗證,此指令碼還能以修復指令碼的形式解決在升級過程前後出現的各種問題。

  可以對產生的修復指令碼加以執行來解決不同級別的問題,例如,預升級和升級後的問題。當手動升級資料庫時,指令碼必須在實際升級過程初始化之前加以手動執行。然而,當使用DBUA工具來進行資料庫升級時,它會將預升級指令碼作為升級過程的一部分加以自動執行,而且會提示你去執行修復指令碼以防止報錯。

  如何執行指令碼:

SQL> @$ORACLE_12GHOME/rdbms/admin/preupgrd.sql

  以上指令碼會產生一份日誌檔案以及一個[pre/post]upgrade_fixup.sql 指令碼。所有這些檔案都位於$ORACLE_BASE/cfgtoollogs 目錄下。在你繼續真正的升級過程之前,你應該瀏覽日誌檔案中所提到的建議並執行指令碼以修復問題。

  注意:你要確保將preupgrd.sql和utluppkg.sql 指令碼從12c Oracle的目錄home/rdbms/admin directory複製至當前的Oracle的database/rdbms/admin路徑。

  並行升級功能

  資料庫升級時間的長短取決於資料庫上所配置的元件數量,而不是資料庫的大小。在之前的版本中,我們是無法並行執行升級程式,從而快速完成整個升級過程的。

  在12c R1中,原有的catupgrd.sql 指令碼由catctl.pl 指令碼(並行升級功能)替代,現在我們可以採用並行模式執行升級程式了。

  以下流程說明了如何初始化並行升級功能(3個過程);你需要在升級模式下在啟動資料庫後執行這一指令碼:

  cd $ORACLE_12_HOME/perl/bin
  $ ./perl catctl.pl –n 3 -catupgrd.sql

  以上兩個步驟需要在手動升級資料庫時執行。而DBUA也繼承了這兩個新變化。

  3. 透過網路恢復資料檔案

  在12c R1中另一個重要的增強是,你現在可以在主資料庫和備用資料庫之間用一個服務名重新獲得或恢復資料檔案、控制檔案、引數檔案、表空間或整個資料庫。這對於同步主資料庫和備用資料庫極為有用。

  當主資料庫和備用資料庫之間存在相當大的差異時,你不再需要複雜的前滾流程來填補它們之間的差異。RMAN能夠透過網路執行備用恢復以進行增量備份,並且可以將它們應用到物理備用資料庫。你可以用服務名直接將所需資料檔案從備用點複製至主站,這是為了防止主資料庫上資料檔案、表空間的丟失,或是沒有真正從備份集恢復資料檔案。

  以下流程演示瞭如何用此新功能執行一個前滾來對備用資料庫和主資料庫進行同步:

  在物理備用資料庫上:

  ./rman target " as SYSBACKUP"
  RMAN> RECOVER DATABASE FROM SERVICE primary_db_tns USING COMPRESSED BACKUPSET;


  以上示例使用備用資料庫上定義的primary_db_tns 連線字串連線到主資料庫,然後執行了一個增量備份,再將這些增量備份傳輸至備用目的地,接著將應用這些檔案到備用資料庫來進行同步。然而,需要確保已經對primary_db_tns 進行了配置,即在備份資料庫端將其指向主資料庫。

  在以下示例中,我將演示一個場景透過從備用資料庫獲取資料檔案來恢復主資料庫上丟失的資料檔案:

  在主資料庫上:

  ./rman target " as SYSBACKUP"
  RMAN> RESTORE DATAFILE ‘+DG_DISKGROUP/DBANME/DATAFILE/filename’ FROM SERVICE standby_db_tns;

  4. 對Data Pump的增強

  Data Pump版本有了不少有用的改進,例如在匯出時將檢視轉換為表,以及在匯入時關閉日誌記錄等。

  關閉redo日誌的生成

  Data Pump中引入了新的TRANSFORM選項,這對於物件在匯入期間提供了關閉重做生成的靈活性。當為TRANSFORM選項指定了DISABLE_ARCHIVE_LOGGING 值,那麼在整個匯入期間,重做生成就會處於關閉狀態。這一功能在匯入大型表時緩解了壓力,並且減少了過度的redo產生,從而加快了匯入。這一屬性還可應用到表以及索引。以下示例演示了這一功能:
$ ./impdp directory=dpump dumpfile=abcd.dmp logfile=abcd.log TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y

  將檢視轉換為表

  這是Data Pump中另外一個改進。有了VIEWS_AS_TABLES 選項,你就可以將檢視資料載入表中。以下示例演示瞭如何在匯出過程中將檢視資料載入到表中:

$ ./expdp directory=dpump dumpfile=abcd.dmp logfile=abcd.log views_as_tables=my_view:my_table

  5. 實時自動資料診斷監視器 (ADDM) 分析

  透過使用諸如AWR、ASH以及ADDM之類的自動診斷工具來分析資料庫的健康狀況,是每個DBA日程工作的一部分。儘管每種工具都可以在多個層面衡量資料庫的整體健康狀況和效能,但沒有哪個工具可以在資料庫反應遲鈍或是完全掛起的時候使用。

  當資料庫反應遲鈍或是掛起狀態時,而且你已經配置了Oracle 企業管理器 12c的雲控制,你就可以對嚴重的效能問題進行診斷。這對於你瞭解當前資料庫發生了什麼狀況有很大幫助,而且還能夠對此問題給出解決方案。

  以下步驟演示瞭如何在Oracle 企業管理器 12c上分析資料庫狀態:

在訪問資料庫訪問主頁面從Performance選單選擇Emergency Monitoring 選項。這會顯示掛起分析表中排名靠前的阻止會話。
在Performance選單選擇Real-Time ADDM 選項來執行實時ADDM分析。
在收集了效能資料後,點選Findings標籤以獲得所有結果的互動總結。
  6. 同時在多個表上收集統計資料

  在之前的Oracle資料庫版本中,當你執行一個DBMS_STATS 程式來收集表、索引、模式或者資料庫級別的統計資料時,Oracle習慣於一次一個表的收集統計資料。如果表很大,那麼推薦你採用並行方式。在12c R1中,你現在可以同時在多個表、分割槽以及子分割槽上收集統計資料。在你開始使用它之前,你必須對資料庫進行以下設定以開啟此功能:

  SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN='DEFAULT_MAIN';
  SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=4;
  SQL> EXEC DBMS_STATS.SET_GLOBAL_PREFS('CONCURRENT', 'ALL');
  SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT');

三、第三部分包括:

1. ASM中的增強
2. 網格基礎架構的增強
3. Oracle RAC的增強

1. 自動儲存管理(ASM)中的增強

Flex ASM

在一個典型的網格基礎架構安裝環境中,每個節點都執行自身的ASM例項,並將其作為執行於此節點上資料庫的儲存容器。但這種設定會存在相應的單點故障危險。例如,如果此節點上的ASM例項發生故障,則執行於此節點上的所有資料庫和例項都會受到影響。為了避免ASM例項的單點故障,Oracle 12c提供了一個名為Flex ASM的功能。Flex ASM是一個不同的概念和架構,只有很少數量的ASM例項需要執行在叢集中的一些伺服器上。當某節點上的一個ASM例項發生故障,Oracle叢集就會在另一個不同的節點上自動啟動替代ASM例項以加強可用性。另外,這一設定還為執行在此節點上的例項提供了ASM例項負載均衡能力。Flex ASM的另一個優勢就是可以在單獨節點上加以配置。
當選擇Flex Cluster選項作為叢集安裝環境的第一部分時,鑑於Flex Cluster的要求,Flex ASM配置就會被自動選擇。傳統叢集同樣也適用於Flex ASM。當你決定使用Flex ASM時,你必須保證所需的網路是可用的。你可以選擇Flex ASM儲存選項作為叢集安裝環境的一部分,或是使用ASMCA在一個標準叢集環境下啟用Flex ASM。
以下命令顯示了當前的ASM模式:
$ ./asmcmd showclustermode
$ ./srvctl config asm

或是連線到ASM例項並查詢INSTANCE_TYPE引數。如果輸出值為ASMPROX,那麼,就說明Flex ASM已經配置好了。

ASM儲存限制放寬

ASM儲存硬性限額在最大ASM 磁碟群組和磁碟大小上已經大幅提升。在 12c R1中,ASM支援511個ASM磁碟群組,而在11g R2中只支援63個。同樣,相比起在11g R2中20 PB的磁碟大小,現在已經將這一數字提高到32 PB。

對ASM均衡操作的最佳化

12c 中新的EXPLAIN WORK FOR 語句用於衡量一個給定ASM均衡操作所需的工作量,並在V$ASM_ESTIMATE動態檢視中輸入結果。使用此動態檢視,你可以調整POWER LIMIT 語句對重新平衡操作工作進行改善。例如,如果你想衡量新增一個新ASM磁碟所需的工作量,在實際執行手動均衡操作之前,你可以使用以下命令:

SQL> EXPLAIN WORK FOR ALTER DISKGROUP DG_DATA ADD DISK data_005;
SQL> SELECT est_work FROM V$ASM_ESTIMATE;
SQL> EXPLAIN WORK SET STATEMENT_ID='ADD_DISK' FOR ALTER DISKGROUP DG_DATA AD DISK data_005;
SQL> SELECT est_work FROM V$ASM_ESTIMATE WHERE STATEMENT_ID = 'ADD_DISK’;

你可以根據從動態檢視中獲取的輸出來調整POWER的限制以改善均衡操作。

ASM 磁碟清理
在一個ASM磁碟群組中,新的ASM磁碟清理操作分為正常或高冗餘兩個級別,它可以檢驗ASM磁碟群組中所有磁碟的邏輯資料破壞,並且可以自動對邏輯破壞進行修復,如果檢測到有邏輯資料破壞,就會使用ASM映象磁碟。磁碟清理可以在磁碟群組,特定磁碟或是某個檔案上執行,這樣其影響可降到最小程度。以下演示了磁碟清理場景:

SQL> ALTER DISKGROUP dg_data SCRUB POWER LOW:HIGH:AUTO:MAX;
SQL> ALTER DISKGROUP dg_data SCRUB FILE '+DG_DATA/MYDB/DATAFILE/filename.xxxx.xxxx'
REPAIR POWER AUTO;

ASM的活動會話歷史(ASH)

V$ACTIVE_SESSION_HISOTRY 動態檢視現在還可以提供ASM例項的活動會話抽樣。然而,診斷包的使用是受到許可限制的。

2. 網格(Grid)基礎架構的增強
Flex 叢集
Oracle 12c 在叢集安裝時支援兩類配置:傳統標準叢集和Flex叢集。在一個傳統標準叢集中,所有叢集中的節點都彼此緊密地整合在一起,並透過私有網路進行互動,而且可以直接訪問儲存。另一方面,Flex叢集在Hub和Leaf節點結構間引入了兩類節點。分配在Hub中的節點類似於傳統標準叢集,它們透過私有網路彼此互連在一起並對儲存可以進行直接讀寫訪問。而Leaf節點不同於Hub節點,它們不需要直接訪問底層儲存;相反的是,它們透過Hub節點對儲存和資料進行訪問。
你可以配置多達64個Hub節點,而Leaf節點則可以更多。在Oracle Flex叢集中,無需配置Leaf節點就可以擁有Hub節點,而如果沒有Hub節點的話,Leaf節點是不會存在的。對於一個單獨Hub節點,你可以配置多個Leaf節點。在Oracle Flex叢集中,只有Hub節點會直接訪問OCR和Voting磁碟。當你規劃大規模的叢集環境時,這將是一個非常不錯的功能。這一系列設定會大大降低互連擁堵,併為傳統標準叢集提供空間以擴大叢集。
部署Flex 叢集的兩種途徑:

1. 在配置一個全新叢集的時候部署

2. 升級一個標準叢集模式到Flex叢集

如果你正在配置一個全新的叢集,你需要在步驟3中選擇叢集配置的型別,選擇配置一個Flex叢集選項,然後你需要在步驟6中對Hub和Leaf節點進行分類。對於每個節點,選擇相應角色是Hub或是Leaf,而虛擬主機名也是可選的。

將一個標準叢集模式轉換為Flex 叢集模式需要以下步驟:

1. 用以下命令獲取叢集的當前狀態:

$ ./crsctl get cluster mode status

2. 以root使用者執行以下命令:

$ ./crsctl set cluster mode flex
$ ./crsctl stop crs
$ ./crsctl start crs –wait

3. 根據設計改變節點角色:

$ ./crsctl get node role config
$ ./crsctl set node role hub|leaf
$ ./crsctl stop crs
$ ./crsctl start crs -wait

注意:

你無法從Flex恢復回標準叢集模式
改變叢集節點模式需要叢集棧停止
確保以一個固定的VIP配置GNS
ASM磁碟群組中的OCR備份
對於12c,OCR現在可以在ASM磁碟群組中得以備份。這簡化了透過所有節點對OCR備份檔案的訪問。為了防止OCR的恢復,你不必擔心OCR最新的備份是在哪個節點上。可以從任何節點輕易識別儲存在ASM中的最新備份並能很容易地執行恢復。

以下演示瞭如何將ASM磁碟群組設定為OCR備份位置:

$ ./ocrconfig -backuploc +DG_OCR

支援IPv6協議

對於12c,Oracle是支援IPv6網路協議配置的。你現在可以在IPv4或IPv6上配置共有或私有網路介面,儘管如此,你需要確保在所有叢集中的節點上使用相同的IP協議。

3. RAC資料庫的增強

What-if命令評估

透過srvctl使用新的What-if命令評估選項,現在可以確定執行此命令所造成的影響。這一新新增到srvctl的命令,可以在沒有實際執行或是不對當前系統做任何改變的情況下模擬此命令。這在想要對一個已存在的系統進行更改卻對結果不確定的時候特別有用。這樣,此命令就會提供進行變更的效果。而–eval 選項也可以透過crsctl 命令來使用。

例如,如果你想要知道停止一個特定資料庫會發生什麼,那麼你就可以使用以下示例:

$ ./srvctl stop database –d MYDB –eval
$ ./crsctl eval modify resource -attr “value”

srvctl的改進

對於srvctl命令還有一些新增功能。以下演示瞭如何用這些新增功能停止或啟動叢集上的資料庫或例項資源。

srvctl start database|instance –startoption NOMOUNT|MOUNT|OPEN
srvctl stop database|instance –stopoption NOMOUNT|MOUNT|OPEN

四、第四部分包括:

如何在子表包含資料的情況下截斷一個主表
限制Top-N查詢結果的記錄
SQL*Plus的各種增強
會話級序列
WITH語句的改善
擴充套件資料型別
截斷表CASCADE
在之前的版本中,在子表引用一個主表以及子表存在記錄的情況下,是不提供截斷此主表操作的。而在12c中的帶有CASCADE操作的TRUNCATE TABLE可以截斷主表中的記錄,並自動對子表進行遞迴截斷,並作為DELETE ON CASCADE服從外來鍵引用。由於這是應用到所有子表的,所以對遞迴層級的數量是沒有CAP的,可以是孫子表或是重孫子表等等。

這一增強擯棄了要在截斷一個主表之前先截斷所有子表記錄的前提。新的CASCADE語句同樣也可以應用到表分割槽和子表分割槽等。

SQL> TRUNCATE TABLE CASCADE;
SQL> TRUNCATE TABLE PARTITION CASCADE;

如果對於子表的外來鍵沒有定義ON DELETE CASCADE 選項,便會丟擲一個ORA-14705錯誤。

對Top-N查詢結果限制記錄

在之前的版本中有多種間接手段來對頂部或底部記錄獲取Top-N查詢結果。而在12c中,透過新的FETCH FIRST|NEXT|PERCENT語句簡化了這一過程並使其變得更為直接。為了從EMP表檢索排名前10的工資記錄,可以用以下新的SQL語句:

SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC
FETCH FIRST 10 ROWS ONLY;

以下示例獲取排名前N的所有相似的記錄。例如,如果第十行的工資值是5000,並且還有其他員工的工資符合排名前N的標準,那麼它們也同樣會由WITH TIES語句獲取。

SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC
FETCH FIRST 10 ROWS ONLY WITH TIES;

以下示例限制從EMP表中獲取排名前10%的記錄:

SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC
FETCH FIRST 10 PERCENT ROWS ONLY;

以下示例忽略前5條記錄並會顯示錶的下5條記錄:

SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC
OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;

所有這些限制同樣可以很好的應用於PL/SQL塊。

BEGIN
SELECT sal BULK COLLECT INTO sal_v FROM EMP
FETCH FIRST 100 ROWS ONLY;
END;

對SQL*Plus的各種增強

SQL*Plus的隱式結果:12c中,在沒有實際繫結某個RefCursor的情況下,SQL*Plus從一個PL/SQL塊的一個隱式遊標返回結果。這一新的dbms_sql.return_result過程將會對PL/SQL 塊中由SELECT 語句查詢所指定的結果加以返回並進行格式化。以下程式碼對此用法進行了描述:

SQL> CREATE PROCEDURE mp1
res1 sys_refcursor;
BEGIN
open res1 for SELECT eno,ename,sal FROM emp;
dbms_sql.return_result(res1);
END;
SQL> execute mp1;

當此過程得以執行,會在SQL*Plus上返回格式化的記錄。

顯示不可見欄位:在本系列文章的第一部分,我已經對不可見欄位的新特性做了相關闡述。當欄位定義為不可見時,在描述表結構時它們將不會顯示。然而,你可以透過在SQL*Plus提示符下進行以下設定來顯示不可見欄位的相關資訊:

SQL> SET COLINVISIBLE ON|OFF

以上設定僅對DESCRIBE 命令有效。目前它還無法對不可見欄位上的SELECT 語句結果產生效果。

會話級序列

在12c中現在可以建立新的會話級資料庫序列來支援會話級序列值。這些序列的型別在有會話級的全域性臨時表上最為適用。

會話級序列會產生一個獨特範圍的值,這些值是限制在此會話內的,而非超越此會話。一旦會話終止,會話序列的狀態也會消失。以下示例解釋了建立一個會話級序列:

SQL> CREATE SEQUENCE my_seq START WITH 1 INCREMENT BY 1 SESSION;
SQL> ALTER SEQUENCE my_seq GLOBAL|SESSION;

對於會話級序列,CACHE, NOCACHE, ORDER 或 NOORDER 語句會予以忽略。

WITH語句的改善

在12c中,你可以用SQL更快的執行PL/SQL函式或過程,這些是由SQL語句的WITH語句加以定義和宣告的。以下示例演示瞭如何在WITH語句中定義和宣告一個過程或函式:

WITH
PROCEDURE|FUNCTION test1 (…)
BEGIN
END;
SELECT FROM table_name;
/

儘管你不能在PL/SQL單元直接使用WITH語句,但其可以在PL/SQL單元中透過一個動態SQL加以引用。

擴充套件資料型別

在12c中,與早期版本相比,諸如VARCHAR2, NAVARCHAR2以及 RAW這些資料型別的大小會從4K以及2K位元組擴充套件至32K位元組。只要可能,擴充套件字元的大小會降低對LOB資料型別的使用。為了啟用擴充套件字元大小,你必須將MAX_STRING_SIZE的初始資料庫引數設定為EXTENDED。

要使用擴充套件字元型別需要執行以下過程:

1. 關閉資料庫

2. 以升級模式重啟資料庫

3. 更改引數: ALTER SYSTEM SET MAX_STRING_SIZE=EXTENDED;

4. 執行 utl32k.sql as sysdba : SQL> @?/rdbms/admin/utl32k.sql

5. 關閉資料庫

6. 以讀寫模式重啟資料庫

對比LOB資料型別,在ASSM表空間管理中,擴充套件資料型別的欄位以SecureFiles LOB加以儲存,而在非ASSM表空間管理中,它們則是以BasciFiles LOB進行儲存的。

注意:一旦更改,你就不能再將設定改回STANDARD。

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

相關文章