Oracle 12c新特性對於業務上的一些影響總結(1)
1、不可見欄位
在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語句中顯式提及不可見欄位名以將不可見欄位插入到資料庫中。虛擬欄位和分區欄位同樣也可以定義為不可見類型。但暫存資料表,外部表格和叢集表並不支援不可見欄位。
2、 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或記錄檔中:
3、如何在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;
4、 RMAN中的表恢複和分區恢複
OracleDatabase Backup主要分為兩類:邏輯和物理備份。每種備份類型都有其自身的優缺點。在之前的版本中,利用現有物理備份來恢複表或分區是不可行的。為了恢複特定對象,邏輯備份是必需的。對於12c R1,你可以在發生drop或truncate的情況下從RMAN備份將一個特定的表或分區恢複到某個時間點或SCN。
當通過RMAN發起一個表或分區恢複時,大概流程是這樣的:
以下是一個通過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.(此選項可以對錶重新命名)
重要提示:
以下是在RMAN中應用表或分區恢複的限制和約束:
5、 限制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記憶體。
6、 對錶分區維護的增強
在第一部分中,我解釋了如何線上或是離線狀態下遷移一個表分區或子分區到另一個不同的資料表空間。在本文中,主要介紹表分區其他方面的改進。
添加多個新分區
在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;
7、資料庫升級改進
每當一個新的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也繼承了這兩個新變化。
8、通過網路恢複資料檔案
在12c R1中另一個重要的增強是,你現在可以在主要資料庫和備用資料庫之間用一個服務名重新獲得或恢複資料檔案、控制檔案、參數檔案、資料表空間或整個資料庫。這對於同步主要資料庫和備用資料庫極為有用。
當主要資料庫和備用資料庫之間存在相當大的差異時,你不再需要複雜的前滾流程來填補它們之間的差異。RMAN能夠通過網路執行備用恢複以進行增量備份,並且可以將它們應用到物理備用資料庫。你可以用服務名直接將所需資料檔案從備用點拷貝至主站,這是為了防止主要資料庫上資料檔案、資料表空間的丟失,或是沒有真正從備份組恢複資料檔案。
以下流程示範了如何用此新功能執行一個前滾來對備用資料庫和主要資料庫進行同步:
在物理備用資料庫上:
- ./rman target "username/password@standby_db_tns as SYSBACKUP"
- RMAN> RECOVER DATABASE FROM SERVICE primary_db_tns USING COMPRESSED BACKUPSET;
以上樣本使用備用資料庫上定義的primary_db_tns 連接字串串連到主要資料庫,然後執行了一個增量備份,再將這些增量備份傳輸至備用目的地,接著將應用這些檔案到備用資料庫來進行同步。然而,需要確保已經對primary_db_tns 進行了配置,即在備份資料庫端將其指向主要資料庫。
在以下樣本中,我將示範一個情境通過從備用資料庫擷取資料檔案來恢複主要資料庫上丟失的資料檔案:
在主要資料庫上:
- ./rman target "username/password@primary_db_tns as SYSBACKUP"
- RMAN> RESTORE DATAFILE ‘+DG_DISKGROUP/DBANME/DATAFILE/filename’ FROM SERVICE standby_db_tns;