版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Oracle程序員面試分類模擬11簡答題1.
DATABLOCK,EXTENT和SEGMENT的區(qū)別是什么?正確答案:DATABLOCK是數(shù)據(jù)庫中最小的邏輯存儲單元。當數(shù)據(jù)庫的對象需要更多的物理(江南博哥)存儲空間時,連續(xù)的DATABLOCK就組成了EXTENT。一個數(shù)據(jù)庫對象擁有的所有EXTENT被稱為該對象的SEGMENT。
2.
在Oracle中,數(shù)據(jù)塊、Redo日志塊及控制文件數(shù)據(jù)塊的大小分別是多少?如何查詢?正確答案:這3種數(shù)據(jù)塊分別介紹如下:
1)數(shù)據(jù)塊(DataBlock),是讀寫數(shù)據(jù)文件的最小單位,默認是8KB,可以通過SQL語句“SELECTFILE#,NAME,BLOCKSIZEFROMV$DATAFILE;”查詢,單位為BYTE。
2)Redo日志數(shù)據(jù)塊(RedoLogBlock),大小一般等于操作系統(tǒng)的系統(tǒng)塊的大小,一般為512或4096,可以通過SQL語句“SELECTBLOCKSIZEFROMV$LOG;”或“SELECTLEBSZFROMXSKCCLE;”查詢,單位為BYTE。
3)控制文件數(shù)據(jù)塊(ControlFileBlock),默認為16KB,可以通過SQL語句“SELECTBLOCKSIZEFROMV$CONTROLFILE;”查詢,單位為BYTE。
3.
行鏈接和行遷移有什么區(qū)別?正確答案:當一行的數(shù)據(jù)過長而不能存儲在單個數(shù)據(jù)塊中時,可能發(fā)生兩種事情:行鏈接(RowChaining)或行遷移(RowMigration)。
1)行鏈接(RowChaining):當?shù)谝淮尾迦胄袝r,由于行太長而不能容納在一個數(shù)據(jù)塊中時,就會發(fā)生行鏈接。在這種情況下,Oracle會使用與該塊鏈接的一個或多個數(shù)據(jù)塊來容納該行的數(shù)據(jù)。行鏈接經常在插入比較大的行時才會發(fā)生,例如包含LONG、LONGROW、LOB等類型的數(shù)據(jù)。在這些情況下,行鏈接是不可避免的。行鏈接通常由INSERT操作引起。
2)行遷移(RowMigration):當一個行上的更新操作導致當前的數(shù)據(jù)增加以致于不能再容納在當前塊,這個時候就需要進行行遷移,在這種情況下,Oracle將會遷移整行數(shù)據(jù)到一個新的數(shù)據(jù)塊中。一個行遷移意味著整行數(shù)據(jù)都將會移動,原始的數(shù)據(jù)塊上僅僅保留的是指向新塊的一個地址信息。發(fā)生行遷移的時候行的ROWID不會改變。行遷移的情況主要是由于表上的PCTFREE參數(shù)設置過小導致,所以必須設置一個合適的PCTFREE參數(shù)。可以使用exp/imp工具導入導出來處理行遷移。行遷移通常由UPDATE操作引起。
4.
什么是專用服務器和共享服務器?正確答案:在連接到Oracle數(shù)據(jù)庫的時候,可以有兩種連接模式,一種稱為專用服務器連接(DedicatedServer),另外一種稱為共享服務器連接(SharedServer)。下面將分別講解這兩種連接方式的不同點。
專用服務器:每次在對Oracle進行訪問的時候,Oracle服務器的Listener會得到這個訪問請求,然后會為這個訪問創(chuàng)建一個新的進程來進行服務。所以說,對于每一個客戶端的訪問,都會生成一個新的進程進行服務,是一種類似一對一的映射關系。這種連接模式的一個很重要的特點就是UGA(UserGlobalArea,用戶全局區(qū))是存儲在PGA(ProgramGlobalArea,程序全局區(qū))中的,這個特性也很好說明了當前用戶的內存空間是按照進程來進行分配的。專用服務器連接模式是Oracle默認的連接模式。
共享服務器:也稱為多線程服務器(Multi-ThreadedServer,MTS)。若采用共享服務器模式的話,則在數(shù)據(jù)庫初始化的時候就會創(chuàng)建一批服務器連接的進程,然后把這些連接進程放入一個連接池來進行管理。初始化的池中的進程數(shù)量在數(shù)據(jù)庫初始化建立的時候是可以手動設置的。在連接建立的時候,Listener首先接收到客戶端的建立連接的請求,然后Listener去生成一個稱為調度器(Dipatcher)的進程與客戶端進行連接。調度器把客戶端的請求放在SGA(SystemGlobalArea,系統(tǒng)全局區(qū))的一個請求隊列中,然后在共享服務器連接池中查找有無空閑的連接,然后讓這個空閑的服務器進行處理。處理完畢以后再把處理結果放在SGA的相應隊列中。調度器通過查詢相應隊列,得到返回結果,再返回給客戶端。這種連接模式的優(yōu)點在于服務器進程的數(shù)量可以得到控制,不大可能出現(xiàn)因為連接數(shù)過多而造成服務器內存崩潰。但是由于增加了復雜度以及請求相應隊列,可能在性能上有所下降。
如果在前端使用了Weblogic的連接池,那么在數(shù)據(jù)庫級別就沒有必要再使用共享服務器了,因為這時的用戶連接已經在Weblogic層面上得到了控制。其實專用服務器和共享服務器是可以并存的,即使使用了共享服務器,某些管理操作也是必須在專用服務器模式下來做的,比如STARTUP或SHUTDOWN。
(1)啟用共享服務器
要切換到共享模式,可以使用以下步驟:
1)設置初始化參數(shù)SHAREDSERVERS大于0,然后重啟數(shù)據(jù)庫即可啟動共享模式,SQL如下:
其中,SHARED_SERVERS指定了當實例啟動的時候共享服務器進程啟動的數(shù)量。如果這個參數(shù)的值為0,那么表示數(shù)據(jù)庫沒有啟動共享服務模式。這個參數(shù)是配置共享服務器必需的,而且只有這個參數(shù)是必需的。MAX_SHARED_SERVERS是Oracle在同一個時刻最大能夠使用的共享服務器進程數(shù)量。如果SHARED_SERVERS大于MAX_SHARED_SERVERS,那么Oracle會以SHARED_SERVERS參數(shù)的值覆蓋MAX_SHARED_SERVERS。
2)設置DISPATCHERS參數(shù),可以采用下面的方法設置:
其中,“PROTOCOL=TCP”表示的是協(xié)議,“SERVICE=lhrdbXDB”指定要采用共享服務器模式的服務名稱。使用上面的模式指定只啟動某個服務的共享模式,如果要設置所有服務都使用共享模式,則設置為:
3)客戶端的tnsnames.ora的文件中,在CONNECT_DATA設置一項中增加“(server=shared)”一項,即可使用共享服務器連接,如下:
其中,SERVICE_NAME的值可以通過命令“l(fā)snrctlservices<listenername>”來查看,如下:
如果服務器端沒有啟動共享服務器模式,而客戶端使用shared方式連接的話,那么會出現(xiàn)錯誤提示:“ORA-12520:TNS:監(jiān)聽程序無法找到需要的服務器類型的可用句柄”。
如果同時把SHARED_SERVERS和MAX_SHARED_SERVERS都設置成0,那么共享服務器將關閉。
(2)判斷會話的連接模式
可以從V$SESSION視圖的SERVER列里查看:
若顯示的結果中有NONE或SHARED,則說明當前啟動了共享服務器模式。其中,狀態(tài)為NONE的會話表示當前共享服務器進程沒有任務處理,若進程正在執(zhí)行某些任務則會表現(xiàn)為SHARED狀態(tài)。如果只顯示有DEDICATED,則不能說明服務器就一定工作在專用服務器下面,此時只能說明有可能啟動了共享模式,但是無連接。
此外,還可以通過視圖V$SHARED_SERVER、V$DISPATCHER及V$CIRCUIT視圖查詢是否啟用了共享服務器連接。若V$SHARED_SERVER有記錄,且STATUS字段為“WMT(COMMON)”,則說明啟動共享;若STATUS為TERMINATED或者無記錄,則說明沒有啟動共享服務器。V$DISPATCHER有無記錄都不能說明啟動共享服務器,只能說明是配置了DISPATCHERS參數(shù)。V$CIRCUIT有記錄說明當前有使用共享模式的連接,無記錄則不能判定服務器模式。其實通過命令“l(fā)snrctlservices<listenername>”也可以判斷是否啟用了共享服務器連接。
當服務器采用專用服務器模式時,客戶端只能使用專用模式連接,也就是在CONNECT_DATA數(shù)據(jù)中只能使用“SERVER=DEDICATED”。當服務器采用共享服務器模式時,客戶端可以選擇建立共享連接或是專用連接,只要在CONNECT_DATA中指定“SERVER=DEDICATED”或“SERVER=SHARED”。
5.
內存結構主要由什么組成?正確答案:Oracle內存結構主要分共享內存區(qū)與非共享內存區(qū),共享內存區(qū)主要包含SGA(SystemGlobalArea,系統(tǒng)全局區(qū)),非共享內存區(qū)主要由PGA(ProgramGlobalArea,程序全局區(qū))組成,如圖所示。
Oracle實例結構
(1)SGA介紹
SGA(SystemGlobalArea,系統(tǒng)全局區(qū))是Oracle實例的基本組成部分,是Oracle為一個實例分配的一組共享內存緩沖區(qū),保存著Oracle系統(tǒng)與所有數(shù)據(jù)庫用戶的共享信息,包括數(shù)據(jù)維護、SQL語句分析、Redo日志管理等。SGA是實例的主要部分,它在實例啟動時分配。
SGA是動態(tài)的,由參數(shù)SGA_MAX_SIZE決定。查看當前系統(tǒng)的SGA可以使用的最大內存大小的命令是:SHOWPARAMETERSGA_MAX_SIZE。修改SGA最大內存大小的命令是:ALTERSYSTEMSETSGA_MAX_SIZE=1200MSCOPE=SPFILE。因為實例內存的分配是在數(shù)據(jù)庫啟動時進行的,所以,要讓修改生效,必須重啟數(shù)據(jù)庫。當Oracle運行在32位Linux上時,其默認SGA無法超過1.7GB。
在Oracle10g中引入了ASMM(AutomaticSharedMemoryManagement,自動共享內存管理),DBA只需設置SGA_TARGET,Oracle就會自動地對共享池、數(shù)據(jù)緩沖區(qū)、Redo日志緩沖區(qū)、大池、Java池和流池進行自動調配,取消自動調配的方法為設置SGA_TARGET為0。
需要注意的是,Oracle分配內存的單位是granule,即粒度。最小的粒度為4MB,設置大小不到一個粒度按一個粒度計算。在32位操作系統(tǒng)的平臺上,粒度的最大值為16MB。粒度的大小在數(shù)據(jù)庫實例周期內不能被修改。按照粒度為單位分配的組件包括SharedPool、BufferCache(以及不同大小塊的BufferCache)、RedoLogBuffer、JavaPool、StreamsPool和LargePool。粒度的大小參考下表。
通過視圖V$SGAINFO可以查詢當前SGA分配的粒度大小,如下:
下面將對SGA的各個組成部分進行介紹。
1)共享池(SharedPool):緩存了各用戶間可共享的各種結構,例如,緩存最近被執(zhí)行的SQL語句和最近被使用的數(shù)據(jù)定義。共享池主要包括:庫緩存(LibraryCache)、數(shù)據(jù)字典緩存(DataDictionaryCache)、保留池(ReservedPool)和結果緩存(ResultCache)。
①庫緩存(LibraryCache)是存放用戶SQL命令、解析樹和執(zhí)行計劃的區(qū)域。對于庫緩存來說,具體包含以下幾個部分:
共享SQL區(qū)(SharedSQLArea):保存了SQL語句文本,編譯后的語法分析樹及執(zhí)行計劃。查看共享SQL區(qū)的使用率命令為:SELECT(SUM(PINS-RELOADS))/SUM(PINS)”LIBRARYCACHE”FROMV$LIBRARYCACHE;。
私有SQL區(qū)(PrivateSQLArea):包含當前會話的綁定信息以及運行時內存結構。每個發(fā)出SQL語句的會話,都有一個PrivateSQLArea。當多個用戶執(zhí)行相同的SQL語句,此SQL語句保存在共享SQL區(qū)。若是共享服務器模式,則PrivateSQLArea位于SGA的SharePool或LargePool中。若是專用服務器模式,則PrivateSQLArea位于PGA中。
共享PL/SQL區(qū)(SharedPL/SQLArea):保存了分析與編譯過的PL/SQL塊(存儲過程、函數(shù)、包、觸發(fā)器和匿名PL/SQL塊)。
控制結構區(qū)(ControlStructureArea):保存鎖等控制信息。
②數(shù)據(jù)字典緩存(DataDictionaryCache)存放數(shù)據(jù)庫運行的動態(tài)信息,例如表和列的定義,數(shù)據(jù)字典表的權限。查看數(shù)據(jù)字典緩沖區(qū)使用率的SQL為:“SELECT(SUM(GETS-GETMISSES-USAGE-FIXED))/SUM(GETS)"DATADICTIONARYCACHE"FROMV$ROWCACHE;”。
③保留池(ReservedPool)也稱為保留區(qū)域(ReservedArea),是指SharedPool中配置的一個內存保留區(qū)域,這個保留區(qū)域用做當在普通的SharedPool列表中的空間不能用來滿足LargeRequest的內存分配請求而分配大塊的連續(xù)內存塊。當一個內存請求大于隱含參數(shù)“_SHARED_POOL_RESERVED_MIN_ALLOC”(默認:4400bytes,如果系統(tǒng)經常出現(xiàn)ORA-04031錯誤,基本上都是請求大于4400的內存塊,那么就可能需要增加SHARED_POOL_RESERVED_SIZE參數(shù)設置)的值時就是一個LargeRequest,反之當內存請求小于“_SHARED_POOL_RESERVED_MIN_ALLOC”時就是一個SmallRequest。另外關于ReservedPool還有兩個參數(shù)需要關注一下,一個是SHARED_POOL_RESERVED_SIZE,另外一個是隱含參數(shù)“_SHARED_POOL_RESERVED_PCT”(默認:5%)。通過SHARED_POOL_RESERVED_SIZE可以為ReservedPool指定一個大小,也可以通過“_SHARED_POOL_RESERVED_PCT”來為SharedPool指定一個比例。如果這兩個參數(shù)同時設置了,那么就會以“_SHARED_POOL_RESERVED_PCT”為準。參數(shù)SHARED_POOL_RESERVED_SIZE的缺省值是SHARED_POOL_SIZE的5%,最小值為5000bytes,最大不得超過SHARED_POOL_SIZE的50%。通過視圖V$SHARED_POOL_RESERVED可以查到保留池的統(tǒng)計信息。其中字段REQUEST_MISSES記錄了沒有立即從空閑列表中得到可用的大內存段請求次數(shù),這個值理想狀態(tài)下要為0。當REQUEST_FAILURES大于0時,則需要增加SHARED_POOL_SIZE和SHARED_POOL_RESERVED_SIZE的空間。當REQUEST_MISS等于0,或是FREE_MEMORY大于等于SHARED_POOL_RESERVED_SIZE的空間時,則增加SHARED_POOL_RESERVED_SIZE的空間。MAX_USED_SPACE字段可以用來判斷保留池的大小是否合適。保留區(qū)使用SharedPool的LRU鏈表來管理內存塊??梢酝ㄟ^如下的SQL語句來查詢保留池的命中率(HitRatio),杳詢語句如下:
以上結果應該都要小于1%,如果大于1,那么應該考慮加大SHARED_POOL_RESERVED_SIZE。
結果緩存(ResultCache)是存放SQL查詢結果和PL/SQL函數(shù)查詢結果的區(qū)域。
共享池的大小由參數(shù)SHARED_POOL_SIZE決定。只要將初始化參數(shù)STATISTICS_LEVEL設置為TYPICAL(默認值)或ALL,就能啟動對SharedPool的建議功能,若設置為BASIC,則關閉建議功能。使用如下的SQL語句可以查詢到Oracle所建議的SharedPool的大?。?/p>
第一列表示Oracle所估計的SharedPool的尺寸值,其他列表示在該估計的SharedPool大小下所表現(xiàn)出來的指標值??梢灾饕P注ESTD_LC_TIME_SAVED_FACTOR列的值,當該列值為1時,表示再增加SharedPool的大小對性能的提高沒有意義。對于上例來說,當SharedPool為200MB時,達到最佳大小。對于設置比200MB更大的SharedPool來說,就是浪費空間,沒有更多的好處了。
2)數(shù)據(jù)緩沖區(qū)(DatabaseBufferCache):也稱為數(shù)據(jù)庫緩沖區(qū)高速緩存,用于緩存從數(shù)據(jù)文件中檢索出來的數(shù)據(jù)塊,可以大大提高查詢和更新數(shù)據(jù)的性能,是數(shù)據(jù)庫實例的重要組成部分。參數(shù)DB_CACHE_SIZE可指定數(shù)據(jù)緩沖區(qū)的大小,需要在參數(shù)文件中靜態(tài)修改。Oracle在處理某個查詢時,服務器進程會在BufferCache中查找它所需的所有數(shù)據(jù)塊。如果未在BufferCache中找到所需要的數(shù)據(jù)塊,那么服務器進程會從數(shù)據(jù)文件中讀取所需的數(shù)據(jù)塊,并在BufferCache中添加一個副本。因為關于同一數(shù)據(jù)塊的后續(xù)請求可能會在內存中找到該數(shù)據(jù)塊,因此,這些請求可能不需要進行物理讀操作。BufferCache中的內存塊有4種狀態(tài):
①Pinned:當前塊正在被某個進程讀取到Cache或正寫到磁盤,即當前正在被訪問的數(shù)據(jù)塊,可防止多個會話同時對同一數(shù)據(jù)塊進行寫操作。此時,其他會話正等待訪問該塊。
②Clean:服務器進程從數(shù)據(jù)文件中讀入的Block且還沒有被其他進程所修改或者后臺進程DBWn將DirtyBuffer寫入到數(shù)據(jù)文件中的Buffer,該Buffer中的內容與數(shù)據(jù)文件中的Block一致。該狀態(tài)的數(shù)據(jù)塊是可以立即被移出的候選數(shù)據(jù)塊。
③Free/Unused:Buffer內為空,為實例剛啟動時的狀態(tài)。BufferCache初始化時或者在執(zhí)行altersystemflushbufier_cache以后的Buffer,該Buffer中沒有存放任何內容。此狀態(tài)與“clean”狀態(tài)非常相似,不同之處在于“free/unused”狀態(tài)的緩沖區(qū)尚未使用。
④Dirty:臟數(shù)據(jù),數(shù)據(jù)塊已被修改,需要先被DBWn刷新到磁盤,才能執(zhí)行過期處理(移出緩沖區(qū))。在該狀態(tài)下,該Buffer的內容與數(shù)據(jù)文件中Block的內容不一致。
DatabaseBufferCache中數(shù)據(jù)塊的狀態(tài)轉變如圖所示。
DatabaseBufferCache中數(shù)據(jù)塊的狀態(tài)轉變
數(shù)據(jù)庫高速緩沖區(qū)的主要功能是用來暫時存放最近讀取白數(shù)據(jù)庫中的數(shù)據(jù),也就是數(shù)據(jù)文件(DataFile)內的數(shù)據(jù),而數(shù)據(jù)文件是以數(shù)據(jù)塊(Block)為單位,因此,數(shù)據(jù)庫高速緩沖區(qū)中的大小是以塊為基數(shù)。當用戶通過應用程序第一次向Oracle數(shù)據(jù)庫發(fā)出查詢請求時,Oracle會先在BufferCache內尋找該數(shù)據(jù),如果有該請求所需要的數(shù)據(jù),那么就直接從BufferCache傳回給用戶,這稱為緩存命中(CacheHit),這樣就可以減少硬盤上的I/O次數(shù)。如果Oracle發(fā)現(xiàn)用戶要的數(shù)據(jù)并不在BufferCache里,就稱為緩存失誤(CacheMiss),Oracle會從數(shù)據(jù)庫中讀取所需要的數(shù)據(jù)塊,先放入BufferCache中,再傳送給用戶。該區(qū)域內的數(shù)據(jù)塊通過LRU(LeastRecentlyUsed,最近最少使用)算法管理。LRU將BufferCache中的所有的Clean和Free狀態(tài)的Buffer按照它們被讀取的頻率連接起來(冷端:最少使用的;熱端:最常被使用的;在服務器進程將磁盤的Block讀取到BufferCache時,會先覆蓋冷端的Buffer)。
BufferCache可以分為多個緩沖池:
①回收池(RecyclePool):放到回收池中的數(shù)據(jù),只要空間不夠用,它們馬上就會被釋放出來,即回收池中的數(shù)據(jù)會最先被替換出內存,很少使用的數(shù)據(jù)放在該區(qū)。被放在回收池中的數(shù)據(jù)塊不會被反復使用。也就是說,這些數(shù)據(jù)塊只在事務(Transaction)還存在時才會被用到,一旦事務結束,就會被釋放出來。回收池的大小最好是默認池的1/2,通過DB_RECYCLE_CACHE_SIZE參數(shù)指定回收池的大小。該緩存不參與ASMM的動態(tài)管理,不能自動調整大小。默認未啟用,大小為0。手工修改指定值后,DefaultPool的空間將被相應的減少。
②保留池(KeepPool):當數(shù)據(jù)被放到保留池里時,就代表這個數(shù)據(jù)是需要常常被重復使用的。保留池中的數(shù)據(jù)不會被替換出去,可以將常用的小表放置在該區(qū)可以降低I/O操作??梢酝ㄟ^DB_KEEP_CACHE_SIZE參數(shù)指定保留池的火小。該區(qū)域的大小不會被ASMM自動調節(jié)。默認未啟用,大小為0,當手工修改指定該值后,DefaultPool的空間將被相應的減少。
③默認池(DefaultPool):當沒有指定對象存儲的緩沖池時,數(shù)據(jù)就會放在默認池中,相當于一個沒有Keep與Recycle池的實例的BufferCache。也就是說,放在默認池的數(shù)據(jù)利用的是LRU機制。通過DB_CACHE_SIZE參數(shù)指定默認池的大小。
BUFFER_POOL子句可以在對象的STORAGE子句中為對象指定使用具體的BufierPool。如果現(xiàn)有對象沒有明確指定BufferPool,那么默認都指定為DefaultBufferPool。可以使用CREATE或ALTER語句指定對象存儲的繡沖油:
在同一個數(shù)據(jù)庫中,支持多種大小的數(shù)據(jù)塊緩存。通過DB_nK_CACHE_SIZE參數(shù)指定,如:
①DB_CACHE_SIZE(指定標準塊(這里為8K)的緩存區(qū))。
②DB_2K_CACHE_SIZE(指定塊大小為2K的緩存區(qū))。
③DB_41K_CACHE_SIZE(指定塊大小為4K的緩存區(qū))。
④DB_16K_CACHE_SIZE(指定塊大小為16K的緩存區(qū))。
⑤DB_3ZK_CACHE_SIZE(指定塊大小為32K的緩存區(qū))。
標準塊緩沖區(qū)大小由DB_CACHE_SIZE指定。如標準塊為nK,則不能通過DB_nK_CACHE_SIZE來指定標準塊緩沖區(qū)的大小,應由DB_CACHE_SIZE指定。
當數(shù)據(jù)庫高速緩沖區(qū)需要讀取或寫回數(shù)據(jù)到數(shù)據(jù)文件中時,都需要通過DBWn這個后臺進程來協(xié)助處理,而參數(shù)DB_WRITER_PROCESSES主要設置要由幾個DBWn來協(xié)助處理。在此建議不要超過系統(tǒng)CPU的個數(shù),如果設置的值超過了CPU的個數(shù),那么超過的那些是無法起作用的。
當參數(shù)DB_CACHE_ADVICE設置為ON(當STATISTICS_LEVEL為TYPICAL或ALL時,DB_CACHE_ADVICE參數(shù)值默認為ON)時,表示開啟DB_CACHE_ADVICE功能。當開啟參數(shù)DB_CACHE_ADVICE后,經過一段時間,Oracle就會自動收集足夠的相關統(tǒng)計數(shù)據(jù),并預測出DB_CACHE_SIZE在不同大小情況下的性能數(shù)據(jù),而這些數(shù)據(jù)就是通過V$DB_CACHE_ADVICE視圖來顯示的,因此,可以根據(jù)這些數(shù)據(jù)對DB_CACHE_SIZE做相關的調整,以達到最佳情況。
查詢視圖V$DBCACHE_ADVICE如下:
由以上結果可以知道,當ESTD_PHYSICAL_READ_FACTOR為1時,最佳的DB_BUFFER_SIZE是48,因為在這之后再進行調整對降低I/O的影響有限,所以該系統(tǒng)最佳的BufferCache的大小為48M。
3)Redo日志緩沖區(qū)(RedoLogBuffer):對數(shù)據(jù)庫進行修改的任何事務(Transaction)在記錄到Redo日志文件之前都必須首先放到Redo日志緩沖區(qū)中。Redo日志緩沖區(qū)中的內容將被后臺進程LGWR寫入聯(lián)機Redo日志文件(OnlineRedoLogFiles)中。Redo日志緩沖區(qū)是一個循環(huán)緩存區(qū),在使用時從頂端向底端寫入數(shù)據(jù),然后再返回到緩沖區(qū)的起始點循環(huán)寫入。Oracle中所有的DML和DDL操作都會記錄日志,即便沒有提交的DML操作也會記錄日志,在指定了NOLOGGING時,也會記錄一些日志。Redo日志緩沖區(qū)大小由參數(shù)LOG_BUFFER決定,需要在參數(shù)文件中靜態(tài)修改。服務器進程(ServerProcess)及后臺進程(BackgroundProcess)對Oracle的變更記錄會寫到Redo日志緩沖區(qū),這些變更的數(shù)據(jù)都在內存中的Redo日志緩沖區(qū)中以RedoEntry(重做條目,也可稱為RedoRecord)的方式存儲。RedoEntry是Oracle從用戶會話占用的內存里將這些變更的記錄復制到Redo日志緩沖區(qū)內,其在內存中是一段連續(xù)的內存塊,Oracle利用后臺進程LGWR在適當?shù)臅r機將Redo日志緩沖區(qū)中的信息(也就是RedoEntry)寫回到聯(lián)機Redo日志文件內,當萬一數(shù)據(jù)庫崩潰時,可以進行必要的恢復。后臺進程LGWR將RedoEntry寫回到聯(lián)機Redo日志文件的時機包括:①用戶發(fā)出提交命令(COMMIT);②每隔3s;③Redo日志緩沖區(qū)空間剩余不到2/3;④Redo日志緩沖區(qū)內的數(shù)據(jù)達到1MB;⑤在發(fā)生聯(lián)機Redo日志切換(LogSwitch)時;⑥在DBWn進程將修改的緩沖區(qū)寫入磁盤時(如果相應的Redo日志數(shù)據(jù)尚未寫入磁盤)。
4)大池(LargePool):SGA中一個可選的內存區(qū)域,大池用來分配大塊的內存,處理比共享池更大的內存,用來緩解SharedPool的負擔。大池主要用在3種情況下,①若是共享服務器模式時,則在LargePool中分配UGA,若LargePool沒有分配則在SharedPool中分配。若是專用服務器(多線程服務器MTS,Multi-ThreadedServer)連接,則UGA在PGA中創(chuàng)建。②語句的并行查詢(ParallelExecuteionofStatements),允許進程間消息緩沖區(qū)的分配,用來協(xié)調并行查詢服務器。③恢復管理器RMAN,用于RMAN磁盤I/O緩沖區(qū)。大池的大小由參數(shù)LARGE_POOL_SIZE決定,可以動態(tài)修改。大池也使用共享池的閂鎖機制,但和共享池不同的是,大池并不使用LRU機制,而是使用LargeMemoryLatch的保護,因此,大池中緩沖區(qū)內的數(shù)據(jù)不會被置換出來。大池內的數(shù)據(jù)會利用用戶的會話來控制分配和釋放大池的空間。如果大池的空間不足,那么也會出現(xiàn)ORA-04031錯誤。
①Java池(JavaPool):為Java命令的語法分析提供服務。Java池也是SGA中的一塊可選內存塊,大小由參數(shù)JAVA_POOL_SIZE決定。在Oracle10g以后,提供了一個新的Java池的建議功能,以輔助調整Java池的大小,而建議的統(tǒng)計數(shù)據(jù)可以通過視圖V$JAVA_POOL_ADVICE來查詢。
②流池(StreamsPool):被Oracle流所使用,主要提供專門的Streams復制功能,流池是可選用內存塊,它也屬于SGA中的可變區(qū)域。參數(shù)STREAMS_POOL_SIZE可以指定流池的大小。如果設置為0,那么當?shù)谝淮问褂肧treams復制功能時,Oracle會自動建立此塊區(qū)域,而自動建立的大小為共享池大小的10%。Oracle也提供了一個流池的建議功能,來協(xié)助調整流池的大小,而建議的統(tǒng)計數(shù)據(jù)可以通過視圖V$STREAMS_POOL_ADVICE來查詢。
(2)PGA介紹PGA(ProgramGlobalArea,程序全局區(qū))是單個Oracle進程使用的內存區(qū)域,為每個連接到Oracle數(shù)據(jù)庫的用戶進程保留的內存,不屬于實例的內存結構。它含有單個進程工作時需要的數(shù)據(jù)和控制信息。PGA是非共享的,只有服務進程本身才能夠訪問它自己的PGA區(qū)。PGA在進程創(chuàng)建時分配,進程結束時釋放。PGA的內容隨服務器的模式(專用模式/共享服務器模式)不同而不同。PGA的大小由參數(shù)PGA_AGGREGATE_TARGET決定,可動態(tài)修改。PGA結構如圖所示。
PGA結構
PGA有如下幾個組件:
1)PrivateSQLArea(私有SQL區(qū)):參考SharedPool部分的介紹。
2)CursorandSQLAreas(游標和SQL區(qū)):OraclePro*C程序(Pro*C是Oracle提供的應用程序專用開發(fā)工具,它以C語言為宿主語言,能在C程序中嵌入SQL語句,進行數(shù)據(jù)庫操作)的應用程序開發(fā)人員或Oracle調用接口(OracleCallInterface,OCI)程序可以顯式打開游標或處理私有SQL區(qū)。
3)SessionMemory(會話內存):保存會話的變量(例如,登錄信息)及其他與會話相關的信息。在共享服務器模式下,SessionMemory是共享的。
4)WorkArea(工作區(qū)):PGA的一大部分被分配給WorkArea,用來執(zhí)行如下操作:
①基于排序的操作,GROUPBY、ORDERBY、ROLLUP和窗口函數(shù)。由于排序需要內存空間,Oracle利用該內存排序數(shù)據(jù),這部分空間稱為排序區(qū)。排序區(qū)存在于請求排序的用戶進程的內存中,該空間的大小為適應排序數(shù)據(jù)量的大小,可增長,但受參數(shù)SORT_AREA_SIZE所限制。
②HASH連接,大小受參數(shù)HASH_AREA_SIZE所限制。
③位圖合并,大小受參數(shù)BITMAP_MERGE_AREA_SIZE所限制。
④位圖創(chuàng)建,大小受參數(shù)CREATE_BITMAP_AREA_SIZE所限制。
⑤批量裝載操作使用的寫緩存。
PGA和SGA最明顯的差別在于,PGA不是共享內存,是私有不共享的。用戶對數(shù)據(jù)庫發(fā)起的無論查詢還是更新的任何操作,都是在PGA先預處理,然后接下來才進入實例區(qū)域,由SGA和系列后臺進程共同完成用戶發(fā)起的請求。PGA起到的具體作用主要有三點:第一,保存用戶的連接信息,如會話屬性、綁定變量等;第二,保存用戶權限等重要信息,當用戶進程與數(shù)據(jù)庫建立會話時,系統(tǒng)會將這個用戶的相關權限查詢出來,然后保存在這個會話區(qū)內;第三,當發(fā)起的指令需要排序的時候,PGA正是這個排序區(qū),如果在內存中可以放下排序的尺寸,就在內存PGA區(qū)內完成,如果放不下,超出的部分就在臨時表空間中完成排序,也就是在磁盤中完成排序。
(3)UGA介紹UGA(UserGlobalArea)保存了會話信息,會話總能訪問這部分內存。UGA的位置取決于會話連接到Oracle的方式。如果是專用服務器連接,那么UGA在PGA中創(chuàng)建;如果是共享服務器連接,那么UGA在SGA的LargePool中創(chuàng)建,若LargePool沒有分配則在SharedPool中分配。
PGA和UGA兩者間的區(qū)別跟一個進程和一個會話之間的區(qū)別是類似的。盡管進程和會話之間一般都是一對一的關系,但實際上比這個更復雜。一個很明顯的情況是MTS配置,會話往往會比進程多得多。在這種配置下,每一個進程會有一個PGA,每一個會話會有一個UGA。PGA所包含的信息與會話是無任何關聯(lián)的,而UGA包含的信息是以特定的會話為基礎的。
(4)自動PGA內存管理(AutomaticPGAMemoryManagement)若設置參數(shù)PGA_AGGREGATE_TARGET為非0,則啟用自動PGA內存管理,并忽略所有*_AREA_SIZE的設置,例如SORT_AREA_SIZE、HASH_AREA_SIZE等。默認為啟用PGA的自動管理,Oracle根據(jù)SGA的20%來動態(tài)調整PGA中專用于WorkArea部分的內存大小,最小為10MB。
如果設置參數(shù)WORKAREA_SIZE_POLICY為MANUAL(默認值是AUTO),就代表此數(shù)據(jù)庫的PGA管理模式屬于手動管理模式,且在此模式下必須設置SORT_AREA_SIZE、HASH_AREA_SIZE等相關參數(shù)。
當自動PGA內存管理功能打開后,可以從V$PGA_TARGET_ADVICE中得到相關的指導數(shù)據(jù),進而評估PGA_AGGREGATE_TARGE是否需要調整。該視圖的ESTD_OVERALLOC_COUNT列表示需要額外分配的PGA內存,如果此數(shù)值不是0,就表示PGA_AGGREGATE_TARGE設置得太小,需要調整。
從上面的查詢中可以看出當設置PGA的大小為228MB時,可以消除PGA過載的情形。
(5)SHOW
SGA和V$SGA的結果區(qū)別SHOWSGA的結果比V$SGA的結果多一行“TotalSystemGlobalArea”數(shù)據(jù)。其實,SHOWSGA的結果來源于V$SGA視圖。運行命令“vi$ORACLE_HOME/bin/sqlolus”打開sqlplus文件,匹配SGA可以發(fā)現(xiàn)這么一行代碼:
該行代碼的結果和執(zhí)行showsga可以得到一樣的結果,如下:
在以上結果中,各部分的含義如下:
1)TotalSystemGlobalArea:顯示目前此SGA的大小,包括FixedSize、VariableSize、Databasebuffers和RedoBuffers的大小總和。
2)FixedSize:這里存儲了SGA各部分組件的相關信息,主要是作為引導SGA創(chuàng)建的區(qū)域,Oracle通過這個區(qū)找到SGA其他區(qū),類似一個SGA各個組件的索引。這部分是Oracle內部使用的一個區(qū),包括了數(shù)據(jù)庫與實例的控制信息、狀態(tài)信息、字典信息等。當實例被打開時,此塊區(qū)域就被固定住而不能做任何變動,此區(qū)域也可稱為FixedSGA。不同平臺和不同版本下這部分的大小可能不一樣。
3)VlariableSize:包括SharedPool、JavaPool、LargePool、StreamsPool、游標區(qū)和其他結構。由于這些內存塊都是可動態(tài)分配的,所以統(tǒng)稱為VariableSize。
4)DatabaseBuffers:顯示數(shù)據(jù)庫高速緩沖區(qū)的大小,是SGA中最大的地方,決定數(shù)據(jù)庫性能。為DB_CACHE_SIZE、DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE、DB_NK_CACHE_SIZE的總大小,當然這是SGA_TARGET為0的情況,也就是手動SGA管理模式下,如果是自動SGA管理(SGA_TARGET>0),那么這個值根據(jù)SGA的分配情況自動進行調整。
5)RedoBuffers:顯示Redo日志緩沖區(qū)的大小,這部分是實際分配的RedoLogBuffer的大小,由初始化參數(shù)LOG_BUFFER根據(jù)SGA的最小分配單位granule向上取整得到。
(6)和內存相關的比較有用的視圖
1)V$SGASTAT主要記錄了有關SGA的統(tǒng)計信息以及內存分配的情況,對于發(fā)生ORA-04031錯誤有很重要的參考價值。其中的信息由3個字段組成,依序是:Name(SGA內存塊的名稱)、Bytes(內存塊的大小)、Pool(內存所屬的內存塊)。
以下的語句可查詢內存塊還剩余多少使用空間:
以下的語句可查詢共享池的使用情況比率:
2)V$SGA_DYNAMIC_COMPONENTS記錄了SGA內各個組件的情況,包括SGA的各個內存塊的放大和縮小情況,且所提供的信息是經過統(tǒng)計的。
3)V$LIBRARYCACHE的內容包含了關于庫緩存的性能統(tǒng)計信息,對于共享池的性能優(yōu)化有很大幫助。此視圖中必須特別注意PIN和GET的命中率或未命中率,當命中率小于99%或未命中率大于1%時,說明HardParse過多,可能需要加大共享池或是使用綁定變量等優(yōu)化的動作。
6.
什么是ASMM和AMM?正確答案:ASMM(AutomaticSharedMemowManagement,自動共享內存管理)是Oracle10g引入的概念。通過使用ASMM,就不需要手工設置相關內存組件的大小,而只為SGA設置一個總的大小,Oracle的MMAN進程(MemoryManagerProcess,內存管理進程)會隨著時間推移,根據(jù)系統(tǒng)負載的變化和內存需要,自動調整SGA中各個組件的內存大小。ASMM的SGA包含的組件及對應參數(shù)見表。
在Oracle10g中,必須將STATISTICS_LEVEL參數(shù)設置為TYPICAL(默認值)或者ALL才能啟用ASMM功能,如果將其值設置為BASIC,那么會禁用很多新特性,比如像AWR、ASMM等。如果使用SQL*Plus來設置ASMM,那么必須先把SGA中包含的組件的值設置為0。通過設置SGA_TARGET參數(shù)為非零值來啟用ASMM功能。
可以通過以下SQL來計算SGA_TARGET的值:
設置SGA_TARGET的值,可以直接修改初始化參數(shù)文件后重啟數(shù)據(jù)庫,或者通過下面SQL命令進行修改:
示例如下:
在啟用ASMM后,Oracle會自動調整SGA內部組件大小。若再手動指定某一組件值,則該值為該組件的最小值。例如,手動設置SGA_TARGET=8G,SHARED_POOL_SIZE=1G,則ASMM在自動調整SGA內部組件大小時,保證SharedPool不會低于1G。當設置了SGA_TARGET參數(shù)后,Oracle將會收集SGA相關的統(tǒng)計數(shù)據(jù),并通過V$SGA_TARGET_ADVICE呈現(xiàn)出來,因此,可以根據(jù)這些指導SGA_TARGET做相關的調整,以達到最佳情況。
Oracle10g的ASMM實現(xiàn)了自動共享內存管理,但是具有一定的局限性。所以,在Oracle11g中,Oracle引入了AMM(AutomaticMemoryManagement,自動內存管理)的概念,實現(xiàn)了全部內存的自動管理。DBA可以僅僅通過設置一個目標內存大小的初始化參數(shù)(MEMORY_TARGET)和可選最大內存大小初始化參數(shù)(MEMORY_MAX_TARGET)就可以在大多數(shù)平臺上實現(xiàn)AMM。AMM可以使實例總內存保持相對穩(wěn)定的狀態(tài),Oracle基于MEMORY_TARGET的值來自動調整SGA和PGA的大小。如果內存發(fā)生變化,實例會自動在SGA和PGA之間做調整。若啟用了AMM功能,而SGA_TARGET和PGA_AGGREGATE_TARGET沒有顯式的被設置,則默認SGA_TARGET為MEMORY_TARGET的60%,PGA_AGGREGATE_TARGET為MEMORY_TARGET的40%。
MEMORY_TARGET是動態(tài)初始化參數(shù),可以隨時修改該參數(shù)的值而不用重啟數(shù)據(jù)庫。MEMORY_MAX_TARGET作為一個內存上限值,是一個靜態(tài)參數(shù),它是MEMORY_TARGET可以被配置的最大值。
當LOCK_SGA初始化參數(shù)的值設置為TRUE時,不能啟用AMM,該參數(shù)的值默認為FALSE。
如果在創(chuàng)建數(shù)據(jù)庫的時候未啟用AMM,那么可以在建庫后啟用它,啟用AMM需要重啟數(shù)據(jù)庫,具體步驟如下:
1)查詢SGA_TARGET和PGA_AGGREGATE_TARGET的值,從而確定MEMORY_TARGET的最小值。
2)確定白系統(tǒng)啟動以來PGA的最大值,單位為bytes。
3)通過以下方法來計算出SGA_TARGET的最大值。
例如:在這里,SGA_TARGET的值為1648M,PGA_AGGREGATE_TARGET的值為409M,PGA的最大值為248586240/1024/1024=237M,所以,MEMORY_TARGET的值至少為1648+409=2057M。
4)設置系統(tǒng)參數(shù)啟用AMM。
另外需要說明的一點是,使用AMM經常出現(xiàn)的一個錯誤是“ORA-00845:MEMORY_TARGETnotsupportedonthissystem”。
這個錯誤原因是操作系統(tǒng)不支持MEMORY_TARGET參數(shù)或/dev/shm的大小設置不正確。解決方法就是將/dev/shm的值增大,至少需要大于數(shù)據(jù)庫參數(shù)MEMORY_MAX_TARGET的值。修改步驟如下:
再次啟動數(shù)據(jù)庫就可以正常啟動了。
由于AMM不支持HugePage,而ASMM支持HugePage,所以,在生產庫上強烈推薦使用ASMM。有關ASMM和AMM的區(qū)別見表。
7.
如何解決ORAL-04030和ORA-04031錯誤?正確答案:ORA-04030和ORA-04031都是典型的內存分配錯誤,下面分別講解。
(1)ORA-04030錯誤
ORA-04030報錯形如“ORA-04030'outofprocessmemorywhentryingtoallocate%sbytes(%s,%s)'”,該錯誤意味著OracleServer進程無法從操作系統(tǒng)分配更多內存。該內存由PGA組成,其內容取決于服務器配置。對于專用的服務器進程,內存包含堆棧以及用于保存用戶會話數(shù)據(jù)、游標信息和排序區(qū)的UGA。在多線程服務器(共享服務器)中,UGA被分配在SGA中,所以在這種配置下UGA不是造成ORA-04030錯誤的原因。因此,ORA-04030表示進程需要更多內存(堆棧、UGA或PGA)來執(zhí)行其任務。
ORA-04030錯誤可能是進程本身導致的,例如進程需要過多的內存,或者一些其他原因導致操作系統(tǒng)內存被耗盡,例如,SGA分配太大或系統(tǒng)虛擬內存(物理內存+交換空間)中要容納的進程過多。許多操作系統(tǒng)會對單個進程能夠獲取的內存量加以限制,以便自我保護。在大部分情況下,發(fā)生ORA-04030錯誤的進程并非總是內存損耗的元兇,錯誤的發(fā)生僅僅是因為此進程無法取得所需的內存造成的。
MOS文檔(ID1548826.1和199746.1)對該錯誤有非常詳細的說明。如果發(fā)生了ORA-04030錯誤,那么會在告警日志中記錄詳細信息。若發(fā)生ORA-04030錯誤,則可以從以下幾個方面去排查該錯誤:
1)是否仍然有足夠的可用內存?
主要使用操作系統(tǒng)特定的工具(top、topas、vmstat、swapon-s)來檢查內存使用情況。如果有足夠的內存可用,那么就需要檢查操作系統(tǒng)是否存在強制限制。如果內存已被耗盡,那么就需要找出內存被用到了哪些地方。
2)是否發(fā)置了操作系統(tǒng)限制?
如果仍有足夠的內存可用,那么有可能是進程需要使用的內存量是不被允許的。使用命令“ulimit-a”查看操作系統(tǒng)限制。尤其對于“datasegsize”選項,應該設置為unlimited。在RAC或GRID環(huán)境中,由于數(shù)據(jù)庫監(jiān)聽是通過CRS進行啟動,所以監(jiān)聽繼承了root用戶的ulimit限制。如果在root的ulimit限制中data(kbytes)的限制為1310KB,那么表示每個通過監(jiān)聽連接的進程能分配的內存資源不能超過1310KB。
3)是否設置了Oracle限制?
查詢參數(shù)PGA_AGGREGATE_TARGET的大小,該參數(shù)限制一個實例可以分配的PGA總量。以下查詢用于查找分配給所有會話的PGA區(qū)的內存總量:
4)哪個進程需要的內存過多?
一些操作會需要大量的進程內存,例如,大型的PL/SQL表或大量的排序操作。在這些情況下,在出現(xiàn)錯誤ORA-04030之前,進程將會運行一段時間,所以,可以在這段時間內找出內存分配的位置和原因??梢允褂靡韵虏樵儊聿檎宜蠴racle進程的PGA和UGA大?。?/p>
通常,從操作系統(tǒng)的角度來確認進程內存使用情況,是一個好辦法。畢竟,使用過多內存的不一定是OracleServet。進程。
5)如何收集有關進程實際正在執(zhí)行的任務的信息?
可以做heapdump,然后分析dump結果:
或者使用event,如下:
設置系統(tǒng)級事件來產生ORA-04030錯誤時的trace文件,設置evem如下:
得到報錯的dump文件后,關閉生成event:
(2)ORA-04031錯誤
SGA中的內存池由不同大小的內存塊組成。當數(shù)據(jù)庫實例啟動時,大量的內存塊被分配到不同的池中并且由空閑列表哈希Bucket追蹤。隨著時間推移,由于內存塊被分配和回收,內存塊會根據(jù)它們的大小在池中的不同空閑列表Bucket中移動。
當Oracle不能找到一個足夠大的內存塊來滿足用戶操作所帶來的內部分配請求的時候,ORA-04031錯誤就可能在SGA的任何一個池中[LargePool、JavaPool、StreamsPool(10g新增)、SharedPool]出現(xiàn)。ORA-04031錯誤信息會指出哪個池出了問題。如果錯誤指出問題不在共享池中,那么這通常意味著對應用環(huán)境來說,出問題的池配置的太小了??梢詫⒊鰡栴}的池增大,然后繼續(xù)觀察后續(xù)的問題。如果使用Oracle10g的ASMM功能,那么MMAN進程會隨著時間推移,嘗試根據(jù)內存需要收縮或者增大SGA中不同組件的大小。如果在LargePool、StreamsPool或者JavaPool中遇到了ORA-04031錯誤,那么可以通過增大SGA_TARGET,使MMAN可以管理更多的內存。
MOS文檔(ID2016002.1和146599.1)對ORA-04031有非常詳細的說明。
在Oracle9i和之后的版本,共享池可以被劃分為子池。每個子池是一個小號的共享池,有它自己的空閑列表,內存結構條目和LRU列表。這是一個對共享池和大池的可擴展性的改變,現(xiàn)在每一個子池都由一個ChildLatch來保護,因此可以增加這些池的吞吐量。這意味著不再有之前版本的對于共享池和大池的單獨Latch的競爭。共享池中的保留區(qū)域也被平均地劃分到每個子池中。
在Oracle或者更高版本中,當發(fā)生ORA-04031錯誤時,會生成一個trace文件(通過_4031_dump_bitvec參數(shù)控制)。ORA-04031的報錯形式如下:
在這個例子中,問題發(fā)生在共享池。錯誤消息也包含內存請求失敗的大小的信息。在這里,請求SQLArea中4192bytes時失敗,并且發(fā)生在第6個子池中。
子池的個數(shù)跟以下3個方面相關:
1)CPU的個數(shù)系統(tǒng)中每4個CPU可以分配一個子池,最多分配7個子池,由參數(shù)CPU_COUNT控制。
2)參數(shù)SHARED_POOL_SIZE大小若ASMM或AMM沒有啟用(即手動管理內存,SGA_TARGET和MEMORY_TARGET都沒有設置),則在子池的內存分配原則見表。
若啟用了ASMM或AMM,參數(shù)SHARED_POOL_SIZE被顯式地設置了值,則使用上表的分配原則。如果沒有顯式地設置該參數(shù)的值,那么SHARED_POOL_SIZE的值取SGA_TARGET的50%。如果使用的是AMM,則SGA_TARGET的值取MEMORY_TARGET的60%。
3)隱含參數(shù)“_KGHDSIDX_COUNT”的大小,默認為1,表示1個子池。設置的SQL命令為:“ALTERSYSTEMSET"_KGHDSIDX_COUNT"=2SCOPE=SPFILE;”。
在以上規(guī)則中,若設置了隱含參數(shù)“_KGHDSIDX_COUNT”為大于1的值,則以該參數(shù)為準,否則取1)和2)中的最小值。例如,如果在Oracle11g中,有16個CPU,MEMORY_TARGET為4.2G,SGA_TARGET和SHARED_POOL_SIZE的值都為0,那么16個CPU可以分配4個子池,SHARED_POOL_SIZE的值為1.26G(4.2×0.6×0.5),可以分配2個子池,每個子池為630MB。由于沒有設置隱含參數(shù)“KGHDSIDX_COUNT”,所以,該系統(tǒng)的子池個數(shù)為MIN(4,2)=2。
子池的創(chuàng)建是在啟動過程中SGA創(chuàng)建時發(fā)生的,所以修改隱含參數(shù)“_KGHDSIDX_COUNT”、SHARED_POOL_SIZE和CPU_COUNT之后,需要重新啟動數(shù)據(jù)庫,子池的數(shù)量才能變動。
具體的子池分配、內存情況及剩余內存情況可以使用如下的SQL語句查詢:
通過以下查詢可以詳細列舉不同子池的Free內存塊情況:
需要注意的是,在ASM環(huán)境中也用到了共享池。在Oracle10gR1版本的ASM實例上有ORA-04031的問題,原因是默認值太小了,不能適應磁盤組管理活動的需要。
當試圖在共享池中分配大塊連續(xù)內存而失敗時,Oracle會首先從池中清理當前不用的對象從而使得空閑內存碎片(chunk:內存塊)得以合并。如果這樣仍然沒有足夠大的單個chunk來滿足分配需要,那么會產生ORA-04031報錯。有許多ORA-04031錯誤直接原因都是由于共享池的大小或調整不當造成的。
在日常維護上可以查詢視圖V$SHARED_POOL_RESERVED,當REQUEST_FAILURES>0時,則說明SharedPool在內存分配上存在一定的問題。
如果問題可以重現(xiàn),那么可在執(zhí)行有問題的SQL語句前,在會話級別對事件進行設置:
從Oracle版本開始,除了在請求heapdump時使用1、2、3或32等級,還可以使用相同等級并加值536870912,這樣將會在此等級上再進一步顯示5個最大的subheaps同時每個subheap下顯示相關5個最大的heapareas。
下面給出分析ORA-04031產生的TRACE文件的一般步驟:
1)首先需要確認報錯的是SGA的哪個池、哪個子池、需要分配哪部分內存、需要分配多大內存等問題。
大部分信息可以從報錯信息直接獲取到。檢查告警日志并查看錯誤是否記錄,但是,不是所有的ORA-04031錯誤都會記錄在告警日志中。如果錯誤被記錄,請檢查是SGA的哪部分收到此錯誤,共享池,大池,Java池或Streams池。找到發(fā)生ORA-04031錯誤時的trace文件。
2)在trace文件中搜索關鍵字“MemoryUtilizationofSubpool”(子池可以直接搜索Subpool)和granulesize(粒度大小),確認子池的個數(shù)及粒度的大小等參數(shù)。
3)找到各個Subpool的使用情況。
從Subpool部分分析哪個組件用的內存最多,freememory還剩多少內存?可能有的子池的freememory已經為0了??梢詮囊晥DV$SGASTAT來檢查是否有組件表現(xiàn)出非正常增長,查詢SQL可以為“SELECT*FROMV$SGASTATAWHEREA.NAME='objstarmemo';”。如果V$SGASTAT中沒有記錄,那么也可以查詢:DBA_HIST_SGASTAT視圖。
①如果用的最多的是SQLA(SQLAREA),那么很可能就是沒有使用綁定變量。
②如果是不常見的組件(例如,objstatmemo),那么很可能就是BUG。如果是BUG,那么可以拿關鍵字去MOS上進行搜索,基本上可以找到相關內容。
在產生的TRACE文件中還需要關注“LIBRARYCACHESTATISTICS”,它代表庫緩存的信息,如下:
在LibraryCache統(tǒng)計信息里,找到“hitratio”百分比,這指示了碎片問題。目標是使得“hitratio”盡可能地接近100%。另外要查看reloads和invalids信息。reloads和invalids很多意味著庫緩存中發(fā)生了很多內存清理,可能意味著應用低效和碎片化。
在AWR中,可以查看“LoadProfile”、“SharedPoolAdvisory”和“LibraryCacheActivity”等部分進行分別分析。
可以通過如下的SQL語句分析ORA-04031出現(xiàn)的次數(shù)和需要分配的字節(jié)數(shù):
其中,KGHLUNFU表示出現(xiàn)ORA-04031的次數(shù),這里是指出現(xiàn)了114次的4031錯誤。KGHLUNFS表示最后一次出現(xiàn)ORA-04031時,申請的分配大小,在以上結果中表示最后申請共享池的大小是4096字節(jié)。
綜上所述,導致ORA-04031錯誤的原因有如下幾點:
1)配置問題,表現(xiàn)為某些池配置過小或配置錯誤。解決辦法為增大相應的池(例如,SharedPool)大小及使用AMM方式來管理內存。如果報錯的是LargePool或JavaPool,那么可以簡單地增大參數(shù)LARGE_POOL_SIZE和JAVA_POOL_SIZE即可。
2)內存中存在大量碎片,導致在分配內存的時候沒有連續(xù)的內存可供分配從而導致ORA-04031錯誤。解決辦法為刷新共享池(ALTERSYSTEMFLUSHBUFFER_CACHE;),該操作在生產庫上要慎用。也可以重啟數(shù)據(jù)庫,重啟數(shù)據(jù)庫會釋放內存,還會清理內存碎片。
3)應用問題,主要表現(xiàn)在:①沒有使用綁定變量,不使用綁定變量會導致庫緩存的過度使用。②有多個子游標,每個子游標都會在共享池中分配空間。③高解析率,可能由于使用了動態(tài)PL/SQL或在高負載階段執(zhí)行DDL語句。每次DDL語句執(zhí)行,都會導致所有引用了這個對象的語句失效。下次執(zhí)行引用了這個對象的SQL語句時,則不得不重新解析并加載到共享池中。④過度的打開CURSOR而不關閉,一般會導致SharedPool中的ORA-04031錯誤。⑤SESSION_CACHED_CURSORS、OPEN_CURSOR設置過高。OPEN_CURSOR如果設置的過大,那么會導致LibraryCache中很多對象都處于pin狀態(tài),而不能釋放,那么當申請SharedPool內存時,通過LRU依然不能找到可用空間,就會導致ORA-04031錯誤。遇見這種情況可以適當減少OPEN_CURSOR的值。
4)Subpool的不均衡使用。Subpool的不均衡使用是使用Subpool的一個缺點,對于這種情況可以設置隱含參數(shù)“ENABLESHARED_POOL_DURATIONS=FALSE”來改變SharedPool的Subpool內存結構的分配方式,或者完全使用AMM。
5)Oracle的BUG導致內存泄露。例如,在一些版本中查詢V$SEGMENT_STATISTICS這樣的視圖導致內存泄露,使SharedPool內存耗光。同樣的情形還有類似于“objstatmemory”、“gcsresources”、“gesresources”等。這類內存通常是在分配時就確定了固定的用途,不能用于其他用途,因此極容易產生碎片。
8.
簡述Oracle數(shù)據(jù)庫塊的結構正確答案:操作系統(tǒng)塊是操作系統(tǒng)讀寫的最小操作單元,也是操作系統(tǒng)文件的屬性之一。當創(chuàng)建一個Oracle數(shù)據(jù)庫時,選擇一個基于操作系統(tǒng)塊的整數(shù)倍大小作為Oracle數(shù)據(jù)庫塊的大小。Oracle數(shù)據(jù)庫讀寫操作則是以Oracle塊為最小單位,而非操作系統(tǒng)塊。
數(shù)據(jù)庫塊也稱邏輯塊或Oracle塊,它對應磁盤上一個或多個物理塊,它的大小由初始化參數(shù)DB_BLOCK_SIZE決定,可以定義數(shù)據(jù)塊為2K、4K、8K、16K、32K甚至更大,默認Oracle塊大小是8K。若一旦設置了Oracle數(shù)據(jù)塊的大小,則在整個數(shù)據(jù)庫生命期間不能被更改。使用一個合適的Oracle塊大小對于數(shù)據(jù)庫的調優(yōu)是非常重要的。
OS在每次執(zhí)行I/O的時候是以OS的塊為單位:Oracle在每次執(zhí)行I/O的時候是以Oracle塊為單位。Oracle塊具有以下特點:
1)最小的I/O單元。
2)包含一個或多個OS塊。
3)大小由參數(shù)DB_BLOCK_SIZE決定。
4)數(shù)據(jù)庫創(chuàng)建時設置,數(shù)據(jù)庫創(chuàng)建后不能更改。
在Oracle中,不論數(shù)據(jù)塊中存儲的是表(TABLE)、索引(INDEX)或簇表(CLUSTERTABLE),其內部結構都是類似的。Oracle塊結構如圖所示。
Oracle塊結構圖
由上圖可以看出,一個Oracle塊大約
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑合同范例 標準版
- 內墻面裝修合同范例
- 柴油續(xù)簽合同范例
- 泥料采購合同范例
- 推廣咨詢費合同范例
- 社區(qū)綠化合同范例
- 廢品轉讓合同范例
- 常用企業(yè)合同范例
- 無息分期還款合同范例
- 清理工程合同范例
- 地形對聚落及交通線路分布影響
- 合成抗菌藥醫(yī)學知識培訓培訓課件
- 部編版道德與法治五年級上冊期末試卷4
- 橋面鋪裝施工質量控制培訓
- 醫(yī)院護理品管圈成果匯報提高24小時出入量準確率完整版本PPT易修改
- 閱讀《合作學習:實用技能、基本原則及常見問題》的體會
- T梁預制臺座占用時間及資源配置分析
- 名中醫(yī)工作室跟師醫(yī)案記錄 (15)
- 在全市高技能人才隊伍建設工作會議上的講話
- 2022機要密碼工作總結機要室工作總結.doc
- 列車牽規(guī)正文
評論
0/150
提交評論