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或日志文件中:
CREATE|ALTER|DROP|TRUNCATE TABLE
DROP USER
CREATE|ALTER|DROP PACKAGE|FUNCTION|VIEW|SYNONYM|SEQUENC
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中的表恢復和分區恢復
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約束時,恢復此表是不可行的
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;