




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