Oracle 11g 新特性简介
Oracle 11g于2007年7月11日美國東部時間11時(北京時間11日22時)正式發布,11g是甲骨文公司30年來發布的最重要的數據庫版本,根據用戶的需求實現了信息生命周期管理(Information Lifecycle Management)等多項創新。?
?
一.新特性提綱
?
1.數據庫管理部分
◆數據庫重演(Database Replay)?
這一特性可以捕捉整個數據的負載,并且傳遞到一個從備份或者standby數據庫中創建的測試數據庫上,然后重演負責以測試系統調優后的效果。
◆SQL重演(SQL Replay)?
和前一特性類似。但是只是捕捉SQL負載部分,而不是全部負載。
◆計劃管理(Plan Management)?
這一特性允許你將某一特定語句的查詢計劃固定下來,無論統計數據變化還是數據庫版本變化都不會改變她的查詢計劃。
◆自動診斷知識庫(Automatic Diagnostic Repository ADR)?
當Oracle探測到重要錯誤時,會自動創紀一個事件(incident),并且捕捉到和這一事件相關的信息,同時自動進行數據庫健康檢查并通知DBA。此外,這些信息還可以打包發送給Oracle支持團隊。
◆事件打包服務(Incident Packaging Service)?
如果你需要進一步測試或者保留相關信息,這一特性可以將與某一事件相關的信息打包。并且你還可以將打包信息發給oracle支持團隊。
◆基于特性打補丁(Feature Based Patching)?
在打補丁包時,這一特性可以使你很容易區分出補丁包中的那些特性是你正在使用而必須打的。企業管理器(EM)使你能訂閱一個基于特性的補丁服務,因此企業管理器可以自動掃描那些你正在使用的特性有補丁可以打。
◆自動SQL優化(Auto SQL Tuning)?
10g的自動優化建議器可以將優化建議寫在SQL profile中。而在11g中,你可以讓oracle自動將能3倍于原有性能的profile應用到SQL語句上。性能比較由維護窗口中一個新管理任務來完成。
◆訪問建議器(Access Advisor)?
11g的訪問建議器可以給出分區建議,包括對新的間隔分區(interval partitioning)的建議。間隔分區相當于范圍分區(range partitioning)的自動化版本,她可以在必要時自動創建一個相同大小的分區。范圍分區和間隔分區可以同時存在于一張表中,并且范圍分區可以轉換為間隔分區。
◆自動內存優化(Auto Memory Tuning)?
在9i中,引入了自動PGA優化;10g中,又引入了自動SGA優化。到了11g,所有內存可以通過只設定一個參數來實現全表自動優化。你只要告訴oracle有多少內存可用,她就可以自動指定多少內存分配給PGA、多少內存分配給SGA和多少內存分配給操作系統進程。當然也可以設定最大、最小閾值。
◆資源管理器(Resource Manager)?
11g的資源管理器不僅可以管理CPU,還可以管理IO。你可以設置特定文件的優先級、文件類型和ASM磁盤組。
◆ADDM?
ADDM在10g被引入。11g中,ADDM不僅可以給單個實例建議,還可以對整個RAC(即數據庫級別)給出建議。另外,還可以將一些指示(directive)加入ADDM,使之忽略一些你不關心的信息。
◆AWR?基線(AWR Baselines)?
AWR基線得到了擴展。可以為一些其他使用到的特性自動創建基線。默認會創建周基線。
?
2.PLSQL部分
◆結果集緩存(Result Set Caching)?
這一特性能大大提高很多程序的性能。在一些MIS系統或者OLAP系統中,需要使用到很多"select count(*)"這樣的查詢。在之前,我們如果要提高這樣的查詢的性能,可能需要使用物化視圖或者查詢重寫的技術。在11g,我們就只需要加一個/*+result_cache*/的提示就可以將結果集緩存住,這樣就能大大提高查詢性能。當然,在這種情況下,我們可能還要關心另外一個問題:完整性。因為在oracle中是通過一致性讀來保證數據的完整性的。而顯然,在這種新特性下,為提高性能,是從緩存中的結果集中讀取數據,而不會從回滾段中讀取數據的。關于這個問題,答案是完全能保證完整性。因為結果集是被獨立緩存的,在查詢期間,任何其他DML語句都不會影響結果集中的內容,因而可以保證數據的完整性。
◆對象依賴性改進?
在11g之前,如果有函數或者視圖依賴于某張表,一旦這張表發生結構變化,無論是否涉及到函數或視圖所依賴的屬性,都會使函數或視圖變為invalid。在11g中,對這種情況進行了調整:如果表改變的屬性與相關的函數或視圖無關,則相關對象狀態不會發生變化。
◆正則表達式的改進?
在10g中,引入了正則表達式。這一特性大大方便了開發人員。11g,oracle再次對這一特性進行了改進。其中,增加了一個名為regexp_count的函數。另外,其他的正則表達式函數也得到了改進。
◆新SQL語法?=>?
我們在調用某一函數時,可以通過=>來為特定的函數參數指定數據。而在11g中,這一語法也同樣可以出現在sql語句中了。例如,你可以寫這樣的語句:
| select f(x=>6) from dual; |
◆對TCP包(utl_tcp、utl_smtp…)支持FGAC(Fine Grained Access Control)安全控制
◆增加了只讀表(read-only table)?
在以前,我們是通過觸發器或者約束來實現對表的只讀控制。11g中不需要這么麻煩了,可以直接指定表為只讀表。
◆觸發器執行效率提高了
?
內部單元內聯(Intra-Unit inlining)
在C語言中,你可以通過內聯函數(inline)或者宏實現使某些小的、被頻繁調用的函數內聯,編譯后,調用內聯函數的部分會編譯成內聯函數的函數體,因而提高函數效率。在11g的plsql中,也同樣可以實現這樣的內聯函數了。
◆設置觸發器順序?
可能在一張表上存在多個觸發器。在11g中,你可以指定它們的觸發順序,而不必擔心順序混亂導致數據混亂。
◆混合觸發器(compound trigger)?
這是11g中新出現的一種觸發器。她可以讓你在同一觸發器中同時具有申明部分、before過程部分、after each row過程部分和after過程部分。
◆創建無效觸發器(Disabled Trigger)?
11g中,開發人員可以可以閑創建一個invalid觸發器,需要時再編譯她。
◆在非DML語句中使用序列(sequence)?
在之前版本,如果要將sequence的值賦給變量,需要通過類似以下語句實現:
| select seq_x.next_val into v_x from dual; |
在11g中,不需要這么麻煩了,下面語句就可以實現:
| v_x := seq_x.next_val; |
◆PLSQL_Warning?
11g中,可以通過設置PLSQL_Warning=enable all,如果在"when others"沒有錯誤爆出就發警告信息。
◆PLSQL的可繼承性?
可以在oracle對象類型中通過super(和java中類似)關鍵字來實現繼承性。
◆編譯速度提高?
因為不在使用外部C編譯器了,因此編譯速度提高了。
◆改進了DBMS_SQL包?
其中的改進之一就是DBMS_SQL可以接收大于32k的CLOB了。另外還能支持用戶自定義類型和bulk操作。
◆增加了continue關鍵字?
在PLSQL的循環語句中可以使用continue關鍵字了(功能和其他高級語言中的continue關鍵字相同)。
◆新的PLSQL數據類型——simple_integer?
這是一個比pls_integer效率更高的整數數據類型。
?
3.其他部分
◆增強的壓縮技術?
可以最多壓縮2/3的空間。
◆高速推進技術?
可以大大提高對文件系統的數據讀取速度。
◆增強了DATA Guard?
可以創建standby數據庫的快照,用于測試。結合數據庫重演技術,可以實現模擬生成系統負載的壓力測試。
◆在線應用升級?
也就是熱補丁——安裝升級或打補丁不需要重啟數據庫。
◆數據庫修復建議器?
可以在錯誤診斷和解決方案實施過程中指導DBA。
◆邏輯對象分區?
可以對邏輯對象進行分區,并且可以自動創建分區以方便管理超大數據庫(Very Large Databases VLDBs)。
◆新的高性能的LOB基礎結構
◆新的PHP驅動
?
?
二.?詳細介紹
1.?分區
Partition(分區)一直是Oracle數據庫引以為傲的一項技術,正是分區的存在讓Oracle高效的處理海量數據成為可能,在Oracle 11g中,分區技術在易用性和可擴展性上再次得到了增強。?
1.1. Interval Partitioning?
????在我曾經的一個項目中,由于數據量的巨大,所以表設計為每一個小時一個分區,數據庫管理員日常要做的一件重復而無聊的工作就是每隔一天要生成新的24個分區,用以存儲第二天的數據。而在11g中這項工作可以交由Oracle自動完成了,基于Range和List的Interval Partitioning分區類型登場。?
CREATE TABLE TB_INTERVAL?
PARTITION BY RANGE (time_col)?
INTERVAL(NUMTOYMINTERVAL(1, 'month'))?
(PARTITION P0 VALUES LESS THAN (TO_DATE('1-1-2010', 'dd-mm-yyyy')));?
????指定需要Oracle自動創建分區的間隔時間,上面這個例子是1個月,然后至少創建一個基本分區,上面這個例子是在2010-1-1之前的所有數據都在P0分區中,以后每個月的數據都會存放在Oracle自動創建的一個新分區中。?
1.2. System Partitioning?
????系統分區,在這個新的類型中,我們不需要指定任何分區鍵,數據會進入哪個分區完全由應用程序決定,實際上也就是由SQL來決定,終于,我們在Insert語句中可以指定插入哪個分區了。?
????假設我們創建了下面這張分區表,注意,沒有指定任何分區鍵:?
CREATE TABLE systab (c1 integer, c2 integer)?
PARTITION BY SYSTEM?
(?
PARTITION p1 TABLESPACE tbs_1,?
PARTITION p2 TABLESPACE tbs_2,?
PARTITION p3 TABLESPACE tbs_3,?
PARTITION p4 TABLESPACE tbs_4?
);?
????現在由SQL語句來指定插入哪個分區:?
--?數據插入p1分區?
INSERT INTO systab PARTITION (p1) VALUES (4,5);?
--?數據插入第2個分區,也就是p2分區?
INSERT INTO systab PARTITION (2) VALUES (7,8);?
--?為了實現綁定變量,用pno變量來代替實際分區號,以避免過度解析?
INSERT INTO systab PARTITION (:pno) VALUES (9,10);?
由于System Partitioning的特殊性,所以很明顯,這種類型的分區將不支持Partition Split操作,也不支持create table as select操作。
?
1.3. More Composite Partitioning?
????在10g中,我們知道復合分區只支持Range-List和Range-Hash,而在在11g中復合分區的類型大大增加,現在Range,List,Interval都可以作為Top level分區,而Second level則可以是Range,List,Hash,也就是在11g中可以有3*3=9種復合分區,滿足更多的業務需求。?
1.4. Virtual Column-Based Partitioning?
??? Virtual Column是11g中的一個新功能,這種列中的數據并不實際存儲于磁盤上(我們可以看成是一個類似Function的列),只有當讀取的時候才實時計算。暫時不討論性能問題,這個功能還是比較有意思的。?
可以通過這樣的語句來創建虛擬列。?
CREATE TABLE tb_v?
(col_1 number(6) not null,?
col_2 number not null,?
…?
col_v as (col_1 *( 1+col_2));?
????虛擬列雖然沒有實際的存儲空間,但是卻可以跟其他普通列一樣,創建索引,作為分區鍵,甚至可以收集統計信息。
?
2.?數據壓縮技術
隨著數據量的不斷海量,CPU的不斷強勁,雙核四核的叫個不停,一種叫做時間換空間的優化技術應該會越來越流行。所以,數據壓縮對于今后的數據庫來說,應該會從核武器變成常規武器。
??? Oracle11g是正兒八經的要推廣數據壓縮技術了,專門推出了一個叫做Advance Compression的組件,全面支持普通表壓縮,非結構化數據壓縮(SecureFile數據壓縮),Data Pump數據壓縮,以及RMAN備份壓縮,數據壓縮技術從此名正言順的登上歷史舞臺。
????在Oracle9i中雖然引入了表壓縮,但是有很大的限制。只能對批量裝載操作(比如直接路徑裝載,CTAS等)涉及的數據進行壓縮,普通的DML操作的數據是無法壓縮的。這應該是對于寫操作的壓縮難題沒有解決,一直遺留到Oracle11g,總算是解決了關系數據壓縮的寫性能問題。Oracle的表壓縮是針對Block級別的數據壓縮,主要技術和Oracle9i差不多,還是在Block中引入symbol表,將block中的重復數據在symbol中用一個項表示。Oracle會對block進行批量壓縮,而不是每次在block中寫入數據時都進行壓縮,通過這種方式,可以盡量降低數據壓縮對于DML操作的性能影響。這樣,在block級別應該會引入一個新的參數,用于控制block中未壓縮的數據量達到某個標準以后進行壓縮操作。?
????SecureFile也是Oracle11g新推出的一項特性,用于存儲非結構化數據。SecureFile也將支持數據壓縮操作。這樣對于傳統的LOB字段也可以進行壓縮,將極大的減少大型數據庫的存儲空間需求。當然,有得比有失,壓縮和解壓時,對于CPU的要求也將更高。但是,目前CPU的發展速度明顯比IO和存儲空間快速的情況下,壓縮是大有可為的技術。通過在壓縮率和壓縮效率方面的不斷提升,以后應該為成為各個數據庫的標準配置。
除了對數據庫中的數據進行壓縮,Advance Compression Option還將支持備份數據的壓縮。做為邏輯備份的Data Pump和物理備份的RMAN工具,都將支持該技術。在Oracle10gR2中,Data Pump已經開始支持壓縮源數據,Oracle11g中則可以直接壓縮導出文件,這樣導出的時候就可以極大的減少存儲空間的需求。在以前版本中,利用WinRAR等,經常可以將幾個G的導出文件壓縮到幾十M,Oracle11g的白皮書上說壓縮率可以達到74.67%。同樣的,Oracle也在10g中開始引入RMAN的壓縮技術。但是Oracle11g號稱采用了更先進的ZLIB要所算法,可以比Oracle10g的壓縮算法快上40%,空間需求也將減少20%。?
????除了上述的數據壓縮技術,Oracle 11g Advanced Compression Option還將引入另外一種壓縮技術。我們知道在Data Guard中,需要將日志從主庫傳遞到備庫。如果主庫的事務很多,則單位時間內需要傳遞的日志量將相當可觀。如果能將這些日志壓縮后在傳遞,然后在備庫解壓后應用,將極大的減少對于網絡帶寬的需求,從而已減少主備庫的時間差。?
????另外,Oracle的bitmap一直就是壓縮存儲的,10g中的bitmap對于9i就有比較大的改動,通過一些細節的完善,提供更好的性能和更高的穩定性,也是oracle一貫的風格。對于bitmap在Oracle11g中將如何實現,也將是非常值得關注的一個特點。?
????從Oracle11g開始,將沒有什么是不可壓縮的。使用更強大的CPU,就可以降低或者延緩對存儲空間無休止的渴求,或許很多大型OLTP和大多數的數據倉庫,都將從數據壓縮技術中收益。
?
3.統計信息收集
下面圍繞統計信息收集,分別對收集統計信息時可以設置的選項、對合并列收集統計信息,對表達式和函數收集統計信息以及延遲發布統計信息這四個方面做了闡述。?
3.1.?設置收集統計信息時的選項?
????我們知道,數據庫里的對象的統計信息(statistics)對于優化器得到正確的執行計劃來說起著至關重要的作用。因此從10g?R1開始,只要使用DBCA安裝的數據庫,都會自動創建一個job,該job缺省周一到周五每天晚上10點到第二天早上6點(周末則為全天)負責收集數據庫所有對象的統計信息。不過,可能存在某些情況,你需要用自己的腳本來收集某些特殊對象的統計信息。但是由于你采用了自動收集統計信息,oracle就會對所有對象使用相同的選項來收集統計信息,這樣你就失去了對某個對象的控制權。當你發現缺省的統計信息收集方式對某個對象不是很合適時,你必須鎖定該對象的統計信息,并使用一個特殊的選項值對該對象來收集統計信息。
????比如,某個表的列的數據傾斜(列為某種值的記錄行數非常多,而某種值的記錄行數又非常少)的非常嚴重,這時如果采用標準的采樣率:
ESTIMATE_PERCCENT=AUTO_SAMPLE_SIZE可能就不適合了。這時你就需要單獨指定該對象的采樣率。我們知道,在11g之前的收集統計信息方面,oracle提供的類似的其他選項還包括:CASCADE、DEGREE、METHOD_OPT、NO_INVALIDATE、GRANULARITY。?
???到了11g里,則提供了更大的靈活性,從而使得你可以很簡單的處理上面所說的這種情況。在11g里,上面說的這些選項可以在不同的級別上分別設置,級別由高到低分別為:global級別、數據庫級別、schema級別、表級別。其中,低級別的選項覆蓋高級別的選項。?
????比如,對于上面所舉的例子來說,如果要對你的一個特殊的、列上的值傾斜的很嚴重的表收集統計信息時,你只需要簡單的調用如下的存儲過程來設置該表級別上的的ESTIMATE_PERCCENT=100即可,如下所示:?
SQL> exec dbms_stats.set_table_prefs('Schema_name','Table_name',
'ESTIMATE_PERCCENT','100');?
????這樣設置以后,當數據庫在自動收集統計信息時,對于其他沒有單獨設置采樣率的表來說,采樣率會采用AUTO_SAMPLE_SIZE,而對于你單獨設置的Table_name表,則會使用100的采樣率來收集統計信息。?
????類似的,如果需要設置global級別上的選項,則調用dbms_stats.set_global_prefs;如果要設置數據庫級別上的選項,則調用dbms_stats.set_database_prefs;如果要設置schema級別上的選項,則調用dbms_stats.set_schema_prefs即可。?
?????同時到了11g里,除了上面提到的這些選項以外,還添加了另外三種新的選項:PUBLISH、INCREMENTAL、STALE_PERCENT。其中:?
1) PUBLISH:收集完統計信息以后是否立即將統計信息發布到數據字典里,還是將它們存放在私有區域里。TRUE表示立即發布,FALSE表示存放到私有區域里。
2) STALE_PERCENT:確定某個對象的統計信息過時的上限,如果過時就需要重新收集統計信息,缺省為10。計算某個表的統計信息是否過時,oracle會計算自從上一次收集該表的統計信息以來,該表中被修改的數據行數占該表的總行數的百分比。然后用得出的百分比值與該選項配置的值(如果缺省,就是10)進行比較,大于10,則說明該表的統計信息過時了,需要重新收集統計信息;否則就認為該表的統計信息不過時,不用再次收集。?
3) INCREMENTAL:在分區表上收集global的統計信息時(將GRANULARITY設置為GLOBAL),采用增量方式完成。使用該選項是因為對于某些分區表來說,比如按照月份進行范圍分區的分區表來說,除了代表當前月的分區里的數據會經常變化以外,其他分區里的數據不會變動。因此在收集該分區表上的global的統計信息時,就沒有必要再次掃描那些非當前月的分區了。如果你將INCREMENTAL設置為TRUE時,則在收集統計信息時,就不會掃描那些非當前月的分區里的數據,而只會掃描當前月的分區里的數據。最后將非當前月的分區上已經存在的統計信息加上當前月新算出來的統計信息合并就得出了分區表的global的統計信息。?
??可以從視圖:DBA_TAB_STAT_PREFS里看到所有的收集統計信息時的各個選項的值。
?
3.2.?對合并列收集統計信息?
????對于where條件里具有兩個列以上的情況,比如where c1=’A’?and c2=’B’來說,11g以前優化器評估其selectivity時,總是將每個列的selectivity相乘,從而得到整個where條件的selectiviey。但是如果兩個列具有很強的依賴關系,比如汽車制造商與汽車型號這兩個列來說,我們知道每個汽車制造商所生產的汽車型號幾乎都不會重復,也就是說當你發出where?汽車制造商列=’XXX’?and?汽車型號列=’XXX’時,與發出where汽車型號列=’XXX’時返回的記錄行數可能幾乎一樣。這時如果在計算where條件的selectivity時仍然采用將汽車制造商列的selectivity乘以汽車型號列的selectivity時,就會導致總的selectivity過低,從而導致優化器估計返回的記錄行數過少,從而可能導致不正確的執行計劃。?
????為了彌補這樣的問題,11g以后可以讓你將多個依賴程度很高列合并成一個組,然后對該組收集統計信息。具體如何實現,則可以看下面的例子。?
select dbms_stats.create_extended_stats('Schema_name','Table_name','(C1,C2)') from dual;?
通過調用函數dbms_stats.create_extended_stats將兩個或多個列合并,并返回一個虛擬的隱藏列的列名,其名字類似于:SYS_STUW_5RHLX443AN1ZCLPE_GLE4。?
然后,我們可以開始對表收集統計信息,收集完以后,你可以使用ALL|DBA|USER_STAT_EXTIONSIONS視圖來查看列組合的統計信息。?
exec dbms_stats.gather_table_stats('Schema_name','Table_name');?
如果你要對組合列收集直方圖,則可以如下所示:?
exec dbms_stats.gather_table_stats('Schema_name','Table_name',?
method_opt=>'for columns (C1,C2) size AUTO');
?
3.3?對函數以及表達式收集統計信息?
????如果where條件類似于function_name(table_name.column_name)=’XXX’時,則優化器在估計這樣的where條件的selectivity時,總是會假設其selectivity為1%,也就是該where條件將返回table_name里總記錄行數的1%的記錄行數。很明顯的,這種假設肯定是錯誤的,從而可能導致優化器產生了不夠優化的執行計劃。
????從11g開始,我們可以對函數或者表達式收集統計信息了。該特性依賴于虛擬列,也就是說你需要先用dbms_stats.create_extended_stats函數為
function_name(table_name.column_name)創建一個虛擬列,然后對該虛擬列收集統計信息。比如下面的例子。?
??? select dbms_stats.create_extended_stats('Schema_name','Table_name','length(C1)') from dual;?
下面則顯示的是對表達式來收集統計信息。?
??? select dbms_stats.create_extended_stats('Schema_name','Table_name','C1*C2') from dual;?
然后你可以對表收集統計信息時,就會為函數length(C1)對應的虛擬列收集統計信息了。如果你要對該虛擬列收集直方圖,則可以如下所示:?
exec dbms_stats.gather_table_stats('Schema_name','Table_name',?
??????????????????method_opt=>'for columns (length(C1)) size AUTO');
?
3.4 _PRIVATE_STATS里看到這些私有的統計信息。?
????為了測試這些私有統計信息,你可以有兩種方法:?
????1)?第一種方式使用DBMS_STAT.EXPORT_PRIVATE_STATS存儲過程將私有統計信息轉移到你自己的統計信息表(可以使用存儲過程DBMS_STATS.CREATE_STAT_TABLE來創建你自己的統計信息表)里。然后可以使用expdp導出你的統計信息表,然后再使用impdp將導出文件導入到測試環境中,再使用DBMS_STAT.IMPORT_TABLE_STATS將其導入到測試環境中進行測試。
???2)?第二種方式不導出私有的統計信息,而是直接在產品庫的session級別,將11g引入的新的初始化參數:? OPTIMIZER_PRIVATE_STATISTICS設置為TRUE(缺省情況下該參數為FALSE)。這時你執行SQL時,優化器就會參考私有統計信息來解析SQL語句并生成執行計劃了。?
????最后,測試完畢,發現最新的統計信息沒有問題的話,你就可以使用DBMS_STAT.PUBLISH_PRIVATE_STATS在產品庫上將私用統計信息發布出去,從而讓優化器能夠看到它們。?
????下面列舉一個例子來簡單說明這個過程。
首先設置表級別的publish選項為false:?
??? exec dbms_stats.set_table_prefs('Schema_name','Table_name','PUBLISH','false');?
????然后,收集表的統計信息:?
??? exec dbms_stats.gather_table_stats('Schema_name','Table_name');?
????第三,設置相關初始化參數:?
??? alter session set optimizer_use_private_statistics = true;?
????第四,進行測試,運行相關的SQL語句,并檢查產生的執行計劃。?
?
最后,把該表的統計信息發布出去:?
??exec dbms_stats.publish_private_stats('Schema_name','Table_name');
?
?
4.執行計劃管理
4.1.?執行計劃管理的工作原理?
????我們知道,SQL語句的性能很大程度上依賴于SQL語句的執行計劃。如果SQL語句的執行計劃發生改變,則SQL的性能很有可能發生大的變化。而SQL執行計劃發生變化的原因有很多種,包括優化器版本的變化、統計信息的變化、優化器相關的各種參數的變化、添加或刪除了索引、添加或刪除了物化視圖、修改了系統設置、以及是否應用了10g引入的SQL profile等。
????在11g之前,我們可以使用存儲大綱(stored outline)和SQL Profile來幫助我們固定某條SQL語句的執行計劃,防止由于執行計劃發生變化而導致的性能下降。不過這些技術需要DBA人為的處理,比如存儲大綱,需要DBA手工創建,而SQL Profile來說,則要DBA手工應用才能生效。?
????從11g開始,oracle引入了SQL執行計劃管理(SQL Plan Management)這個新特性,從而可以讓系統自動的來控制SQL語句執行計劃的穩定性,進而防止由于執行計劃發生變化而導致的性能下降。
????通過啟用該特性,某條語句如果產生了一個新的執行計劃,只有在它的性能比原來的執行計劃好的情況下,才會被使用。為了實現執行計劃管理,優化器會為所有執行次數超過一次的SQL語句維護該SQL語句的每個執行計劃的歷史列表(plan history)。優化器通過維護一個語句執行的日志條目(statement log)來識別該SQL語句是否為第二次執行。一旦優化器認出某條SQL語句為第二次執行,則優化器將該語句所生成的所有不同的執行計劃插入到plan history的相關表里,而plan history里包含了優化器能夠用于重新生成執行計劃的所有信息,這些信息包括SQL文本、存儲大綱、綁定變量以及解析環境(比如optimizer_mode之類影響優化器解析SQL語句的參數)等。
????當然,11g也支持手工維護SQL語句的plan history,作為對自動維護plan history的功能補充。但是并不是說plan history里任何的執行計劃都可以拿來使用。這里需要先介紹一下所謂的執行計劃基準線(plan baseline)這個概念。plan baseline是plan history的一個子集,plan baseline里面的執行計劃是用來比較性能好壞的一個依據。也就是說,憑什么來判斷是否可以使用一個新產生的執行計劃呢?就是把該新的執行計劃與plan baseline里的計劃進行比較來判斷。某個SQL語句的執行計劃可以屬于plan history,但是不一定屬于plan baseline。
注意:每個SQL語句都會有它自己的執行計劃歷史以及執行計劃基準線。?
那么某個SQL語句的執行計劃是如何進入執行計劃歷史,乃至執行計劃基準線的呢??
有兩種方法可以將SQL語句的執行計劃納入到執行計劃管理體系中去:?
1)?將初始化參數:OPTIMIZER_CAPTURE_PLAN_BASELINES設置為true,則會自動的捕獲SQL的執行計劃。該參數缺省為false。設置為true以后,當某條SQL語句第一次執行時,該SQL語句的plan history是空的,顯然該SQL語句的plan baseline也是空的。那么當該SQL第二次再次執行時,優化器會自動將該SQL語句以及相關的執行計劃放入plan history,同時也會放入到plan baseline里。這就構成了最初的plan baseline,也就是說最初進入plan history的執行計劃會直接自動進入plan baseline里。那么當你做了某些修改,比如添加了一個索引等,然后第三次執行該同樣的SQL語句,則會產生另外一個不同的執行計劃,這時新的執行計劃會自動進入plan history,但是不會自動進入plan baseline。是否使用該新的執行計劃,則要把該新的執行計劃與plan baseline里現存的第二次執行SQL時的執行計劃進行比較,如果新的執行計劃成本更低,則會使用新的執行計劃,否則使用plan baseline里的執行計劃。?
2)?使用dbms_spm包手工處理,這可以讓你手工管理SQL plan baseline。使用該包,你可以直接將SQL的執行計劃從shared pool里加載到plan baseline里,也可以使用dbms_spm包將已經存在的SQL Tuning Set加載到plan baseline里。同時,dbms_spm可以讓你把plan history里的執行計劃加入到plan baseline里。反之,你也可以使用該包將plan baseline里的執行計劃移出去。
???注意,某條SQL語句的plan baseline里的第一個執行計劃可以像上面說的通過設置初始化參數來自動加入,但是如果你希望在plan baseline里添加該SQL語句的其他新的執行計劃時,則必須使用dbms_spm包手動完成。?
那么plan baseline里的執行計劃是如何被使用的呢??
??? Oracle提供了一個初始化參數:OPTIMIZER_USE_PLAN_BASELINES,該參數缺省為true,表示要求優化器考慮使用plan baseline里的執行計劃,如果設置為false,則不使用執行計劃管理的特性,而又回到了11g之前的狀況。
以下描述基于的前提是plan baseline里已經存在了一個SQL的執行計劃。?
????每次優化器解析SQL語句的時候,首先仍然使用11g之前的傳統方式產生一個成本最低的執行計劃,然后看初始化參數:OPTIMIZER_USE_PLAN_BASELINES是否設置為true,如果為false,則直接返回所生成的執行計劃。否則如果為ture,則去plan history里找是否存在相同的執行計劃,如果找到了,則再去plan baseline里找是否存在相同的執行計劃,如果也找到了,則直接返回該執行計劃。如果在plan history里沒找到相同的執行計劃,則將產生的執行計劃加入到plan history里,然后將執行計劃與plan baseline里已經存在的執行計劃進行比較,看哪個執行計劃的成本低就取哪個執行計劃。
????如果你為某個SQL語句保存了存儲大綱,則為了向下兼容,該語句會使用存儲大綱。另外,即使你通過設置初始化參數:OPTIMIZER_CAPTURE_PLAN_BASELINES為true來啟動自動捕獲執行計劃到plan baseline里,對于使用存儲大綱所生成的執行計劃也不會放入plan baseline里。
????SQL語句的plan history以及plan baseline所涉及到的表是存放在SQL Management Base (SMB)里的,SMB里同樣也存放了SQL Profiles。而SMB是數據字典的一部分,存放在SYSAUX表空間里。SMB所占用的空間會自動定期的刪除。
?
4.2.?執行計劃管理的測試
????Oracle 11g提供了一個視圖:dba_sql_plan_baselines,可以在該視圖里查詢某條SQL語句相關的plan history以及plan baseline。我們來看下面的例子。
首先創建一個測試表。
SQL> create table t1(skew number, padding varchar2(100));
SQL> insert into t1 select rownum,object_name from dba_objects;
SQL> commit;
SQL> set autotrace traceonly exp stat;
SQL> select * from t1 where skew=200;
SQL> select * from t1 where skew=200;
?
???盡管執行兩次,但是這時去查詢dba_sql_plan_baselines,試圖找到SQL文本為select * from t1 where skew=200的記錄時,會發現沒有記錄,因為optimizer_capture_sql_plan_baselines缺省為false。我們將該參數設置為true以后繼續測試。
?
?
SQL> alter session set optimizer_capture_sql_plan_baselines=true;
SQL> select * from t1 where skew=200; --全表掃描
SQL> select * from t1 where skew=200; --全表掃描
SQL> select signature,sql_handle,plan_name,origin,enabled,accepted, autopurge
from dba_sql_plan_baselines where sql_text like 'select * from t1 where skew=200';
SIGNATURE SQL_HANDLE PLAN_NAME ORIGIN ENA ACC AUT
---------- ------------------------ ----------------------------- ----------- --- --- ---
1.2376E+19 SYS_SQL_abc0a2c042fa089c SYS_SQL_PLAN_42fa089c844cb98a AUTO-CAPTURE YES YES YES
?
我們可以看到,文本為“select * from t1 where skew=200”的SQL語句在plan history里產生了一個執行計劃。其中,
sql_handle表示SQL語句的句柄;
plan_name則表示該SQL的執行計劃的名字;
origin表示該執行計劃是如何進入plan history的,該列值為AUTO-CAPTURE則說明是由優化器自動加入的,如果為MANUAL則說明是由DBA手工加入的;
enabled表示是否被啟用了,YES表示啟用,NO表示禁用。如果某個執行計劃為禁用,則優化器根本就不會考慮使用該執行計劃;
accepted表示是否接受,也就是是否進入了plan baseline。我們看到這里的accepted為YES,說明該SQL的執行計劃進入了plan baseline里;
autopurge表示該執行計劃是否為定期自動刪除,YES表示是,NO表示否。
?
????我們繼續測試,在skew上添加一個索引,從而讓原來的SQL不走全表掃描,而改走索引掃描。
???
?
SQL> create index idx_t1 on t1(skew);
SQL> exec dbms_stats.gather_table_stats(user,'t1',cascade=>true);
SQL> select * from t1 where skew=200; --索引掃描
SQL> select signature,sql_handle,plan_name,origin,enabled,accepted,fixed,autopurge
from dba_sql_plan_baselines where sql_text like 'select * from t1 where skew=200';
SIGNATURE SQL_HANDLE PLAN_NAME ORIGIN ENA ACC AUT
---------- ------------------------ ----------------------------- ----------- --- --- ---
1.2376E+19 SYS_SQL_abc0a2c042fa089c SYS_SQL_PLAN_42fa089c844cb98a AUTO-CAPTURE YES YES YES
1.2376E+19 SYS_SQL_abc0a2c042fa089c SYS_SQL_PLAN_42fa089cdbd90e8e AUTO-CAPTURE YES NO YES
?
?
????這時我們可以看到,dba_sql_plan_baselines視圖里多了一個執行計劃,也就是我們后面那個使用了索引掃描的執行計劃。而該執行計劃的accepted為NO,說明該計劃并沒有進入plan baseline里,但是進入了plan history里。
這時,我們可以通過調用dbms_spm包來手工將走索引的執行計劃加入到plan baseline里。如下所示,將accepted改為YES。
?
SQL> dbms_spm.alter_sql_plan_baseline(
sql_handle => 'SYS_SQL_abc0a2c042fa089c',
plan_name => 'SYS_SQL_PLAN_42fa089c844cb98a',
attribute_name => 'ACCEPTED',
attribute_value => 'YES');
?
????然后再次查詢dba_sql_plan_baselines視圖,可以發現后面的執行計劃的accepted變為了YES。
?
SQL> select signature,sql_handle,plan_name,origin,enabled,accepted,fixed,autopurge
from dba_sql_plan_baselines where sql_text like 'select * from t1 where skew=200';
SIGNATURE SQL_HANDLE PLAN_NAME ORIGIN ENA ACC AUT
---------- ------------------------ ----------------------------- ----------- --- --- ---
1.2376E+19 SYS_SQL_abc0a2c042fa089c SYS_SQL_PLAN_42fa089c844cb98a AUTO-CAPTURE YES YES YES
?1.2376E+19 SYS_SQL_abc0a2c042fa089c SYS_SQL_PLAN_42fa089cdbd90e8e AUTO-CAPTURE YES YES YES
?
?
??如果我們要手工刪除plan baseline里的執行計劃,則可以調用dbms_spm里的存儲過程來實現。
SQL> var cnt number;
?SQL> exec :cnt :=
dbms_spm.purge_sql_plan_baseline('SYS_SQL_abc0a2c042fa089c');
?
??刪除指定SQL語句的執行計劃以后,再去查詢dba_sql_plan_baselines就會發現上面測試SQL語句的執行計劃不存在了。
?
??從上面的描述可以看出,SQL Plan Management特性的主要作用就是通過引入一個SQL plan baseline,從而保證SQL語句執行計劃的穩定,進而保證系統性能的穩定。本質上,它屬于11g之前的存儲大綱的升級版,而且是自動實現的,不需要人工干預。
?
5.自動內存管理
Auto Memory Management是Oracle10g提出來的一個新特性,在最新的Oracle11g數據庫中又得到了進一步的發展。
????
????通過使用自動內存管理,Oracle數據庫中的PGA和SGA內存之間可以互相轉換,根據當前的工作負載來自動設定Oracle內存區域中的PGA和SGA的大小。這種間接的內存轉換依賴于操作系統的共享內存的釋放機制來獲得內部實例的調優。目前這種技術可以應用于Linux, Solaris, HPUX, AIX?和Windows等操作系統上。
????首先我們來回顧下Oracle10g的自動內存管理特性。在Oracle10g的數據庫中,只有SHARED_POOL_SIZE、DB_CACHE_SIZE、LARGE_POOL_SIZE、JAVA_POOL_SIZE、STREAMS_POOL_SIZE五個SGA組件可以被自動調整,其中PGA的最大值由初始化參數PGA_AGGREGATE_TARGET決定,SGA的最大值由初始化參數SGA_TARGET決定。
????在Oracle11g數據庫中,使用自動內存管理特性不再需要設定參數PGA_AGGREGATE_TARGET和SGA_TARGET,因為這兩個參數都已經被修改成自動調優的,除非想指定PGA和SGA的最小值才需要設定這兩個參數。
????在Oracle11g數據庫中,則需要設置一個叫做MEMORY_TARGET的初始化參數,這個參數是指整個Oracle實例所能使用的內存大小,包括PGA和SGA的整體大小,在MEMORY_TARGET的內存大小之內,PGA和SGA所用的內存可以根據當前負載情況自動相互轉換。
?
如果當初始設定的MEMORY_TARGET的內存不夠當前數據庫使用的時候,Oracle11g還提供了另外一個初始化參數MEMORY_MAX_TARGET,當原始設定的內存不夠使用的時候,可以手工來動態?調節MEMORY_TARGET的大小,但是不允許超過MEMORY_MAX_TARGET的值。
下面這張圖簡單明了的描述出了Oracle11g數據庫內存大小的設定參數。
?
?
?
此外,Oracle11g數據庫還提供了幾個用于監控自動內存管理的視圖:?
????V$MEMORY_DYNAMIC_COMPONENTS:描述當前所有內存組件的狀態?
????V$MEMORY_RESIZE_OPS:循環記錄最后800次的SGA大小調整請求?
????X$KMGSTFR:循環記錄最后800次的SGA的轉換地址?
????_MEMORY_MANAGEMENT_TRACING=23:對于所有的內存轉換調整行為均記錄保存為跟蹤文件
?
?
6.?ASM(自動存儲管理)
6.1. ASM Fast Mirror Resync?
????在10g的ASM中如果因為某些硬件故障(比如接口線,比如光纖卡,比如電源)導致Diskgroup中的某些磁盤無法正常讀取,這些磁盤將處于offline狀態,在offline之后不久ASM就會把這些磁盤從Diskgroup中刪除,并且嘗試利用冗余的extent來重新在其它磁盤中構建數據,這是一個比較耗時且耗資源的操作。當我們修復了磁盤,再將它們重新加回磁盤組中,又將是另外一次的數據重整操作。如果我們僅僅是例行的維護硬件,因為磁盤中的數據并沒有真正的損壞,我們只是將磁盤取出來過一會兒再加回去,那么這樣的兩次數據重整操作無疑是沒有必要的,在11g中ASM的Fast Mirror Resync功能允許我們設置磁盤的repair時間,在repair時間內ASM將不會嘗試在磁盤間重新分配extent。?
??? ALTER DISKGROUP dgroup SET ATTRIBUTE 'DISK_REPAIR_TIME'='3H';?
??上述命令可以設置當磁盤組dgroup中的磁盤失效和重新有效之間的時間在3小時內的話,ASM就不會重新構建extent,當磁盤重新有效之后,ASM需要做的只是將這3小時內更改的extent重新同步到剛才失效的這些磁盤中就可以了。?
6.2. ASM Preferred Mirror Read?
????我們知道在10g中ASM總是會去讀取Primary extent,這樣做的目的是為了更好的分散IO,但是在某些環境中,一個ASM磁盤組中的磁盤對于某一個特定的節點來說,有些是Local Disk而有些則是Remote Disk,從Remote Disk中讀取數據效率會低于Local Disk,但是在10g中我們無法要求從哪組磁盤中讀取數據,在11g中新增的ASM_PREFERRED_READ_FAILURE_GROUPS參數幫助我們完成了這個功能。給每個實例設置優先讀取的Failure Group就可以了。?
6.3. ASM擴展性的增強?
???對于外部冗余(External redundancy),ASM可以最大支持到140PB了,而在10g中這個數字僅僅是35TB。
?
7.Server Result Cache
Cache始終是提升性能的重要技術,?在Oracle 11g中增加了一種Server Result Cache, MySQL的Query Cache是根據SQL的文本來匹配的,?只有Query的文本一模一樣時才可以共享,?而Oracle的Server Result Cache則只要執行計劃一樣或部份一樣,?并且生命周期一樣,?則就可以共享了.?當下面的表數據改變了, Oracle會自動清除這個Cache,?以確保查詢結果的正確性.?在以讀為主要的系統中,?宣稱性能可以提升一倍.?
????這塊內存從SGA中分配,?由RESULT_CACHE_MAX_SIZE控制. Oracle允許你在系統,?會話,?表和語句級(Hint:result_cache)控制是否使用Server Result Cache技術. Oracle提供一個PL/SQL包及相應視圖來管理這個Cache區域.
?
對于同樣的操作,如果能在多個process或者session間共享結果,對于性能優化自然是非常有幫助的。從oracle7開始提供的share pool,可以讓同樣的SQL可以解析一次,執行多次,有效的減少了多個session執行相同SQL語句時的硬解析,如果應用很好的使用了綁定變量,那么共享SQL對于系統整體性能的提升是不言而喻的。?
????那么,除了能共享SQL和執行計劃,還能共享什么?直接共享SQL執行后的結果,使得相同或者部分相同的SQL語句甚至只需要執行一次,以后再次執行時就直接得到結果?沒錯,Oracle11g的新特性Server Result Cache就能提供這樣功能。Oracle在白皮書上宣布,對于讀頻繁的系統,通過該特性,甚至有可能提升系統性能200%,對于大量報表的數據倉庫項目來說,這個特性應該是一個不錯的消息。?
????Server Result Cache通過在SGA中分配一個緩沖區來保存查詢結果,Oracle引入了一個新的初始化參數來控制這個cache的大小:result_cache_max_size。可以在system、session、table或者語句級別來設置cache的使用。在語句級可以使用一個新的hint來控制是否緩存查詢結果。另外,Oracle還提供了一個新的PL/SQL用來監控和管理Server Result Cache,比如可以清空整個cache的內容或者清空某個查詢的結果,也可以生成cache的使用報告等。?
????既然使用了cache,自然會有cache查找和cache數據清除算法的問題。估計查找還會是通過hash算法,這樣還需要引入幾個相關的latch。Cache中的數據,也應該是通過LRU或者類似LRU的算法來管理其生命期。?
??? Server Result Cache不僅僅能緩存整個查詢的結果,也能緩存查詢中某部分操作的結果,比如緩存一次排序的結果,就可以避免再次執行時的排序操作。對于一些比較耗資源的查詢操作,緩存結果應該能很好的提升性能。
????通過在服務端和客戶端引入對于查詢結果的緩存機制,Oracle11g或許能極大的提高查詢性能。對于一些讀比較頻繁的系統,比如數據倉庫應用,Oracle11g或者更值得期待。
?
8.提升性能?Consistent Client Cache
Cache始終是提升性能的重要技術.?除了在前面講的Server Result Cache, Oracle 11g還增加了一種Client Cache.?這是一種在Oracle Client端的緩沖技術,?通過將中間結果或整個表緩沖在客戶端,?當客戶端發出查詢請求時, Oracle可以直接在這個緩沖區中返回記錄,?而不需要去和數據庫打交道,?可以大大地著少和服務器端的網絡來回,?降底服務器上的SQL調用,?根據Benchmarks測試,?對于只讀或極少更新的表,?總的消耗時間可以降低500%,?而服務器上的CPU時間可以降低200%.
通過OCI接口,在Client端也可以緩存查詢結果。典型的場景就是我們在應用服務器端緩存查詢結果,這樣在前端執行該查詢時,甚至不需要到數據庫中去執行該查詢。客戶端結果緩存在OCI進程中,可以被該進程中的多個session或者線程共享。
????要使用這個Cache功能,?也很簡單,?首先要使用Oracle 11g的OCI客戶端,?如: JDBC-OCI, ODBC, ODB.NET, PHP, Perl等,?無須要去更改現有的程序代碼;?其次需要在數據庫端指定CLIENT_RESULT_CACHE_SIZE參數來指定這一塊Cache的大小,?如果為0則表示禁用.?當該參數大于0時,該特性被啟用,同樣的,該特性也可以在system、session、table或者語句級來設置。通過在服務端設置參數而不是客戶端設置,可以集中的管理該特性,但是也可以在各個客戶端單獨進行設置,客戶端的設置將覆蓋服務端的設置。
9.如何使用ADRCI
9.1.關于?ADR Command Interpreter (ADRCI)
一個存放數據庫診斷日志、跟蹤文件的目錄,稱作ADR base,對應初始化參數DIAGNOSTIC_DEST,如果設置了ORACLE_BASE環境變量,DIAGNOSTIC_DEST等于ORACLE_BASE,如果沒有設置ORACLE_BASE,則等與ORACLE_HOME/log。
?
關于ADRCI:ADRCI Command-Line Utility?命令行工具,使用該工具查看ADR中的日志和跟蹤信息,查看健康報告;還可以將相關錯誤日志和信息打包成zip文件,以便提供給oracle support分析。在ADRCI工具中可以執行很多命令,另外可以象sqlplus一樣執行腳本。
?
9.2.開始使用ADRCI
9.2.1運行ADRCI,$ORACLE_HOME/bin/adrci
代碼:
[root@ractest ~]# su - oracle
[oracle@ractest ~]$ which adrci
~/11g/bin/adrci
[oracle@ractest ~]$ adrci
ADRCI: Release 11.1.0.4.0 - Beta on Thu Jul 12 05:39:29 2007
Copyright (c) 1982, 2006, Oracle.??All rights reserved.
ADR base = "/home/oracle"
adrci>>
?
退出ADRCI,在adrci>>提示符下敲入exit或者quit?,?回車大小寫敏感:在adrci中命令大小寫不敏感
?
代碼:
adrci>>SHOW tracefile
diag/rdbms/orcl/orcl/trace/orcl_ora_20187.trc
diag/rdbms/orcl/orcl/trace/orcl_fbar_11388.
?
但使用搜索串的時候是敏感的,比如:
SHOW TRACEFILE %mmon%
?
9.2.2.如何得到幫助信息:
(1)得到adrci中的命令列
代碼:
adrci>>help
HELP [topic]
Available Topics:
CREATE REPORT
......
?
?(2)也可以使用adrci?–help來得到adrci的命令使用和選項。如:
代碼:
[oracle@ractest ~]$ adrci -help
Syntax:
adrci [-help] [script=script_filename]
[exec = "one_command [;one_command;...]"]
Options??????Description?????????????????????(Default)
-----------------------------------------------------------------
script???????script file name????????????????(None)
help?????????help on the command options?????(None)
exec?????????exec a set of commands??????????(None)
-----------------------------------------------------------------
?
(3)如何得到特定命令的幫助信息:
adrci>>HELP SHOW TRACEFILE
?
Usage: SHOW TRACEFILE [file1 file2 ...] [-rt | -t]
[-i inc1 inc2 ...] [-path path1 path2 ...]
…………….
9.2.3.使用ADRCI進行批處理命令或者腳本
(1)?使用exec選項,用分號將命令隔開
這里文檔中有個小問題,文檔中寫ADRCI EXEC="COMMAND[; COMMAND]...",
只能在windows平臺這樣寫,在unix/linux平臺下必須用小寫來執行。
代碼:
?
adrci>>show homes;show base; echo '20070712'
ADR Homes:
diag/rdbms/orcl/orcl
ADR base is "/home/oracle"
20070712
adrci>>
adrci>>
adrci>>exit
[oracle@ractest ~]$ adrci exec="show homes;echo '20070712';echo '';show base; "
ADR Homes:
diag/rdbms/orcl/orcl
20070712
ADR base is "/home/oracle"
?
(2)?使用script選項。adrci SCRIPT=adrci_script.txt
代碼:
?
[oracle@ractest ~]$ cat /tmp/a
show homes;
[oracle@ractest ~]$ adrci script=/tmp/a
[oracle@ractest ~]$ cat /tmp/a
fadsfdsa
[oracle@ractest ~]$ adrci script=/tmp/a
[oracle@ractest ~]$ cat /tmp/a
show trace;
[oracle@ractest ~]$ adrci script=/tmp/a
[oracle@ractest ~]$ cat /tmp/a
SET HOMEPATH /home/oracle/diag/rdbms/orcl/orcl;show trace;
[oracle@ractest ~]$ adrci script=/tmp/a
[oracle@ractest ~]$
?
9.3.使用ADRCI查看Oracle數據庫后臺報警日志(alert_sid.log)和跟蹤文件
注意:以下大部分命令都需要用Ctrl+C?來結束,并返回到adrci命令行
1.查看完整alert信息:
adrci>>SHOW ALERT
2.?查看最新alert信息:
adrci>> SHOW ALERT –TAIL
查看最新20條alert信息:
adrci>> SHOW ALERT -TAIL 20
只查看600的錯誤
adrci>>SHOW ALERT -P "MESSAGE_TEXT LIKE '%ORA-600%'"
?
查看ORA-錯誤信息,注意這里的參數很好,比較人性化,可以幫助提供錯誤時間
以下該命令的幫助:
代碼:
adrci>>help show alert
Usage: SHOW ALERT [-p <predicate_string>] [-tail [num]] [-v]
[-file <alert_file_name>]
Purpose: Show alert messages.
Options:
????[-p <predicate_string>]: The predicate string must be double quoted.
????The fields in the predicate are the fields in the alert message's
????XML schema. To get the field definitions, use command:
??????????"describe&
?
3.查看跟蹤文件
常用的有:
(1)列出所有跟蹤文件:?SHOW TRACEFILE
(2)模糊查詢跟蹤文件,比如某個進程的,注意這里區分大小寫?SHOW TRACEFILE
????%mmon%
(3)可以指定某個路徑?SHOW TRACEFILE %mmon% -PATH /home/steve/temp
(4)象ls那樣按時間排序?SHOW TRACEFILE -RT
?
9.4.其他體驗和說明
9.4.1關于在adrci中執行os命令,可以直接在adrci中執行os命令。
所以當發出一個不存在的命令的時候,錯誤信息也就是系統返回的了。
代碼:
adrci>>id
uid=10000(oracle) gid=1001(dba) groups=1001(dba),1002(oinstall)
context=user_u:system_r:unconfined_t
adrci>>host date
DIA-48415: Syntax error found in string [host date] at column [9]
adrci>>host
[oracle@ractest ~]$ exit
exit
adrci>>!???????????????????????????-------------這樣不行
/bin/bash: -c: line 0: syntax error near unexpected token `newline'
?
/bin/bash: -c: line 0: `!'
Additional information: 512
adrci>>! date????????????????????-------------這就可以
Thu Jul 12 06:20:40 CST 2007
--------------------------------------------------------------------
[oracle@ractest ~]$ ksh
$ adrci
ADRCI: Release 11.1.0.4.0 - Beta on Thu Jul 12 06:28:14 2007
Copyright (c) 1982, 2006, Oracle.??All rights reserved.
ADR base = "/home/oracle"
adrci>>abc
/bin/bash: abc: command not found
--------明明在ksh下,卻返回bash的錯誤….
Additional information: 32512
adrci>>ksh
$ abc
ksh: abc: not found
?
9.4.2.確認了在adrci中使用的alert是log.xml,而非alert_orcl.log
對alert進行置空(> file),adrci不受影響;
對log.log進行置空,adrci返回的錯誤挺嚇人的:internal error code,
跟00600一個風格啊。。。應該是某些tag找不到,就報這么狠的錯誤
代碼:
adrci>>show alert
ADR Home = /home/oracle/diag/rdbms/orcl/orcl:
**********************************************************
DIA-48001: internal error code, arguments: [17183],
[0x84B178C], [], [], [], [], [], []
DIA-48154: reached end of file for alert log
DIA-48102: encountered the end-of-file when reading&nb
?
?
9.4.3.在adrci中不能使用退格(backspace)怎么辦
跟sqlplus一樣,有下面幾種選擇:
用del鍵;
使用Ctrl+backspace;
使用Ctrl+u刪除整行(bash下);
在os命令行下stty erase ^h?(可以直接寫到oracle的.profile/.bash_profile下面)
?
9.4.4.另外adrci一個重要的功能是查看Incident和對Incident打包的功能。
?
10. RMAN
RMAN除了單純的備份恢復功能,已經被賦予了越來越多的責任,比如創建Standby數據庫,比如跨平臺傳輸表空間中的表空間轉換。Oracle11g的RMAN倒是沒有太多飛躍性的更新。?
10.1.?自定義archivelog刪除策略?
????我們知道在11g之前,只有backupset的刪除策略可以定義,比如保留多長時間的備份或者保留多少份有效備份,而刪除歸檔日志只有在delete命令中定義刪除全部備份完畢的或者刪除從哪一個時間點到哪一個時間點的。而在11g中我們已經可以通過configure命令來定義歸檔日志的刪除策略的,比如增加了下面的語法,只有在磁帶上備份了2次的歸檔日志才會被delete命令刪除。
??? CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO DEVICE TYPE sbt;?
????當然,僅僅是增加語法那就只能稱為比較無聊的新功能了,除了configure語法之外,現在在11g中通過APPLIED ON STANDBY關鍵字可以定義只有對于所有的standby站點都已經applied的歸檔日志才會被刪除,或者定義所有被成功傳送到standby站點的歸檔日志就可以被刪除。而以前這些都需要DBA自己撰寫腳本從數據字典中查詢到相關信息然后再通過腳本刪除。
?
10.2.?直接通過網絡復制數據庫?
????在11g之前如果要使用duplicate命令來復制一份數據庫,那么則需要源數據庫,需要在目標機器上的一份有效備份,需要目標數據庫,在11g中這一切被大大簡化。通過FROM ACTIVE DATABASE關鍵字,我們只需要有一個源數據庫,就可以簡單地通過網絡在另外一臺機器上復制一個相同的數據庫了。Oracle會通過一系列Memory Script在內存中recover并且open目標數據庫。?
????另外,在11g之前,duplicate數據庫是不會自動復制spfile的,而現在,我們通過下面的語句,就可以讓Oracle在復制過程中自動生成一份spfile,并且其中的初始化參數允許額外定義。?
DUPLICATE TARGET?DATABASE
TO?aux_db
FROM?ACTIVE?DATABASE
SPFILE PARAMETER_VALUE_CONVERT?'/u01',?'/u02'
SET?SGA_MAX_SIZE?=?'200M'
SET?SGA_TARGET?=?'125M'
SET?LOG_FILE_NAME_CONVERT?=?'/u01','/u02'
DB_FILE_NAME_CONVERT?'/u01','/u02';
?
????
????在11g中使用duplicate復制一個數據庫的準備步驟只需要目標數據庫(AUXILIARY實例):
????a.?通過一個最簡單的pfile把實例啟動到nomount狀態,這個pfile中只需要包含DB_NAME和REMOTE_LOGIN_PASSWORFILE參數即可?
????b.?password文件必須事先建好,而且SYS密碼需要跟source數據庫中相同,這個通過orapwd可以輕松完成?
????c.?目錄結構需要事先創建好并且具有正確的權限
?
10.3.?并行備份大文件?
????現在Oracle數據庫中單個數據文件可以最大到128T,而在以前的版本中RMAN的最小備份單位就是datafile,那么對于以后可能出現的這種超大數據文件,RMAN備份就幾乎無法操作了。在11g中,通過backup命令中的SECTION SIZE關鍵字,我們可以對數據文件指定section了,每個section都作為一個獨立單位來處理,每個數據文件可以最多指定256個section。
?
Section的好處在于,
一可以并行備份多個section,提高備份速度;
二可以分多個時間分別備份一個大文件的多個section,時間上化整為零,更具有操作性。?
10.4. RMAN Catalog管理性增強?
IMPORT CATALOG命令允許我們將一個catalog庫中的信息轉儲到另外一個catalog庫,這在以前完全需要手工操作。?
推出Virtual Recovery Catalogs概念,這是VPD的實例應用,對于一個集中管理的catalog設置多個用戶的虛擬catalog,每個用戶只能管理自己的數據,安全性的進一步提高。
?
?
11.?兩個特性
11.1?歸檔日志壓縮?
其中一個是歸檔日志壓縮的功能。通過設置初始化參數?log_archive_dest_n?中?compression?選項,可以對歸檔文件進行壓縮生成。對于網絡傳輸比較吃緊的環境,這個功能會很有價值。?
11.2?物理?Standby?可以聯機查詢?
11g?據說也可以對物理的?Standby?進行聯機查詢,前提條件是激活?Redo Apply?。10g?之前,物理?Standby?都是要么恢復狀態,要么?Read Only?狀態。如果能夠邊恢復邊查詢的話,那么簡直是一個比較完美的?IO?分布的技術方案了。SharePlex?之類的產品市場會又小不少。
?
12??Database和SQL重演
Database Replay是指在產品環境的數據庫上捕獲所有負載,并可以將之傳送至Standby數據庫或由備份恢復的測試庫上,在測試環境中重演主庫的環境,這使得升級或者軟件更新可以進行預先的"真實"測試,或者可以通過測試環境完全再現真實環境的負載及運行情況。
???在我看來,這是Oracle向后追溯能力的又一增強,在Oracle10g中,我們知道Oracle通過v$session_wait_history視圖,ASH特性等,實現將數據庫的等待事件向后追溯,現在通過Database Replay特性,Oracle可以將整個數據庫的負載捕獲、記錄并實現Replay,也就是整個數據庫的向后追溯能力。
???這一特性提供的再現現場能力,極大的豐富了我們發現并解決數據庫問題的手段,將為數據庫管理帶來更多的方便之處。
???當然使用這一特性會帶來一定的性能負擔,Oracle說這一負擔在5%左右。
???這一特性的簡化版本就是SQL Replay,即只捕獲SQL負載,通過SQL負載應用再現SQL影響:
Oracle已經有了一系列的Flashback,現在又有了Replay;Flashback可以向后閃回,Replay可以向前推演,Oracle給用戶提供的手段越來越多,期待這一特性在正式版中能夠有完美的展現。
?
13. Server Connection Pool
在應用服務器這一層,?我們已經使用Connection Pool了,?可以有效地降低服務器上的連接的數量,?不過還是有不足之處的.?當你的訪問量達到一定的規模時,?你會發現一臺或幾臺應用服務器根本就解決不了問題,?在有些世界級的網站中,?應用服務器的數量可能是上千臺的,?當每個應用服務器產生4-5個連接時,?你會發現Oracle服務器端便有了4-5千個物理連接.?象PHP程序,?要求每一個Web Server進程都至少有一個連接.?因此Oracle在11g中引入了Database Resident Connection Pool的功能,?這樣客戶端就可以不管連接池了,?由Oracle在服務器端進行連接共享控制.?
????通過增加一個后臺進程CMON(Connection Monitor)來管理連接,?應用發出連接請求時,?實際上是連接到CMON進程,?然后由CMON進程分配一個已經連接好的后臺進程,?當客戶端連接關閉后,?這個后臺進程又交由CMON進程管理.?估計PHP這類的Web程序要有福氣了,?不需要去實現連接池的代碼了.
?
14?其他地方
14.1, RAC節點通信協議的改進.?
??? 11g中的協議比較智能,?可以根據節點的負荷作出動態的調整,?大大減少節點之間的消息傳遞量.?
14.2,?邊恢復邊Open的Physical Standby -- Highly Available Reader Farms?
????這個功能肯定很受大公司的歡迎,?因為以前的Data Guard不能做到這樣,?當Open時同主庫的延遲會越來越大,?而在11g中則不存在這樣的延遲,?因此可以建幾個這樣的Standby來分擔讀操作,?估計Shareplex或Realsync這樣的軟件市場要受到一定的影響了,?我對Log的研究也變得越來越沒有價值了.?
14.3,?面向OLTP的壓縮表?
?????在新的壓縮技術中, Oracle可以去掉了壓縮表的諸多限制,?使之可以適合OLTP的環境.?這樣Oracle可以充分利用閑的CPU的資源(CPU越來越歷害了),?以降低IO的消耗(IO的提高還是很慢).?
總結
以上是生活随笔為你收集整理的Oracle 11g 新特性简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于系统级触发器的审计功能
- 下一篇: Oracle ASM 进程之ASMB