Oracle 資料庫12c 16大新特性總結

來源:互聯網
上載者:User

標籤:

Oracle 12c 發行很久,一直想找個時間好好學習一下,畢竟後續12c將會逐漸替代現有資料庫版本,成為主流資料庫版本。現就12c 一些常用的

特性給大家一起學習一下。

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 TBCS.SUBS_PRIVILEGE   MOVE SUBPARTITION P_532_SUBP01   TABLESPACE GGUSR;
SQL>
ALTER TABLE TBCS.SUBS_PRIVILEGE   MOVE SUBPARTITION P_532_SUBP01   TABLESPACE GGUSR UPDATE INDEXES ONLINE;
  第一個樣本是用來在離線狀況下將一個表分區或子分區遷移至一個新的資料表空間。第二個樣本是線上遷移表分區或子
分區並維護表上任何本地或全域的索引。此外,當使用ONLINE語句時,DML操作是不會中斷的。

重要提示:
  1、UPDATE INDEXES語句可以避免出現表中任何本地或全域索引無法使用的情況。
  2、表的線上遷移限制也適用於此。
  3、引入加鎖機制來完成這一過程,當然它也會導致效能下降並會產生大量的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索引中。注意,只有一種類型的索引是在給定時間可用的。

       sql> create index xulq.idx_xiaoxu_tabname1 on xulq.xiaoxu_01 (table_name) tablespace users;   ---索引可以建立
       sql> create bitmap index xulq.bitidx_xiaoxu_tabname on xulq.xiaoxu_01 (table_name) tablespace users;  

           ---ORA-01408: 此列列表已索引 ,正在分析原因。

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;  ----SYSTEM 層級的修改無需重啟資料庫即可生效。

以下的DDL語句可能會記錄在xml或記錄檔中:
CREATE | ALTER | DROP | TRUNCATE TABLE
DROP USER
CREATE |ALTER | DROP  PACKAGE |FUNCTION | VIEW | SYNONYM | SEQUENCE.

樣本:

sql> CREATE TABLE XULQ.XIAOXU_DDL_T AS SELECT * FROM DUAL;

DDL LOG 日誌:

[[email protected] ddl]$ cat log.xml
<msg time=‘2016-05-26T22:21:10.333+08:00‘ org_id=‘oracle‘ comp_id=‘rdbms‘
 msg_id=‘kpdbLogDDL:18370:2946163730‘ type=‘UNKNOWN‘ group=‘diag_adl‘
 level=‘16‘ host_id=‘ora12c‘ host_addr=‘127.0.0.1‘
 version=‘1‘>
 <txt>CREATE TABLE XULQ.XIAOXU_DDL_T AS SELECT * FROM DUAL
 </txt>

6. 臨時undo
  
每個Oracle資料庫包含一組與系統相關的資料表空間,例如SYSTEM,SYSAUX,UNDO & TEMP,並且它們在Oracle數
據庫中每個都用於不同的目的。在Oracle 12c R1之前,undo記錄是由暫存資料表產生並儲存在undo資料表空間中的,這更類似
於一個通用或持久的表撤銷記錄。然而,由於在12c R1中引入了臨時undo功能,那些臨時undo記錄現在就可以儲存在
暫存資料表中,而不是儲存在undo資料表空間中。臨時undo的主要好處在於:由於資訊不會寫入undo日誌,undo資料表空間的開銷
得以減少並且產生的undo資料會更少。而對於在會話級還是資料庫級開啟臨時undo功能你是可以靈活選擇的。

啟用臨時undo功能要使用這一新功能,需要做以下設定:
1、相容性參數必須設定為12.0.0或更高
2、啟用 TEMP_UNDO_ENABLED 初始化參數
3、由於臨時undo記錄現在是儲存在一個暫存資料表空間中的,你需要有足夠的空間來建立這一暫存資料表空間
4、對於會話級,你可以使用: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 121 m;

9. RMAN中的表恢複和分區恢複

  OracleDatabase Backup主要分為兩類:邏輯和物理備份。每種備份類型都有其自身的優缺點。在之前的版本中,利用現
有物理備份來恢複表或分區是不可行的。為了恢複特定對象,邏輯備份是必需的。對於12c R1,你可以在發生drop或
truncate的情況下從RMAN備份將一個特定的表或分區恢複到某個時間點或SCN。
當通過RMAN發起一個表或分區恢複時,大概流程是這樣的:
1、確定要恢複表或分區所需的備份組
2、在恢複表或分區的過程中,一個次要資料庫會臨時設定為某個時間點
3、利用資料泵將所需表或分區匯出到一個dumpfile
4、你可以從來源資料庫匯入表或分區(可選)
5、在恢複過程中進行重新命名操作
  
以下是一個通過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.
(此選項可以對錶重新命名)
重要提示:
1、確保對於次要資料庫在/u01檔案系統下有足夠的可用空間,同時對資料泵檔案也有同樣保證
2、必須要存在一份完整的Database Backup,或者至少是要有SYSTEM相關的資料表空間備份

以下是在RMAN中應用表或分區恢複的限制和約束:
1、SYS使用者表或分區無法恢複
2、儲存於SYSAUX和SYSTEM資料表空間下的表和分區無法恢複
3、當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記憶體。

11. 對錶分區維護的增強

  在第一部分中,我解釋了如何線上或是離線狀態下遷移一個表分區或子分區到另一個不同的資料表空間。在本文中,主
要介紹表分區其他方面的改進。
11.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 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 TRUNCATE PARTITION p4,p5;
SQL> ALTER TABLE emp_part DROP PARTITIONS 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> 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;

12. 資料庫升級改進

  每當一個新的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也繼承了這兩個新變化。


13. 通過網路恢複資料檔案
  在12c R1中另一個重要的增強是,你現在可以在主要資料庫和備用資料庫之間用一個服務名重新獲得或恢複資料文
件、控制檔案、參數檔案、資料表空間或整個資料庫。這對於同步主要資料庫和備用資料庫極為有用。
  當主要資料庫和備用資料庫之間存在相當大的差異時,你不再需要複雜的前滾流程來填補它們之間的差異。RMAN能
夠通過網路執行備用恢複以進行增量備份,並且可以將它們應用到物理備用資料庫。你可以用服務名直接將所需資料文
件從備用點拷貝至主站,這是為了防止主要資料庫上資料檔案、資料表空間的丟失,或是沒有真正從備份組恢複資料檔案。
  以下流程示範了如何用此新功能執行一個前滾來對備用資料庫和主要資料庫進行同步:
  在物理備用資料庫上:
./rman target "username/[email protected]_db_tns as SYSBACKUP"
RMAN> RECOVER DATABASE FROM SERVICE primary_db_tns USING COMPRESSED BACKUPSET;
  以上樣本使用備用資料庫上定義的primary_db_tns 連接字串串連到主要資料庫,然後執行了一個增量備份,再將這
些增量備份傳輸至備用目的地,接著將應用這些檔案到備用資料庫來進行同步。然而,需要確保已經對primary_db_tns
進行了配置,即在備份資料庫端將其指向主要資料庫。
  在以下樣本中,我將示範一個情境通過從備用資料庫擷取資料檔案來恢複主要資料庫上丟失的資料檔案:
  在主要資料庫上:
./rman target "username/[email protected]_db_tns as SYSBACKUP"
RMAN> RESTORE DATAFILE ‘+DG_DISKGROUP/DBANME/DATAFILE/filename’ FROM SERVICE standby_db_tns;

14. 對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

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

  通過使用諸如AWR、ASH以及ADDM之類的自動診斷工具來分析資料庫的健康情況,是每個DBA議程工作的一部
分。儘管每種工具都可以在多個層面衡量資料庫的整體健康情況和效能,但沒有哪個工具可以在資料庫反應遲鈍或是完
全掛起的時候使用。
  當資料庫反應遲鈍或是掛起狀態時,而且你已經配置了Oracle 企業管理器 12c的雲控制,你就可以對嚴重的效能問
題進行診斷。這對於你瞭解當前資料庫發生了什麼狀況有很大協助,而且還能夠對此問題給出解決方案。
  以下步驟示範了如何在Oracle 企業管理器 12c上分析資料庫狀態:
  1、在訪問資料庫訪問首頁面從Performance菜單選擇Emergency Monitoring 選項。這會顯示掛起分析表中排名靠前
的阻止會話。
  2、在Performance菜單選擇Real-Time ADDM 選項來執行即時ADDM分析。
  3、在收集了效能資料後,點擊Findings標籤以獲得所有結果的互動總結。

16. 同時在多個表上收集統計資料
  在之前的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‘);



Oracle 資料庫12c 16大新特性總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.