Oracle 12c新特性對于業(yè)務(wù)上的一些影響總結(jié)
1、不可見字段
在Oracle 11g R1中,Oracle以不可見索引和虛擬字段的形式引入了一些不錯的增強(qiáng)特性。繼承前者并發(fā)揚(yáng)光大,Oracle 12c R1中引入了不可見字段思想。在之前的版本中,為了隱藏重要的數(shù)據(jù)字段以避免在通用查詢中顯示,我們往往會創(chuàng)建一個視圖來隱藏所需信息或應(yīng)用某些安全條件。
在12c R1中,你可以在表中創(chuàng)建不可見字段。當(dāng)一個字段定義為不可見時,這一字段就不會出現(xiàn)在通用查詢中,除非在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語句中顯式提及不可見字段名以將不可見字段插入到數(shù)據(jù)庫中。虛擬字段和分區(qū)字段同樣也可以定義為不可見類型。但臨時表,外部表和集群表并不支持不可見字段。
2、 DDL日志
在之前的版本中沒有可選方法來對DDL操作進(jìn)行日志記錄。而在12c R1中,你現(xiàn)在可以將DDL操作寫入xml和日志文件中。這對于了解誰在什么時間執(zhí)行了create或drop命令是十分有用的。要開啟這一功能必須對ENABLE_DDL_LOGGING 初始參數(shù)加以配置。這一參數(shù)可以在數(shù)據(jù)庫或會話級加以設(shè)置。當(dāng)此參數(shù)為啟用狀態(tài),所有的DDL命令會記錄在$ORACLE_BASE/diag/rdbms/DBNAME/log|ddl 路徑下的xml和日志文件中。一個xml中包含DDL命令,IP地址,時間戳等信息。這可以幫助確定在什么時候?qū)τ脩艋虮磉M(jìn)行了刪除亦或是一條DDL語句在何時觸發(fā)。
開啟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中執(zhí)行SQL語句
在12c中,你可以在不需要SQL前綴的情況下在RMAN中執(zhí)行任何SQL和PL/SQL命令,即你可以從RMAN直接執(zhí)行任何SQL和PL/SQL命令。如下便是在RMAN中執(zhí)行SQL語句的示例:
- RMAN> SELECT username,machine FROM v$session;
- RMAN> ALTER TABLESPACE users ADD DATAFILE SIZE 121m;
4、 RMAN中的表恢復(fù)和分區(qū)恢復(fù)
Oracle數(shù)據(jù)庫備份主要分為兩類:邏輯和物理備份。每種備份類型都有其自身的優(yōu)缺點(diǎn)。在之前的版本中,利用現(xiàn)有物理備份來恢復(fù)表或分區(qū)是不可行的。為了恢復(fù)特定對象,邏輯備份是必需的。對于12c R1,你可以在發(fā)生drop或truncate的情況下從RMAN備份將一個特定的表或分區(qū)恢復(fù)到某個時間點(diǎn)或SCN。
當(dāng)通過RMAN發(fā)起一個表或分區(qū)恢復(fù)時,大概流程是這樣的:
-
確定要恢復(fù)表或分區(qū)所需的備份集
-
在恢復(fù)表或分區(qū)的過程中,一個輔助數(shù)據(jù)庫會臨時設(shè)置為某個時間點(diǎn)
-
利用數(shù)據(jù)泵將所需表或分區(qū)導(dǎo)出到一個dumpfile
-
你可以從源數(shù)據(jù)庫導(dǎo)入表或分區(qū)(可選)
-
在恢復(fù)過程中進(jìn)行重命名操作
以下是一個通過RMAN對表進(jìn)行時間點(diǎn)恢復(fù)的示例(確保你已經(jīng)對稍早的數(shù)據(jù)庫進(jìn)行了完整備份):
- 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.(此選項(xiàng)避免自動導(dǎo)入表)
- REMAP TABLE 'username.tablename': 'username.new_table_name'; -- can rename table with this option.(此選項(xiàng)可以對表重命名)
重要提示:
-
確保對于輔助數(shù)據(jù)庫在/u01文件系統(tǒng)下有足夠的可用空間,同時對數(shù)據(jù)泵文件也有同樣保證
-
必須要存在一份完整的數(shù)據(jù)庫備份,或者至少是要有SYSTEM相關(guān)的表空間備份
以下是在RMAN中應(yīng)用表或分區(qū)恢復(fù)的限制和約束:
-
SYS用戶表或分區(qū)無法恢復(fù)
-
存儲于SYSAUX和SYSTEM表空間下的表和分區(qū)無法恢復(fù)
-
當(dāng)REMAP選項(xiàng)用來恢復(fù)的表包含NOT NULL約束時,恢復(fù)此表是不可行的
5、 限制PGA的大小
在Oracle 12c R1之前,沒有選項(xiàng)可以用來限制和控制PGA的大小。雖然你設(shè)置某個大小為PGA_AGGREGATE_TARGET 的初始參數(shù),Oracle會根據(jù)工作負(fù)載和需求來動態(tài)地增大或減小PGA的大小。而在12c中,你可以通過開啟自動PGA管理來對PGA設(shè)定硬性限制,這需要對PGA_AGGREGATE_LIMIT 參數(shù)進(jìn)行設(shè)置。因此,你現(xiàn)在可以通過設(shè)置新的參數(shù)來對PGA設(shè)定硬性限制以避免過度使用PGA。
- SQL> ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=2G;
- SQL> ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=0; --disables the hard limit
重要提示:
當(dāng)超過了當(dāng)前PGA的限制,Oracle會自動終止/中止會話或進(jìn)程以保持最合適的PGA內(nèi)存。
6、 對表分區(qū)維護(hù)的增強(qiáng)
在第一部分中,我解釋了如何在線或是離線狀態(tài)下遷移一個表分區(qū)或子分區(qū)到另一個不同的表空間。在本文中,主要介紹表分區(qū)其他方面的改進(jìn)。
添加多個新分區(qū)
在Oracle 12c R1之前,一次只可能添加一個新分區(qū)到一個已存在的分區(qū)表。要添加一個以上的新分區(qū),需要對每個新分區(qū)都單獨(dú)執(zhí)行一次ALTER TABLE ADD PARTITION語句。而Oracle 12c只需要使用一條單獨(dú)的ALTER TABLE ADD PARTITION 命令就可以添加多個新分區(qū),這增加了數(shù)據(jù)庫靈活性。以下示例說明了如何添加多個新分區(qū)到已存在的分區(qū)表:
- 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)
- );
添加兩個新分區(qū):
- SQL> ALTER TABLE emp_part ADD PARTITION
- PARTITION p4 VALUES LESS THAN (35000),
- PARTITION p5 VALUES LESS THAN (40000);
同樣,只要MAXVALUE分區(qū)不存在,你就可以添加多個新分區(qū)到一個列表和系統(tǒng)分區(qū)表。
如何刪除和截斷多個分區(qū)/子分區(qū)
作為數(shù)據(jù)維護(hù)的一部分,DBA通常會在一個分區(qū)表上進(jìn)行刪除或截斷分區(qū)的維護(hù)任務(wù)。在12c R1之前,對于一個已存在的分區(qū)表一次只可能刪除或截斷一個分區(qū)。而對于Oracle 12c, 可以用單條ALTER TABLE table_name {DROP|TRUNCATE} PARTITIONS 命令來撤銷或合并多個分區(qū)和子分區(qū)。
下例說明了如何在一個已存在分區(qū)表上刪除或截斷多個分區(qū):
- 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 語句的情況下刪除或截斷一個分區(qū),你可以在USER_INDEXES或USER_IND_PARTITIONS 字典視圖下查詢ORPHANED_ENTRIES字段以找出是否有索引包含任何的過期條目。
將單個分區(qū)分割為多個新分區(qū)
在12c中新增強(qiáng)的SPLIT PARTITION 語句可以讓你只使用一個單獨(dú)命令將一個特定分區(qū)或子分區(qū)分割為多個新分區(qū)。下例說明了如何將一個分區(qū)分割為多個新分區(qū):
- 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);
將多個分區(qū)合并為一個分區(qū)
你可以使用單條ALTER TBALE MERGE PARTITIONS 語句將多個分區(qū)合并為一個單獨(dú)分區(qū):
- 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;
如果分區(qū)范圍形成序列,你可以使用如下示例:
- SQL> ALTER TABLE emp_part MERGE PARTITIONS p3 TO p5 INTO PARTITION p_merge;
7、數(shù)據(jù)庫升級改進(jìn)
每當(dāng)一個新的Oracle版本發(fā)布,DBA所要面臨的挑戰(zhàn)就是升級過程。該部分我將介紹12c中引入的針對升級的兩個改進(jìn)。
預(yù)升級腳本
在12c R1中,原有的utlu[121]s.sql 腳本由一個大為改善的預(yù)升級信息腳本preupgrd.sql所取代。除了預(yù)升級檢查驗(yàn)證,此腳本還能以修復(fù)腳本的形式解決在升級過程前后出現(xiàn)的各種問題。
可以對產(chǎn)生的修復(fù)腳本加以執(zhí)行來解決不同級別的問題,例如,預(yù)升級和升級后的問題。當(dāng)手動升級數(shù)據(jù)庫時,腳本必須在實(shí)際升級過程初始化之前加以手動執(zhí)行。然而,當(dāng)使用DBUA工具來進(jìn)行數(shù)據(jù)庫升級時,它會將預(yù)升級腳本作為升級過程的一部分加以自動執(zhí)行,而且會提示你去執(zhí)行修復(fù)腳本以防止報錯。
如何執(zhí)行腳本:
- SQL> @$ORACLE_12GHOME/rdbms/admin/preupgrd.sql
以上腳本會產(chǎn)生一份日志文件以及一個[pre/post]upgrade_fixup.sql 腳本。所有這些文件都位于$ORACLE_BASE/cfgtoollogs 目錄下。在你繼續(xù)真正的升級過程之前,你應(yīng)該瀏覽日志文件中所提到的建議并執(zhí)行腳本以修復(fù)問題。
注意:你要確保將preupgrd.sql和utluppkg.sql 腳本從12c Oracle的目錄home/rdbms/admin directory拷貝至當(dāng)前的Oracle的database/rdbms/admin路徑。
并行升級功能
數(shù)據(jù)庫升級時間的長短取決于數(shù)據(jù)庫上所配置的組件數(shù)量,而不是數(shù)據(jù)庫的大小。在之前的版本中,我們是無法并行運(yùn)行升級程序,從而快速完成整個升級過程的。
在12c R1中,原有的catupgrd.sql 腳本由catctl.pl 腳本(并行升級功能)替代,現(xiàn)在我們可以采用并行模式運(yùn)行升級程序了。
以下流程說明了如何初始化并行升級功能(3個過程);你需要在升級模式下在啟動數(shù)據(jù)庫后運(yùn)行這一腳本:
- cd $ORACLE_12_HOME/perl/bin
- $ ./perl catctl.pl –n 3 -catupgrd.sql
以上兩個步驟需要在手動升級數(shù)據(jù)庫時運(yùn)行。而DBUA也繼承了這兩個新變化。
8、通過網(wǎng)絡(luò)恢復(fù)數(shù)據(jù)文件
在12c R1中另一個重要的增強(qiáng)是,你現(xiàn)在可以在主數(shù)據(jù)庫和備用數(shù)據(jù)庫之間用一個服務(wù)名重新獲得或恢復(fù)數(shù)據(jù)文件、控制文件、參數(shù)文件、表空間或整個數(shù)據(jù)庫。這對于同步主數(shù)據(jù)庫和備用數(shù)據(jù)庫極為有用。
當(dāng)主數(shù)據(jù)庫和備用數(shù)據(jù)庫之間存在相當(dāng)大的差異時,你不再需要復(fù)雜的前滾流程來填補(bǔ)它們之間的差異。RMAN能夠通過網(wǎng)絡(luò)執(zhí)行備用恢復(fù)以進(jìn)行增量備份,并且可以將它們應(yīng)用到物理備用數(shù)據(jù)庫。你可以用服務(wù)名直接將所需數(shù)據(jù)文件從備用點(diǎn)拷貝至主站,這是為了防止主數(shù)據(jù)庫上數(shù)據(jù)文件、表空間的丟失,或是沒有真正從備份集恢復(fù)數(shù)據(jù)文件。
以下流程演示了如何用此新功能執(zhí)行一個前滾來對備用數(shù)據(jù)庫和主數(shù)據(jù)庫進(jìn)行同步:
在物理備用數(shù)據(jù)庫上:
- ./rman target "username/password@standby_db_tns as SYSBACKUP"
- RMAN> RECOVER DATABASE FROM SERVICE primary_db_tns USING COMPRESSED BACKUPSET;
以上示例使用備用數(shù)據(jù)庫上定義的primary_db_tns 連接字符串連接到主數(shù)據(jù)庫,然后執(zhí)行了一個增量備份,再將這些增量備份傳輸至備用目的地,接著將應(yīng)用這些文件到備用數(shù)據(jù)庫來進(jìn)行同步。然而,需要確保已經(jīng)對primary_db_tns 進(jìn)行了配置,即在備份數(shù)據(jù)庫端將其指向主數(shù)據(jù)庫。
在以下示例中,我將演示一個場景通過從備用數(shù)據(jù)庫獲取數(shù)據(jù)文件來恢復(fù)主數(shù)據(jù)庫上丟失的數(shù)據(jù)文件:
在主數(shù)據(jù)庫上:
- ./rman target "username/password@primary_db_tns as SYSBACKUP"
- RMAN> RESTORE DATAFILE ‘+DG_DISKGROUP/DBANME/DATAFILE/filename’ FROM SERVICE standby_db_tns;
#p#
9、 對Data Pump的增強(qiáng)
Data Pump版本有了不少有用的改進(jìn),例如在導(dǎo)出時將視圖轉(zhuǎn)換為表,以及在導(dǎo)入時關(guān)閉日志記錄等。
關(guān)閉redo日志的生成
Data Pump中引入了新的TRANSFORM選項(xiàng),這對于對象在導(dǎo)入期間提供了關(guān)閉重做生成的靈活性。當(dāng)為TRANSFORM選項(xiàng)指定了DISABLE_ARCHIVE_LOGGING 值,那么在整個導(dǎo)入期間,重做生成就會處于關(guān)閉狀態(tài)。這一功能在導(dǎo)入大型表時緩解了壓力,并且減少了過度的redo產(chǎn)生,從而加快了導(dǎo)入。這一屬性還可應(yīng)用到表以及索引。以下示例演示了這一功能:
- $ ./impdp directory=dpump dumpfile=abcd.dmp logfile=abcd.log TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y
將視圖轉(zhuǎn)換為表
這是Data Pump中另外一個改進(jìn)。有了VIEWS_AS_TABLES 選項(xiàng),你就可以將視圖數(shù)據(jù)載入表中。以下示例演示了如何在導(dǎo)出過程中將視圖數(shù)據(jù)載入到表中:
- $ ./expdp directory=dpump dumpfile=abcd.dmp logfile=abcd.log views_as_tables=my_view:my_table
5. 實(shí)時自動數(shù)據(jù)診斷監(jiān)視器 (ADDM) 分析
通過使用諸如AWR、ASH以及ADDM之類的自動診斷工具來分析數(shù)據(jù)庫的健康狀況,是每個DBA日程工作的一部分。盡管每種工具都可以在多個層面衡量數(shù)據(jù)庫的整體健康狀況和性能,但沒有哪個工具可以在數(shù)據(jù)庫反應(yīng)遲鈍或是完全掛起的時候使用。
當(dāng)數(shù)據(jù)庫反應(yīng)遲鈍或是掛起狀態(tài)時,而且你已經(jīng)配置了Oracle 企業(yè)管理器 12c的云控制,你就可以對嚴(yán)重的性能問題進(jìn)行診斷。這對于你了解當(dāng)前數(shù)據(jù)庫發(fā)生了什么狀況有很大幫助,而且還能夠?qū)Υ藛栴}給出解決方案。
以下步驟演示了如何在Oracle 企業(yè)管理器 12c上分析數(shù)據(jù)庫狀態(tài):
-
在訪問數(shù)據(jù)庫訪問主頁面從Performance菜單選擇Emergency Monitoring 選項(xiàng)。這會顯示掛起分析表中排名靠前的阻止會話。
-
在Performance菜單選擇Real-Time ADDM 選項(xiàng)來執(zhí)行實(shí)時ADDM分析。
-
在收集了性能數(shù)據(jù)后,點(diǎn)擊Findings標(biāo)簽以獲得所有結(jié)果的交互總結(jié)。
10、 同時在多個表上收集統(tǒng)計數(shù)據(jù)
在之前的Oracle數(shù)據(jù)庫版本中,當(dāng)你執(zhí)行一個DBMS_STATS 程序來收集表、索引、模式或者數(shù)據(jù)庫級別的統(tǒng)計數(shù)據(jù)時,Oracle習(xí)慣于一次一個表的收集統(tǒng)計數(shù)據(jù)。如果表很大,那么推薦你采用并行方式。在12c R1中,你現(xiàn)在可以同時在多個表、分區(qū)以及子分區(qū)上收集統(tǒng)計數(shù)據(jù)。在你開始使用它之前,你必須對數(shù)據(jù)庫進(jìn)行以下設(shè)置以開啟此功能:
- 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');
11、 自動存儲管理(ASM)中的增強(qiáng)
Flex ASM
在一個典型的網(wǎng)格基礎(chǔ)架構(gòu)安裝環(huán)境中,每個節(jié)點(diǎn)都運(yùn)行自身的ASM實(shí)例,并將其作為運(yùn)行于此節(jié)點(diǎn)上數(shù)據(jù)庫的存儲容器。但這種設(shè)置會存在相應(yīng)的單點(diǎn)故障危險。例如,如果此節(jié)點(diǎn)上的ASM實(shí)例發(fā)生故障,則運(yùn)行于此節(jié)點(diǎn)上的所有數(shù)據(jù)庫和實(shí)例都會受到影響。為了避免ASM實(shí)例的單點(diǎn)故障,Oracle 12c提供了一個名為Flex ASM的功能。Flex ASM是一個不同的概念和架構(gòu),只有很少數(shù)量的ASM實(shí)例需要運(yùn)行在集群中的一些服務(wù)器上。當(dāng)某節(jié)點(diǎn)上的一個ASM實(shí)例發(fā)生故障,Oracle集群就會在另一個不同的節(jié)點(diǎn)上自動啟動替代ASM實(shí)例以加強(qiáng)可用性。另外,這一設(shè)置還為運(yùn)行在此節(jié)點(diǎn)上的實(shí)例提供了ASM實(shí)例負(fù)載均衡能力。Flex ASM的另一個優(yōu)勢就是可以在單獨(dú)節(jié)點(diǎn)上加以配置。
當(dāng)選擇Flex Cluster選項(xiàng)作為集群安裝環(huán)境的第一部分時,鑒于Flex Cluster的要求,F(xiàn)lex ASM配置就會被自動選擇。傳統(tǒng)集群同樣也適用于Flex ASM。當(dāng)你決定使用Flex ASM時,你必須保證所需的網(wǎng)絡(luò)是可用的。你可以選擇Flex ASM存儲選項(xiàng)作為集群安裝環(huán)境的一部分,或是使用ASMCA在一個標(biāo)準(zhǔn)集群環(huán)境下啟用Flex ASM。
以下命令顯示了當(dāng)前的ASM模式:
- $ ./asmcmd showclustermode
- $ ./srvctl config asm
或是連接到ASM實(shí)例并查詢INSTANCE_TYPE參數(shù)。如果輸出值為ASMPROX,那么,就說明Flex ASM已經(jīng)配置好了。
ASM存儲限制放寬
ASM存儲硬性限額在最大ASM磁盤群組和磁盤大小上已經(jīng)大幅提升。在 12c R1中,ASM支持511個ASM磁盤群組,而在11g R2中只支持63個。同樣,相比起在11g R2中20 PB的磁盤大小,現(xiàn)在已經(jīng)將這一數(shù)字提高到32 PB。
對ASM均衡操作的優(yōu)化
12c 中新的EXPLAIN WORK FOR 語句用于衡量一個給定ASM均衡操作所需的工作量,并在V$ASM_ESTIMATE動態(tài)視圖中輸入結(jié)果。使用此動態(tài)視圖,你可以調(diào)整POWERLIMIT語句對重新平衡操作工作進(jìn)行改善。例如,如果你想衡量添加一個新ASM磁盤所需的工作量,在實(shí)際執(zhí)行手動均衡操作之前,你可以使用以下命令:
- 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’;
你可以根據(jù)從動態(tài)視圖中獲取的輸出來調(diào)整POWER的限制以改善均衡操作。
ASM 磁盤清理
在一個ASM磁盤群組中,新的ASM磁盤清理操作分為正?;蚋呷哂鄡蓚€級別,它可以檢驗(yàn)ASM磁盤群組中所有磁盤的邏輯數(shù)據(jù)破壞,并且可以自動對邏輯破壞進(jìn)行修復(fù),如果檢測到有邏輯數(shù)據(jù)破壞,就會使用ASM鏡像磁盤。磁盤清理可以在磁盤群組,特定磁盤或是某個文件上執(zhí)行,這樣其影響可降到最小程度。以下演示了磁盤清理場景:
- 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 動態(tài)視圖現(xiàn)在還可以提供ASM實(shí)例的活動會話抽樣。然而,診斷包的使用是受到許可限制的。
12、 網(wǎng)格(Grid)基礎(chǔ)架構(gòu)的增強(qiáng)
Flex 集群
Oracle 12c 在集群安裝時支持兩類配置:傳統(tǒng)標(biāo)準(zhǔn)集群和Flex集群。在一個傳統(tǒng)標(biāo)準(zhǔn)集群中,所有集群中的節(jié)點(diǎn)都彼此緊密地整合在一起,并通過私有網(wǎng)絡(luò)進(jìn)行互動,而且可以直接訪問存儲。另一方面,F(xiàn)lex集群在Hub和Leaf節(jié)點(diǎn)結(jié)構(gòu)間引入了兩類節(jié)點(diǎn)。分配在Hub中的節(jié)點(diǎn)類似于傳統(tǒng)標(biāo)準(zhǔn)集群,它們通過私有網(wǎng)絡(luò)彼此互連在一起并對存儲可以進(jìn)行直接讀寫訪問。而Leaf節(jié)點(diǎn)不同于Hub節(jié)點(diǎn),它們不需要直接訪問底層存儲;相反的是,它們通過Hub節(jié)點(diǎn)對存儲和數(shù)據(jù)進(jìn)行訪問。
你可以配置多達(dá)64個Hub節(jié)點(diǎn),而Leaf節(jié)點(diǎn)則可以更多。在Oracle Flex集群中,無需配置Leaf節(jié)點(diǎn)就可以擁有Hub節(jié)點(diǎn),而如果沒有Hub節(jié)點(diǎn)的話,Leaf節(jié)點(diǎn)是不會存在的。對于一個單獨(dú)Hub節(jié)點(diǎn),你可以配置多個Leaf節(jié)點(diǎn)。在Oracle Flex集群中,只有Hub節(jié)點(diǎn)會直接訪問OCR和Voting磁盤。當(dāng)你規(guī)劃大規(guī)模的集群環(huán)境時,這將是一個非常不錯的功能。這一系列設(shè)置會大大降低互連擁堵,并為傳統(tǒng)標(biāo)準(zhǔn)集群提供空間以擴(kuò)大集群。
部署Flex集群的兩種途徑:
1. 在配置一個全新集群的時候部署
2. 升級一個標(biāo)準(zhǔn)集群模式到Flex集群
如果你正在配置一個全新的集群,你需要在步驟3中選擇集群配置的類型,選擇配置一個Flex集群選項(xiàng),然后你需要在步驟6中對Hub和Leaf節(jié)點(diǎn)進(jìn)行分類。對于每個節(jié)點(diǎn),選擇相應(yīng)角色是Hub或是Leaf,而虛擬主機(jī)名也是可選的。
將一個標(biāo)準(zhǔn)集群模式轉(zhuǎn)換為Flex 集群模式需要以下步驟:
1. 用以下命令獲取集群的當(dāng)前狀態(tài):
$ ./crsctl get cluster mode status |
2. 以root用戶執(zhí)行以下命令:
$ ./crsctl set cluster mode flex |
3. 根據(jù)設(shè)計改變節(jié)點(diǎn)角色:
$ ./crsctl get node role config |
注意:
· 你無法從Flex恢復(fù)回標(biāo)準(zhǔn)集群模式
· 改變集群節(jié)點(diǎn)模式需要集群棧停止
· 確保以一個固定的VIP配置GNS
ASM磁盤群組中的OCR備份
對于12c,OCR現(xiàn)在可以在ASM磁盤群組中得以備份。這簡化了通過所有節(jié)點(diǎn)對OCR備份文件的訪問。為了防止OCR的恢復(fù),你不必?fù)?dān)心OCR最新的備份是在哪個節(jié)點(diǎn)上??梢詮娜魏喂?jié)點(diǎn)輕易識別存儲在ASM中的最新備份并能很容易地執(zhí)行恢復(fù)。
以下演示了如何將ASM磁盤群組設(shè)置為OCR備份位置:
$ ./ocrconfig -backuploc +DG_OCR |
支持IPv6協(xié)議
對于12c,Oracle是支持IPv6網(wǎng)絡(luò)協(xié)議配置的。你現(xiàn)在可以在IPv4或IPv6上配置共有或私有網(wǎng)絡(luò)接口,盡管如此,你需要確保在所有集群中的節(jié)點(diǎn)上使用相同的IP協(xié)議。
13、 RAC數(shù)據(jù)庫的增強(qiáng)
What-if命令評估
通過srvctl使用新的What-if命令評估選項(xiàng),現(xiàn)在可以確定運(yùn)行此命令所造成的影響。這一新添加到srvctl的命令,可以在沒有實(shí)際執(zhí)行或是不對當(dāng)前系統(tǒng)做任何改變的情況下模擬此命令。這在想要對一個已存在的系統(tǒng)進(jìn)行更改卻對結(jié)果不確定的時候特別有用。這樣,此命令就會提供進(jìn)行變更的效果。而–eval 選項(xiàng)也可以通過crsctl 命令來使用。
例如,如果你想要知道停止一個特定數(shù)據(jù)庫會發(fā)生什么,那么你就可以使用以下示例:
$ ./srvctl stop database –d MYDB –eval |
srvctl的改進(jìn)
對于srvctl命令還有一些新增功能。以下演示了如何用這些新增功能停止或啟動集群上的數(shù)據(jù)庫或?qū)嵗Y源。
srvctl start database|instance –startoption NOMOUNT|MOUNT|OPEN |
13、截斷表CASCADE
在之前的版本中,在子表引用一個主表以及子表存在記錄的情況下,是不提供截斷此主表操作的。而在12c中的帶有CASCADE操作的TRUNCATE TABLE可以截斷主表中的記錄,并自動對子表進(jìn)行遞歸截斷,并作為DELETE ON CASCADE服從外鍵引用。由于這是應(yīng)用到所有子表的,所以對遞歸層級的數(shù)量是沒有CAP的,可以是孫子表或是重孫子表等等。
這一增強(qiáng)擯棄了要在截斷一個主表之前先截斷所有子表記錄的前提。新的CASCADE語句同樣也可以應(yīng)用到表分區(qū)和子表分區(qū)等。
SQL> TRUNCATE TABLE CASCADE; |
如果對于子表的外鍵沒有定義ON DELETE CASCADE 選項(xiàng),便會拋出一個ORA-14705錯誤。
14、對Top-N查詢結(jié)果限制記錄
在之前的版本中有多種間接手段來對頂部或底部記錄獲取Top-N查詢結(jié)果。而在12c中,通過新的FETCH FIRST|NEXT|PERCENT語句簡化了這一過程并使其變得更為直接。為了從EMP表檢索排名前10的工資記錄,可以用以下新的SQL語句:
SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC |
以下示例獲取排名前N的所有相似的記錄。例如,如果第十行的工資值是5000,并且還有其他員工的工資符合排名前N的標(biāo)準(zhǔn),那么它們也同樣會由WITH TIES語句獲取。
SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC |
以下示例限制從EMP表中獲取排名前10%的記錄:
SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC |
以下示例忽略前5條記錄并會顯示表的下5條記錄:
SQL> SELECT eno,ename,sal FROM emp ORDER BY SAL DESC |
所有這些限制同樣可以很好的應(yīng)用于PL/SQL塊。
- BEGIN
- SELECT sal BULK COLLECT INTO sal_v FROM EMP
- FETCH FIRST 100 ROWS ONLY;
- END;
15、對SQL*Plus的各種增強(qiáng)
SQL*Plus的隱式結(jié)果:12c中,在沒有實(shí)際綁定某個RefCursor的情況下,SQL*Plus從一個PL/SQL塊的一個隱式游標(biāo)返回結(jié)果。這一新的dbms_sql.return_result過程將會對PL/SQL 塊中由SELECT 語句查詢所指定的結(jié)果加以返回并進(jìn)行格式化。以下代碼對此用法進(jìn)行了描述:
- 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;
當(dāng)此過程得以執(zhí)行,會在SQL*Plus上返回格式化的記錄。
顯示不可見字段:在本系列文章的第一部分,我已經(jīng)對不可見字段的新特性做了相關(guān)闡述。當(dāng)字段定義為不可見時,在描述表結(jié)構(gòu)時它們將不會顯示。然而,你可以通過在SQL*Plus提示符下進(jìn)行以下設(shè)置來顯示不可見字段的相關(guān)信息:
SQL> SET COLINVISIBLE ON|OFF |
以上設(shè)置僅對DESCRIBE 命令有效。目前它還無法對不可見字段上的SELECT 語句結(jié)果產(chǎn)生效果。
16、會話級序列
在12c中現(xiàn)在可以創(chuàng)建新的會話級數(shù)據(jù)庫序列來支持會話級序列值。這些序列的類型在有會話級的全局臨時表上最為適用。
會話級序列會產(chǎn)生一個獨(dú)特范圍的值,這些值是限制在此會話內(nèi)的,而非超越此會話。一旦會話終止,會話序列的狀態(tài)也會消失。以下示例解釋了創(chuàng)建一個會話級序列:
- SQL> CREATE SEQUENCE my_seq START WITH 1 INCREMENT BY 1 SESSION;
- SQL> ALTER SEQUENCE my_seq GLOBAL|SESSION;
對于會話級序列,CACHE, NOCACHE, ORDER 或 NOORDER 語句會予以忽略。
17、WITH語句的改善
在12c中,你可以用SQL更快的運(yùn)行PL/SQL函數(shù)或過程,這些是由SQL語句的WITH語句加以定義和聲明的。以下示例演示了如何在WITH語句中定義和聲明一個過程或函數(shù):
- WITH
- PROCEDURE|FUNCTION test1 (…)
- BEGIN
- END;
- SELECT FROM table_name;
- /
盡管你不能在PL/SQL單元直接使用WITH語句,但其可以在PL/SQL單元中通過一個動態(tài)SQL加以引用。
18、擴(kuò)展數(shù)據(jù)類型
在12c中,與早期版本相比,諸如VARCHAR2, NAVARCHAR2以及 RAW這些數(shù)據(jù)類型的大小會從4K以及2K字節(jié)擴(kuò)展至32K字節(jié)。只要可能,擴(kuò)展字符的大小會降低對LOB數(shù)據(jù)類型的使用。為了啟用擴(kuò)展字符大小,你必須將MAX_STRING_SIZE的初始數(shù)據(jù)庫參數(shù)設(shè)置為EXTENDED。
要使用擴(kuò)展字符類型需要執(zhí)行以下過程:
1. 關(guān)閉數(shù)據(jù)庫
2. 以升級模式重啟數(shù)據(jù)庫
3. 更改參數(shù): ALTERSYSTEM SET MAX_STRING_SIZE=EXTENDED;
4. 執(zhí)行 utl32k.sql as sysdba: SQL> @?/rdbms/admin/utl32k.sql
5. 關(guān)閉數(shù)據(jù)庫
6. 以讀寫模式重啟數(shù)據(jù)庫
對比LOB數(shù)據(jù)類型,在ASSM表空間管理中,擴(kuò)展數(shù)據(jù)類型的字段以SecureFiles LOB加以存儲,而在非ASSM表空間管理中,它們則是以BasciFiles LOB進(jìn)行存儲的。
注意:一旦更改,你就不能再將設(shè)置改回STANDARD。
19、 在線重命名和重新定位活躍數(shù)據(jù)文件
不同于以往的版本,在Oracle數(shù)據(jù)庫12c R1版本中對數(shù)據(jù)文件的遷移或重命名不再需要太多繁瑣的步驟,即把表空間置為只讀模式,接下來是對數(shù)據(jù)文件進(jìn)行離線操作。在12c R1中,可以使用ALTER DATABASE MOVE DATAFILE這樣的SQL語句對數(shù)據(jù)文件進(jìn)行在線重命名和移動。而當(dāng)此數(shù)據(jù)文件正在傳輸時,終端用戶可以執(zhí)行查詢,DML以及DDL方面的任務(wù)。另外,數(shù)據(jù)文件可以在存儲設(shè)備間遷移,如從非ASM遷移至ASM,反之亦然。
重命名數(shù)據(jù)文件:
SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users01.dbf' TO '/u00/data/users_01.dbf'; |
從非ASM遷移數(shù)據(jù)文件至ASM:
SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '+DG_DATA'; |
將數(shù)據(jù)文件從一個ASM磁盤群組遷移至另一個ASM磁盤群組:
SQL> ALTER DATABASE MOVE DATAFILE '+DG_DATA/DBNAME/DATAFILE/users_01.dbf ' TO '+DG_DATA_02'; |
在數(shù)據(jù)文件已存在于新路徑的情況下,以相同的命名將其覆蓋:
SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '/u00/data_new/users_01.dbf' REUSE; |
復(fù)制文件到一個新路徑,同時在原路徑下保留其拷貝:
SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '/u00/data_new/users_01.dbf' KEEP; |
當(dāng)通過查詢v$session_longops動態(tài)視圖來移動文件時,你可以監(jiān)控這一過程。另外,你也可以引用alert.log,Oracle會在其中記錄具體的行為。
20、 表分區(qū)或子分區(qū)的在線遷移
在Oracle 12c R1中遷移表分區(qū)或子分區(qū)到不同的表空間不再需要復(fù)雜的過程。與之前版本中未分區(qū)表進(jìn)行在線遷移類似,表分區(qū)或子分區(qū)可以在線或是離線遷移至一個不同的表空間。當(dāng)指定了ONLINE語句,所有的DML操作可以在沒有任何中斷的情況下,在參與這一過程的分區(qū)或子分區(qū)上執(zhí)行。與此相反,分區(qū)或子分區(qū)遷移如果是在離線情況下進(jìn)行的,DML操作是不被允許的。
示例:
SQL> ALTER TABLE table_name MOVE PARTITION|SUBPARTITION partition_name TO tablespace tablespace_name; |
第一個示例是用來在離線狀況下將一個表分區(qū)或子分區(qū)遷移至一個新的表空間。第二個示例是在線遷移表分區(qū)或子分區(qū)并維護(hù)表上任何本地或全局的索引。此外,當(dāng)使用ONLINE語句時,DML操作是不會中斷的。
重要提示:
-
UPDATE INDEXES語句可以避免出現(xiàn)表中任何本地或全局索引無法使用的情況。
-
表的在線遷移限制也適用于此。
-
引入加鎖機(jī)制來完成這一過程,當(dāng)然它也會導(dǎo)致性能下降并會產(chǎn)生大量的redo,這取決于分區(qū)和子分區(qū)的大小。