




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
/ORACLE的工作機(jī)制體系結(jié)構(gòu)實例Oracle運(yùn)行的時候,在內(nèi)存中會要開辟一個區(qū)間,這個區(qū)間主要是用于從磁盤(數(shù)據(jù)文件)中讀出數(shù)據(jù)后的一個在內(nèi)存的緩存和處理。而處理這些數(shù)據(jù)的操作,需要有一些系統(tǒng)的后臺進(jìn)程,這些進(jìn)行在Oracle數(shù)據(jù)庫啟動的時候,就開始運(yùn)行,一直在響應(yīng)前臺的操作。實際上,這一個區(qū)間(SGA)和這些后臺進(jìn)程合在一起,就稱為實例。實例是包括SGA區(qū)和后臺進(jìn)程兩個局部的。數(shù)據(jù)庫啟動執(zhí)行若干動作,經(jīng)歷三個階段,分別是未加載、加載和翻開。1、未加載(nomount)可以把數(shù)據(jù)庫啟動的這一階段看作是Oracle實例的啟動。這種方式啟動下可執(zhí)行:重建控制文件、重建數(shù)據(jù)庫。這一啟動命令:?讀取數(shù)據(jù)庫參數(shù)文件。?啟動所需的后臺進(jìn)程并按參數(shù)文件中的定義分配內(nèi)存。?將進(jìn)展情況寫入告警日志文件中。2、加載(mount)在實例啟動加載階段,數(shù)據(jù)庫參數(shù)文件中指定的控制文件被讀取。記住控制文件將數(shù)據(jù)庫各局部聯(lián)系在一起。實例從控制文件中找到以下信息,然后將進(jìn)展寫入告警日志文件。這種方式啟動下可執(zhí)行:數(shù)據(jù)庫日志歸檔、數(shù)據(jù)庫恢復(fù)、重新命名一些數(shù)據(jù)庫文件:?所有數(shù)據(jù)文件和重做日志文件的名稱和位置。?數(shù)據(jù)庫名。?最新系統(tǒng)更改號(SCN)。3、翻開(open)包含在數(shù)據(jù)庫中的每個聯(lián)機(jī)數(shù)據(jù)文件在數(shù)據(jù)庫翻開前必須被同步。在數(shù)據(jù)庫翻開階段:?所有聯(lián)機(jī)數(shù)據(jù)文件的頭與控制文件信息相比較。?所有文件同步后,數(shù)據(jù)庫翻開。當(dāng)數(shù)據(jù)庫關(guān)閉時,取決于它的關(guān)閉方式執(zhí)行不同的任務(wù):?正常(normal)在所有的用戶離線后發(fā)生的正常關(guān)閉。?事務(wù)(transactional)事務(wù)關(guān)閉就是當(dāng)所有的用戶執(zhí)行完當(dāng)前的事務(wù)后,將用戶從數(shù)據(jù)庫上去除。?立即(immediate)立即關(guān)閉就是從數(shù)據(jù)庫去除所有當(dāng)前用戶之后,回退所有未完成的操作。?異常(abort)異常關(guān)閉沒有給數(shù)據(jù)庫任何整理的時機(jī)。這種方式關(guān)閉后需要實行崩潰恢復(fù)。實例是數(shù)據(jù)管理的核心—它做所有的工作,而數(shù)據(jù)庫存儲所有的數(shù)據(jù)。其他啟動方式:?startuprestrict約束方式啟動這種方式能夠啟動數(shù)據(jù)庫,但只允許具有一定特權(quán)的用戶訪問非特權(quán)用戶訪問時,會出現(xiàn)以下提示:ERROR:ORA-01035:ORACLE只允許具有RESTRICTEDSESSION權(quán)限的用戶使用?startupforce強(qiáng)制啟動方式當(dāng)不能關(guān)閉數(shù)據(jù)庫時,可以用startupforce來完成數(shù)據(jù)庫的關(guān)閉先關(guān)閉數(shù)據(jù)庫,再執(zhí)行正常啟動數(shù)據(jù)庫命令?startuppfile=參數(shù)文件名帶初始化參數(shù)文件的啟動方式先讀取參數(shù)文件,再按參數(shù)文件中的設(shè)置啟動數(shù)據(jù)庫?startupEXCLUSIVE***************一個Delete操作的流程:檢查語法、語義(V$ROWCACHE:datadictionarycache),計算HASHVALUE,在session的UGA中進(jìn)行匹配(session_cached_cursors),如果UGA中沒有,在librarychache中匹配(librarychachelocklatch保護(hù)librarychachelock對地址堆的訪問,而后librarychachepinlatch保護(hù)librarycachepin對librarycache中sql相關(guān)信息的訪問)根據(jù)執(zhí)行方案讀取數(shù)據(jù):cachebufferchainlatch保護(hù)能定位到bufferheader并pin住該塊(如果沒有bufferheader,就pin住某個空塊(沒有空塊就產(chǎn)生freebufferwaits),并到數(shù)據(jù)文件中讀取)。如果此時有某個進(jìn)程想訪問該塊,將產(chǎn)生bufferbusywaits。在redologbuffer中記錄delete操作的細(xì)節(jié)。(包括回滾段前后鏡像、數(shù)據(jù)塊前后鏡像)。在相應(yīng)回滾段段頭的事務(wù)表中創(chuàng)立一個undo條目,把將要刪除的記錄創(chuàng)立前鏡像,存放到UndoBlock中。在BufferCache中的相應(yīng)數(shù)據(jù)塊上刪除記錄,并且標(biāo)記相應(yīng)的數(shù)據(jù)塊為Dirty。提交(COMMIT)
1.Oracle產(chǎn)生一個SCN
2.在回滾段事務(wù)表中標(biāo)記該事務(wù)狀態(tài)為commited
3.LGWRFlushLogBuffer到日志文件
3.如果此時數(shù)據(jù)塊仍然在BufferCache中,那么SCN將被記錄到BlockHeader上,這被稱為快速提交(fastcommit)
4.如果dirtyblock已經(jīng)被寫回到磁盤,那么下一個訪問這個block的進(jìn)程將會自回滾段中獲取該事務(wù)的狀態(tài),確認(rèn)該事務(wù)被提交。然后這個進(jìn)程獲得提交SCN并寫回到BlockHeader上。這被稱為延遲塊去除(delayedblockcleanout)。內(nèi)存SGA(系統(tǒng)全局區(qū)、共享全局區(qū))、PGA(進(jìn)程全局區(qū)、私有全局區(qū))內(nèi)存分配原則:10%冗余內(nèi)存,OSSYS進(jìn)程(約1.6G),OSBUFFER(約0.8G),數(shù)據(jù)庫連接消耗內(nèi)存(每個連接約5~8M),PGA(每個連接約2M,V$PGA_TARGET_ADVICE),SGASGAv$sgastat注意showparametersga_max_sizeOracle的內(nèi)存:軟件代碼區(qū)系統(tǒng)全局區(qū)進(jìn)程全局區(qū):包含單個進(jìn)程的數(shù)據(jù)和控制信息排序區(qū)
SGA中的Thefixedarea包含了數(shù)千個原子變量,以及如指向SGA中其它區(qū)域的pointers(指針)等小的數(shù)據(jù)結(jié)構(gòu).通過對fixedtable內(nèi)表X$KSMFSV查詢(如下)可以獲得這些變量的名字,變量類型,大小和在內(nèi)存中的地址.thevariablearea是由largepool和sharedpool組成Sharedpool中永久性的內(nèi)存包含各種數(shù)據(jù)結(jié)構(gòu)如:thebufferheaders,processes,sessions,transactionarrays,theenqueueresources,locks,theonlinerollbacksegmentarrays,variousarraysforrecordingstatistics.其中大局部的SIZE是依靠初始參數(shù)的設(shè)置來確定的.這些初始參數(shù)只能在實例被關(guān)閉的狀態(tài)下才能夠進(jìn)行修改.所以這里說的永久性是針對實例翻開狀態(tài)下的生存期而言.Thevariablearea的在SGA中的SIZES就等于LARGE_POOL_SIZE,SHARED_POOL_SIZE和永久性的內(nèi)存arrays的SIZE三者相加.永久性內(nèi)存arrays的SIZE=thevariablearea-(LARGE_POOL_SIZE+SHARED_POOL_SIZE).數(shù)據(jù)緩沖區(qū)命中率 v$sysstat 這里命中率的計算應(yīng)該是 令x=physicalreadsdirect+physicalreadsdirect(lob) 命中率=100-(physicalreads-x)/(consistentgets+dbblockgets-x)*100 通常如果發(fā)現(xiàn)命中率低于90%,則應(yīng)該調(diào)整應(yīng)用可可以考慮是否增大數(shù)據(jù)緩沖區(qū)共享池的命中率 SQL>selectsum(pinhits-reloads)/sum(pins)*100"hitradio"fromv$librarycache; hitradio 99.809291 假設(shè)共享池的命中率低于95%,就要考慮調(diào)整應(yīng)用(通常是沒使用bindvar)或者增加內(nèi)存關(guān)于排序局部 SQL>selectname,valuefromv$sysstatwherenamelike'%sort%'; NAMEVALUE sorts(memory)67935 sorts(disk)1 sorts(rows)7070 假設(shè)我們發(fā)現(xiàn)sorts(disk)/(sorts(memory)+sorts(disk))的比例過高,則通常意味著 sort_area_size局部內(nèi)存較小,可考慮調(diào)整相應(yīng)的參數(shù)。關(guān)于log_buffer SQL>selectname,valuefromv$sysstat 2wherenamein('redoentries','redobufferallocationretries'); NAMEVALUE redoentries2325719 redobufferallocationretries10 假設(shè)redobufferallocationretries/redoentries的比例超過1%我們就可以考慮增大log_buffer如何在Linux上擴(kuò)展SGA超過1.7G共享池(SHARED_POOL_SIZE)v$shared_pool_adviceALTERSYSTEMFLUSHSHARED_POOLHowtoKeepObjects--重點(diǎn)使用DBMS_SHARED_POOL.KEEP過程來keepobjects,UNKEEP過程從sharedpool中移走pinnedobjectsexecutedbms_shared_pool.keep('address,hash_value');--keep該匿名塊共享池包括庫高速緩存(librarycache)、數(shù)據(jù)字典高速緩存和效勞器控制結(jié)構(gòu)(例如數(shù)據(jù)庫字符集)。Oracle效勞器用庫高速緩存來提高執(zhí)行SQL語句的性能;庫高速緩存包括共享和專用SQL區(qū)。共享SQL區(qū)包括SQL語句語法分析樹和執(zhí)行路徑,而專用SQL區(qū)存儲特定的會話信息,例如捆綁變量、環(huán)境和會話參數(shù)、運(yùn)行堆棧和緩沖區(qū)等。Softparse使用的資源包括CPU和librarycachelatchgetsHardparse是指要解析的SQL沒有在librarycache中,或者執(zhí)行的時候發(fā)現(xiàn)解析過的SQL已經(jīng)agedout,就是離開了librarycache,稱為Librarycachemisses.使用的資源包括額外的CPU,librarycachelatchgets,以及sharedpoollatchgets.專用SQL區(qū)在每個事務(wù)初始化時創(chuàng)立,在與專用SQL區(qū)相關(guān)的游標(biāo)關(guān)閉時被釋放。一個用戶會話能夠一次翻開的專用SQL區(qū)的數(shù)量由init.ora參數(shù)OPEN_CURSORS決定。使用這兩個結(jié)構(gòu),Oracle效勞器能夠重用一條SQL語句的所有執(zhí)行的共同信息。與此同時,可以從專用SQL區(qū)中查詢執(zhí)行的特定會話信息。注意游標(biāo)使用過程中并不關(guān)閉游標(biāo)的應(yīng)用會繼續(xù)為應(yīng)用分配越來越多的內(nèi)存,局部原因是為每個翻開的游標(biāo)分配了專用SQL區(qū)。庫高速緩存中的專用SQL區(qū)可更進(jìn)一步分為永久區(qū)和運(yùn)行區(qū)。共享池的大小取決于init.ora文件參數(shù)SHARED_POOL_SIZE,它是以字節(jié)為單位的。你必須將這個值設(shè)得足夠大,以確保有足夠的可用空間來裝載和存儲PL/SQL塊和SQL語句。共享區(qū)經(jīng)過長期裝卸和卸載數(shù)據(jù)對象會產(chǎn)生許多碎片,如果在共享池中沒有足夠的連續(xù)空間用來裝載目標(biāo)數(shù)據(jù),會產(chǎn)生錯誤。解決這個問題的捷徑是運(yùn)行SQL命令A(yù)LTERSYSTEMFLUSHSHARED_POOL。但是如果在數(shù)據(jù)庫操作時,經(jīng)常遇到共享池錯誤,你必須增大共享池
Librarycache
包含sharedSQLandPL/SQLareas(PL/SQL包括Procedures,Functions,Packages,Trigger,匿名PL/SQL塊)SizingtheLibraryCache定義storedobject(packages,views等等)的內(nèi)存需求;定義經(jīng)常使用的sqlstatement的所需內(nèi)存1.初始時將SHARED_POOL_SIZE設(shè)得很大,運(yùn)行應(yīng)用程序2.計算storedobject所占的內(nèi)存
SELECTSUM(sharable_mem)FROMv$db_object_cache
WHEREtype='PACKAGE'ortype='PACKAGEBODY'ortype='FUNCTION'ortype='PROCEDURE';3.應(yīng)用程序運(yùn)行一段時間后,估計常用sql語句所占的內(nèi)存(不包括動態(tài)SQL)
SELECTSUM(sharable_mem)
FROMv$sqlarea
WHEREexecutions>5;4.對每個user每個翻開的cursor,需要250bytes,可在運(yùn)行頂峰期間使用查詢:
SELECTSUM(250*users_opening)FROMv$sqlarea;5.在測試環(huán)境中,可讓一個用戶翻開一定數(shù)量的cursor,運(yùn)行以下語句測試共享內(nèi)存,然后乘上user數(shù)
SELECT250*valuebytes_per_user
FROMv$sesstats,v$statnamen
WHEREs.statistic#=n.statistic#
AND='openedcursorscurrent'
ANDs.sid=15;以上內(nèi)存的和,再加上一點(diǎn)內(nèi)存(留給動態(tài)SQL使用),作為你的應(yīng)用的理想內(nèi)存設(shè)置;預(yù)留一局部空間作為大的內(nèi)存需要,防止miss和碎片;一些大的內(nèi)存需要:PL/SQL塊的編譯,trigger的編譯;小的object不會使預(yù)留空間碎片化,反而保證reservedlist有大的連續(xù)塊,一旦從reservedlist中分配的內(nèi)存釋放它就返回reservedlist。影響的參數(shù):SHARED_POOL_RESERVED_SIZE
初始值=SHARED_POOL_SIZE*10%,超過50%,oracleserver報錯OPEN_CURSORS缺省=50定義了涉及分配給用戶進(jìn)程的私有SQL區(qū)域的cursors數(shù)量,一個privateSQLarea一直存在直至cursor關(guān)閉;為了利用更多的內(nèi)存給共享SQL區(qū)域,需要提高session每個session允許多cursor數(shù)量,開發(fā)人員應(yīng)關(guān)閉不需要的cursor節(jié)省內(nèi)存CURSOR_SPACE_FOR_TIME缺省=FALSE布爾值設(shè)置TRUE,表示以空間換取時間,共享SQL區(qū)不會被agedout直至相關(guān)的cursor被關(guān)閉,因此確信有足夠的內(nèi)存,沒有cachemiss;除非RELOADSinV$LIBRARYCACHE一直為0,否則不要改變此參數(shù)值若應(yīng)用為FORM或使用動態(tài)SQL,設(shè)此值為FALSE--因為動態(tài)sql總是不一致,將占用過多內(nèi)存SESSION_CACHED_CURSORS缺省=0表示沒有cache當(dāng)一個session打算關(guān)閉一個cursor時,如果這個cursor的parsecount超過3次,那么這個cursor將會被加到sessioncursorcachelist的MRU端.當(dāng)一個session打算parse一個sql時,它會先去session的pga內(nèi)搜索sessioncursorcachelist,如果找到那么會把這個cursor脫離list,然后當(dāng)關(guān)閉的時候再把這個cursor加到MRU端.session_cached_cursor提供了快速軟分析的功能,提供了比softparse更高的性能.檢查系統(tǒng)是否需要此參數(shù)的方法:對某個典型用戶sessionselecta.sid,,a.valuefromv$sesstata,v$statnamebwherea.statistic#=b.statistic#and(='sessioncursorcachehits'orlike'parsecount%');Iffewparsesresultinhits,則可提高此參數(shù),注意它將increaseoveralldemandsonmemory.--????DataDictionaryCacheSelecttype,parameter,gets,getmisses,round(getmisses/decode(gets,0,null,gets)*100,2)"ratio(%)"fromv$rowcache;GoalforaGoodRatioSUM(GETMISSES)/SUM(GETS)<15%,否則應(yīng)增大SHARED_POOL_SIZE不可能希望getmisses趨近于0,因為數(shù)據(jù)庫啟動后需要讀取objects定義OEM-->PerformanceManager—>Memory—>DataDictionaryCacheHit%檢索需要在共享池中要求大于100K連續(xù)空間的對象:select*fromv$db_object_cachewheresharable_mem>100000andtypein('PACKAGE','PACKAGEBODY','PROCEDURE','FUNCTION');考察返回的結(jié)果,確認(rèn)是否需要pin到共享池中,返回結(jié)果中的KEPT字段如果是YES,那么表示該對象已經(jīng)固定在了共享池中,為NO,則表示還沒有固定。如果需要固定,使用下面的語句:execdbms_shared_pool.keep('SYS.STANDARD');數(shù)據(jù)庫默認(rèn)安裝的時候沒有創(chuàng)立dbms_shared_pool包,所以需要先創(chuàng)立該包。cd$ORACLE_HOME/rdbms/adminsqlplus“/assysdba〞@dbmspool.sqlDATABUFFER數(shù)據(jù)庫緩沖區(qū)高速緩存v$db_cache_advice==一堆數(shù)據(jù)塊(DB_BLOCK_SIZE*DB_BLOCK_BUFFERS)數(shù)據(jù)庫的任何修改都在該緩沖里完成(LRU-->LRUW)。所有的塊,被讀到內(nèi)存中后,它的塊頭(datablockheader)放在一個Cachebufferchain中,Cachebufferchain由多個雙向hash鏈表組成,hash鏈表數(shù)量由_db_block_hash_buckets決定.每個數(shù)據(jù)塊頭由DBA(datablockaddress)作為key,經(jīng)hash函數(shù)后放在鏈表上,它和blockbuffer中的block一一對應(yīng),數(shù)據(jù)塊頭不包括實際的數(shù)據(jù),僅是一個簡單的描述.后臺進(jìn)程掃描hash鏈表前,必須獲得cachebufferchainlatch,如果在CacheBufferchain中找不某塊,就由磁盤讀入.若需要查找某個block,則根據(jù)block的信息能計算hashvalue然后迅速定位到hashtable,然后根據(jù)hashtable信息去查看是否存在所想要的buffer,若有則命中,若沒有則不命中。顯然不可能根據(jù)list去逐個搜索,這樣效率太低.LRU就是一種盡可能將常用的數(shù)據(jù)保存在內(nèi)存的算法.當(dāng)數(shù)據(jù)庫需要一個數(shù)據(jù)緩沖區(qū),他會從數(shù)據(jù)庫緩沖區(qū)的LRU隊列的尾部找一個空閑的緩沖,將一個數(shù)據(jù)塊讀入,然后數(shù)據(jù)庫會把這個緩沖區(qū)放到LRU隊列的中部,如果該緩沖被其他程序用到的話,那么他會往隊列的頭上移動,如果這個緩沖沒有被其他程序用到,并且沒有被修改正,那么他會慢慢的移動到LRU隊列的尾部,最終被認(rèn)為是空緩沖區(qū)被其他數(shù)據(jù)塊所覆蓋.一旦這個緩沖區(qū)被修改正DBWR把他從LRU隊列中移出,放到LRUW隊列(也叫贓緩沖區(qū))中,等待DBWR把他們批量寫入數(shù)據(jù)文件,然后再把他們的緩沖區(qū)連接到LRU隊列的尾部.周而復(fù)始的工作.如果查找在一個閥值內(nèi)沒有結(jié)果或者造成dirty緩沖區(qū)已經(jīng)溢出,在進(jìn)一步查找freebuffer前系統(tǒng)將發(fā)出一個消息給DBWR讓他可以將LRUW隊列的緩沖區(qū)寫入磁盤.這個閥值被叫做這個閥值被叫做DBWRscandepthdirty緩沖區(qū)大小可以用_DB_LARGE_DIRTY_QUEUE和2*_DB_BLOCK_WRITE_BATCH來確定.前臺進(jìn)程繼續(xù)搜索freebuffer.直到_DB_BLOCK_MAX_SCAN_CNT還沒有發(fā)現(xiàn)系統(tǒng)就會掛起該進(jìn)程.記錄dirtybuffersinspected的靜態(tài)變量并把該進(jìn)程標(biāo)志為freebufferwait.cache和buffer_pool_keep是不一樣的,cache是如果對該表全表掃描的話,會把塊放在mru端,buffer_pool_keep是放在keep池中selecttable_name,cache,buffer_poolfromdba_tableswheretable_name='TEST';將表和索引Cache到SGA中從ORACLE805之后,支持ALTERTABLEtable_nameSTORAGE(BUFFER_POOLKEEP)命令了。
但是在805與8i中,需要設(shè)置buffer_pool_keep參數(shù)來設(shè)置KEEP池大小。這塊內(nèi)存來自數(shù)據(jù)緩存區(qū),也就是從db_block_buffers中分配。在ORACLE8和8i中,還必須設(shè)置db_block_lru_latches參數(shù)。該參數(shù)應(yīng)該比2*3*CPU數(shù)量少,但是要大于1,否則無法設(shè)置buffer_pool_keep。在ORACLE9i中則需要設(shè)置DB_KEEP_CACHE_SIZE來設(shè)置KEEP池內(nèi)存的大小。這樣將表KEEP才有用。而且KEEP池要能夠容納得下才行的將函數(shù)Cache到SGA中@$ORACLE_HOME\rdbms\admin\dbmspool.sql;execdbms_shared_pool.keep('procedure_name','P');重做日志緩沖區(qū)(LOG_BUFFER)logbuffer分成內(nèi)部的bufferblocks,而這些block各有8個字節(jié)的頭部信息存在于variablearea中.當(dāng)重做日志緩沖區(qū)填滿時,將它的內(nèi)容寫入聯(lián)機(jī)重做日志文件。是循環(huán)使用。是數(shù)據(jù)庫最活潑的情形,可以用V$SYSSTAT視圖進(jìn)行監(jiān)控。查詢V$SYSSTAT視圖value域,它說明用戶進(jìn)程等待重做日志緩沖區(qū)所花費(fèi)的時間(此處value的值應(yīng)接近于0,否則應(yīng)增大初始化參數(shù)文件的Log_buffers的值):SELECTNAME,VALUEFROMV$SYSSTATWHERENAME='redologspacerequests';PGAv$pgastatv$pga_target_advice后臺進(jìn)程v$bgprocess■數(shù)據(jù)庫寫進(jìn)程(DBWR)(DB_BLOCK_WRITE_BATCH,DB_BLOCK_MAX_SCAN,DB_WRITES,DB_BLOCK_LRU_LATCHES,DB_BLOCK_CHECKPOINT_BATCH,DB_BLOCK_CHECKSUM)負(fù)責(zé)數(shù)據(jù)文件的讀寫和db_data_buffer的清理dbwr負(fù)責(zé)搜集dirtybuffer,slaves負(fù)責(zé)寫磁盤工作的前提條件:1.dirtybuffer超出了dirtybufferlist的threshold.
2.serverprocess在buffercache中查找freebuffer時,則也可能會通知DBWn將dirtybuffer寫入datafile.
3.DBWn每3秒會檢查是否有dirty數(shù)據(jù)要寫入datafile.
4.CKPT
5.tablespaceoffline或tablespacebeginbackup(這里實際上是由CKPT引起).
6.dropobject
7.shutdown(這里實際上也是由CKPT引起)建議你使用與存儲數(shù)據(jù)文件的物理磁盤一樣多的DBWR進(jìn)程;DBWR寫入數(shù)據(jù)文件的任何修改已經(jīng)被記錄在重做日志文件中.一次checkpoint的成功過程是:dbwr搜集dirtybuffer,交給slave寫磁盤,寫完畢通知dbwr,然后dbwr才返回檢查點(diǎn)完成。增加寫進(jìn)程,同時要調(diào)整db_block_lru_latches參數(shù),如修改或添加如下兩個參數(shù): db_writer_processes=4 db_block_lru_latches=8■日志寫進(jìn)程(LGWR)。 LOG_CHECKPOINT_INTERVAL,LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINTS_TO_ALERTLGWR工作的主要條件如下1.用戶提交2.有1/3重做日志緩沖區(qū)未被寫入磁盤3.有大于1M重做日志緩沖區(qū)未被寫入磁盤4.超時5.DBWR需要寫入的數(shù)據(jù)的SCN號大于LGWR記錄的SCN號,DBWR觸發(fā)LGWR寫入■歸檔進(jìn)程(ARCH)。 ARCHIVE_LOG_START■檢查點(diǎn)(CKPT)。同步數(shù)據(jù)文件,日志文件和控制文件CKPT會更新數(shù)據(jù)文件/控制文件的頭信息.CKPT工作的主要條件如下1.在日志切換的時候2.數(shù)據(jù)庫用immediate,transaction,normal選項shutdown數(shù)據(jù)庫的時候3.根據(jù)初始話文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT,FAST_START_IO_TARGET的設(shè)置的數(shù)值來確定4.用戶觸發(fā)■系統(tǒng)監(jiān)控和進(jìn)程監(jiān)控進(jìn)程(SMON和PMON)?!稣{(diào)度進(jìn)程(Dnnn)。 MTS_DISPATCHERS■恢復(fù)進(jìn)程(RECO)。 DISTRIBUTED_TRANSACTIONS■快照進(jìn)程(SNPn)。 OB_QUEUE_PROCESS,JOB_QUEUE_INTERVAL■鎖進(jìn)程(LCKn)。 ■并行查詢進(jìn)程(Pnnn)。 PARALLEL_MIN_SERVERS,PARALLEL_MAX_SERVERS■用戶和效勞器進(jìn)程(Snnn)。回滾v$rollstatv$waitstatv$sysstatx$bhdba_rollback_segs一下事務(wù)的流程:1.分配一個回滾段
2.在回滾段事務(wù)表中分配一個事務(wù)槽
3.分配undoblock
4.更新數(shù)據(jù)塊上的ITL事務(wù)槽
5.把前鏡像記錄在undoblock內(nèi)
6.更改數(shù)據(jù)塊的內(nèi)容ITL事務(wù)槽--InterestedTransactionList(ITL)ITL內(nèi)容包括:xidTransactionIDUbaUndoBlockAddressLckLockStatusxid=Undo.Segment.Number+Transaction.Table.Slot.Number+Wrapuba=Address.Of.Last.Undo.Block.Used+Sequence+Last.Entry.in.UNDO.Record.MapALTERSYSTEMSETUNDO_MANAGEMENT=MANUALSCOPE=SPFILE;SETTRANSACTIONUSEROLLBACKSEGMENTRB_LARGE1;當(dāng)一個事務(wù)開始的時候,會首先把變化前的數(shù)據(jù)和變化后的數(shù)據(jù)先寫入日志緩沖區(qū),然后把變化前的數(shù)據(jù)寫入回滾段,最后才在數(shù)據(jù)緩沖區(qū)中修改數(shù)據(jù)一致性讀取consistentreads假設(shè)查詢開始的時候的SCN為T,則在查詢所掃描的數(shù)據(jù)塊中,如果數(shù)據(jù)的COMMITSCN小于T,則查詢接受該數(shù)據(jù),如果COMMITSCN大于T或者說還沒有產(chǎn)生COMMITSCN,則查詢會嘗試去回滾段中查找數(shù)據(jù)。這是為了保證數(shù)據(jù)的讀取的時間點(diǎn)的一致性,所以叫一致性讀。我們可以參考v$rollstat、v$transaction和x$bh表,在x$bh中的class字段,如果是回滾段塊,假設(shè)回滾段USN為n,則回滾段頭class為11+2n,回滾段塊為12+2n?;貪L段的使用、擴(kuò)展、回縮同一個事務(wù)不能跨越回滾段;一個回滾段至少包含2個extent。每個回滾段有一個回滾段頭,回滾段頭是一個block,里面主要記錄了事務(wù)表信息。當(dāng)產(chǎn)生一個事務(wù)的時候,就在回滾段頭的事務(wù)表中記錄一條信息,該信息中包含了事務(wù)標(biāo)志、事務(wù)狀態(tài)、使用的回滾段塊數(shù)等等信息。使用時從第一個extent的第二個block到最后一個extent循環(huán)使用;如果其中的一個extent有未提交的事物,那么前面的extent不能跨越該extent,只能在2個extent之間擴(kuò)展新的extent,并修改相應(yīng)的節(jié)點(diǎn)指針(回滾段的extent之間是通過指針連起來的一個單向循環(huán)的鏈表結(jié)構(gòu));系統(tǒng)回滾段與延遲回滾段SYSTEM回滾段是創(chuàng)立在系統(tǒng)表空間中,主要是用于系統(tǒng)級的事務(wù)和分配普通事務(wù)于其他回滾段上。當(dāng)手工創(chuàng)立數(shù)據(jù)庫后需要創(chuàng)立普通回滾段之前必須首先創(chuàng)立系統(tǒng)回滾段。系統(tǒng)回滾段主要用于兩個方面。一是系統(tǒng)事務(wù),比方針對數(shù)據(jù)字典的操作的truncatetable和droptable。如果truncatetableordroptable的過程中沒有成功,則系統(tǒng)會根據(jù)系統(tǒng)回滾段中的數(shù)據(jù)字典操作信息對該DDL操作進(jìn)行回退。另一個方面,就是延遲回滾段(DeferredRollbackSegment)。表空間offline時用戶申請回滾,數(shù)據(jù)庫會將回滾信息寫入系統(tǒng)回滾段(就是延遲回滾段),等到online時,在寫入表空間?;貪L段的設(shè)置和管理init.ora:transactions_per_rollback_segment和transactions,max_rollback_segments1:系統(tǒng)并發(fā)事務(wù)數(shù)有多少?(主要是產(chǎn)生恢復(fù)信息的會話數(shù)+一局部冗余數(shù)(20)=總回滾段數(shù))2:系統(tǒng)是否存在大查詢或者大是事務(wù)?頻繁么?3:能提供給系統(tǒng)的回滾段表空間的磁盤空間是多少?不要將回滾段的MAXEXTENTS設(shè)為UNLIMITED,回滾段所在表空間也不要設(shè)為AUTOEXTEND方式,否則將會使得由于某個不正常的事務(wù)導(dǎo)致整個數(shù)據(jù)庫處于失控狀態(tài)。9iundo_retention表示在自動管理模式下,回滾段中的數(shù)據(jù)在被覆蓋前保存多長的時間,單位是秒。這個參數(shù)應(yīng)該決定于系統(tǒng)所中一些大查詢運(yùn)行的時間長度,以防止ORA-01555錯誤。在9i下創(chuàng)立非自動管理的的回滾段而不使用UNDO表空間,則設(shè)置undo_management為MANUAL,然后在系統(tǒng)表空間中創(chuàng)立一個回滾段(注意這是必須的),創(chuàng)立自己的回滾段表空間,這時可以在回滾段表空間中創(chuàng)立回滾段,創(chuàng)立完畢刪除系統(tǒng)表空間中的回滾段。著名的ORA-01555問題一致讀獲取的時候發(fā)現(xiàn)回滾段已經(jīng)被覆蓋而出現(xiàn)找不著變化前映像,也就是當(dāng)COMMITSCN大于T查詢嘗試去回滾段中找回數(shù)據(jù)卻發(fā)現(xiàn)回滾段已經(jīng)被覆蓋了(因為回滾段是循環(huán)使用的),則會出現(xiàn)著名的ORA-01555錯誤。重做v$sysstatv$logv$logfilev$log_historyaltersystemswitchlogfile;重做記錄了塊的改變,包括回滾段頭塊、回滾段塊、數(shù)據(jù)塊,并且在塊改變之前先記錄重做信息。更改矢量(changevector)—當(dāng)要改變數(shù)據(jù)庫的數(shù)據(jù)時,這些改變的細(xì)節(jié)被記錄為更改矢量。通過這些記錄,數(shù)據(jù)庫處理過程可以被重現(xiàn)。簡而言之,一個更改矢量就是記錄了一個數(shù)據(jù)塊的行槽從一個狀態(tài)改變到另一個狀態(tài)的過程。也就是redo的記錄單位是entry,即:Y,rowslotZ。Redo也記錄了數(shù)據(jù)塊(tableblock&indexblock)前照,其實記錄的就是undo,因為即使沒有commit,改動也會被記錄到redo文件里,這時的tableblock&indexblock就是未提交的最新狀態(tài),如果此時系統(tǒng)崩潰,則需要redo中記錄的undo(前照)進(jìn)行恢復(fù),所以redo記錄了數(shù)據(jù)塊、索引塊、回滾塊。ORACLE推薦logswitch時間最好在15--30分鐘之間。跟redologfile有關(guān)的其它數(shù)據(jù)庫參數(shù)1、log_buffer它最好不要大于512K或者128K*CPU個數(shù)。我們可以用下面的SQL語句檢測log_buffer使用情況:SELECTRBAR.NAME,RBAR.VALUE,RE.NAME,RE.VALUE,(RBAR.VALUE*100)/RE.VALUE||'%'"radio"FROMV$SYSSTATRBAR,V$SYSSTATREWHERERBAR.NAME='redobufferallocationretries'ANDRE.NAME='redoentries';這個比率小于1%才好,否則增加log_buffer的大小2、log_checkpoint_intervalOracle8.1版本后log_checkpoint_interval指的是兩次checkpoint之間操作系統(tǒng)數(shù)據(jù)塊的個數(shù)。checkpoint時Oracle把內(nèi)存里修改正的數(shù)據(jù)塊用DBWR寫到物理文件,用LGWR寫到日志和控制文件。從性能優(yōu)化來說log_checkpoint_interval=redologbytes/512bytes3、log_checkpoint_timeoutOracle8.1版本后log_checkpoint_timeout指的是兩次checkpoint之間時間秒數(shù)。
Oracle建議不用這個參數(shù)來控制,因為事務(wù)(transaction)大小不是按時間等量分布的。用log_checkpoint_interval參數(shù)控制會好一些。禁用此參數(shù)或者按默認(rèn)的900。altersystemarchivelogcurrent;第二個存檔日志目的地可以通過初始化參數(shù)LOG_ARCHEVE_DUPLEX_DEST設(shè)定。LOG_ARCHEVE_DEST和LOG_ARCHEVE_DUPLEX_DEST都可以存檔所有的聯(lián)機(jī)重作日志文件。另一個初始化參數(shù)LOG_ARCHIVE_MIN_SUCCEED_DEST如果設(shè)置了的話,可以決定一個重作日志組必須被成功存檔到的存檔日志目的地數(shù),在一個目的地滿或其介質(zhì)有錯時,該參數(shù)可以防止Oracle被凍結(jié)。要確保這兩個目的地被配置在兩個別離的磁盤/控制器上,防止I/O沖突對數(shù)據(jù)庫性能的影響。一些參數(shù)v$parameter查看系統(tǒng)當(dāng)前使用的所有參數(shù)SETpagesize9000SETheadOFFSETtermOFFSELECTDECODE(isdefault,'TRUE','#')||DECODE(isdefault,'TRUE',RPAD(name,43),RPAD(name,45))||'='||valueFROMv$parameterORDERBYname;查看所有參數(shù)是否已被init.ora重新設(shè)定SELECTname,isspecifiedFROMv$obsolete_parameter;查看過時參數(shù)和強(qiáng)調(diào)參數(shù)SELECTkspponm,DECODE(ksppoflg,1,'Obsolete',2,'Underscored')FROMx$ksppoORDERBYkspponm;查看當(dāng)前系統(tǒng)中的所有隱藏參數(shù)(以sys身份登錄)SELECTksppinm,ksppstvl,ksppdescFROMx$ksppix,x$ksppcvyWHEREx.inst_id=userenv('Instance')andy.inst_id=userenv('Instance')andx.indx=y.indxandx.ksppinmlike'%_&par%'orderbytranslate(x.ksppinm,'_','');用戶參數(shù)select*fromv$fixed_tablewherenamelike'%NLS%';SELECT*FROMV$NLS_PARAMETERS;ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DDHH24:MI:SS';最常被修改的參數(shù):Shared_pool_size 分配給共享池的內(nèi)存字節(jié)數(shù)隨著用戶的需求,可以按時增加此值Rollback_segments 數(shù)據(jù)庫啟動時獲取的一個或多個當(dāng)事務(wù)處理量增加或減少時,可以從該回滾段名列表中增加或刪除回滾段名Processes 可同時訪問數(shù)據(jù)庫的最大進(jìn)程數(shù)量session=1.1*process+5,一般而言,session和process是一一對應(yīng)的,5是Oracle后臺進(jìn)程的session,10%是提供給recursivesession使用的。db_block_buffers 見SGA介紹中的相關(guān)內(nèi)容shared_pool_size 見SGA介紹中的相關(guān)內(nèi)容log_buffer 見SGA介紹中的相關(guān)內(nèi)容sort_area_size針對每個session,排序首先會使用sort_area_size,如果缺乏則會使用臨時表空間。實際上就是外排序過程,把要排序的對象分割為內(nèi)存可以容納的小段(sortrun),然后每個sortrun都放到sortarea里面去排序,排序結(jié)果作為中間信息放在臨時表空間的臨時段內(nèi),由于分段排序的結(jié)果當(dāng)然不會是最終要求的排序結(jié)果,所以還要經(jīng)過一個merge的過程,才會得到最終排序結(jié)果,原理大概是比較每個sortrun的第一名,取出領(lǐng)先者,然后該sortrun的第二名頂上,繼續(xù)上述過程直到取完。所以建議:sort_area_size所能容納記錄數(shù)至少大于排序記錄數(shù)的平方根5.open_cursor 見SGA介紹中的相關(guān)內(nèi)容6.database_writers許多DBA有個錯誤的概念,認(rèn)為此參數(shù)受CPU數(shù)量的限制,實際并非如此。提示:如果工作在一個可以支持多進(jìn)程的操作系統(tǒng)上,需做的第一件事就是改變這個參數(shù)的值。重新啟動數(shù)據(jù)庫,使用startup命令,Oralce將會按照以下順序在缺省目錄中搜索參數(shù)文件:spfile${ORACLE_SID}.ora缺省目錄UNIX:${ORACLE_HOME}/dbs/NT:${ORACLE_HOME}\databasesp 缺省目錄UNIX:${ORACLE_HOME}/dbs/NT:${ORACLE_HOME}\databaseinit${ORACLESID}.ora缺省目錄UNIX:${ORACLE_HOME}/dbs/NT:${ORACLE_HOME}\databaseor${ORACLE_HOME}\admin\db_name\pfile\創(chuàng)立了spfile,重新啟動數(shù)據(jù)庫,Oracle會按順序搜索以上目錄,spfile就會自動生效。startuppfile='E:\Oracle\admin\eyglen\p';createsppfile;然后我們可以使用ALTERSYSTEM方式將修改固定到SPFILE.ALTERSYSTEMSETlog_archive_start=FALSESCOPE=spfile;空間管理主體思想一直圍繞著內(nèi)部段的擴(kuò)展。不僅僅影響到空間大小,自由塊太分散的話會影響性能(I/O,及擴(kuò)展時間等)空閑表(主空閑表、進(jìn)程空閑表、事務(wù)空閑表),可能存在于表頭塊中表空間droptablespace***includingcontents;注:LMT是segment中extent的管理,ASSM是thefreespaceofsegment的管理。在Oracle8I的版本中,Oracle推出了一種全新的表空間管理方式:本地化管理的表空間。所謂本地化管理,就是指Oracle不再利用數(shù)據(jù)字典表來記錄Oracle表空間里面的extent的使用狀況,而是在每個表空間的數(shù)據(jù)文件的頭部參加了一個位圖區(qū),在其中記錄每個extent的使用狀況。每當(dāng)一個extent被使用,或者被釋放以供重新使用時,Oracle都會更新數(shù)據(jù)文件頭部的這個記錄,反映這個變化。Oracle之所以推出了這種新的表空間管理方法,這種表空間組織方法的優(yōu)點(diǎn):1.本地化管理的表空間防止了遞歸的空間管理操作。而這種情況在數(shù)據(jù)字典管理的表空間是經(jīng)常出現(xiàn)的,當(dāng)表空間里的區(qū)的使用狀況發(fā)生改變時,數(shù)據(jù)字典的表的信息發(fā)生改變,從而同時也使用了在系統(tǒng)表空間里的回滾段。
2.本地化管理的表空間防止了在數(shù)據(jù)字典相應(yīng)表里面寫入空閑空間、已使用空間的信息,從而減少了數(shù)據(jù)字典表的競爭,提高了空間管理的并發(fā)性
3.區(qū)的本地化管理自動跟蹤表空間里的空閑塊,減少了手工合并自由空間的需要。
4.表空間里的區(qū)的大小可以選擇由Oracle系統(tǒng)來決定,或者由數(shù)據(jù)庫管理員指定一個統(tǒng)一的大小,防止了字典表空間一直頭疼的碎片問題。
5.從由數(shù)據(jù)字典來管理空閑塊改為由數(shù)據(jù)文件的頭部記錄來管理空閑塊,這樣防止產(chǎn)生回滾信息,不再使用系統(tǒng)表空間里的回滾段。因為由數(shù)據(jù)字典來管理的話,它會把相關(guān)信息記在數(shù)據(jù)字典的表里,從而產(chǎn)生回滾信息。由于這種表空間的以上特性,所以它支持在一個表空間里邊進(jìn)行更多的并發(fā)操作,并減少了對數(shù)據(jù)字典的依賴。對于表空間中的每一個空間(一個或多個extent),我們必須知道:1、這個可用空間位于什么數(shù)據(jù)文件2、這個空間的尺寸是多大3、如果它在用了,是哪一個段占用的這個空間直到8i之前,所有的表空間都是采用字典管理模式,為了確保能保存以上的信息,ORACLE用了兩個數(shù)據(jù)字典表:UET$(已使用的區(qū)間)或FET$(空閑空間):當(dāng)一個段被刪除的時候,ORACLE就移動UET$中相應(yīng)的行到FET$,這個過程的發(fā)生是連續(xù)的,而且可能發(fā)生等待。當(dāng)并發(fā)性很高的時候,數(shù)據(jù)字典的爭用就來了。另外有一個問題就是,當(dāng)表的空間很不連續(xù)或表空間有大量的碎片引起這兩個表的增大,那么也就會引起數(shù)據(jù)庫性能上的下降。表空間分段:氣泡(bubble):一個連續(xù)的自由空間塊;蜂窩(honeycomb):一系列看起來相連的塊。蜂窩由氣泡構(gòu)成(氣泡間有邊界),去掉邊界,蜂窩并成一個大的氣泡。氣泡和蜂窩多是由于擴(kuò)展段的釋放而產(chǎn)生。過多的小的氣泡會導(dǎo)致DDL操作時屢次掃描SYS.FET$,并花時間合并可用空間,影響性能。讓我們看一下當(dāng)一個行被從一個應(yīng)用程序中插入到表中時發(fā)生的一系列動作:1)查表的自由列表,考慮在哪可以放一個新行。如果沒有自由塊可用,需要分配一個新的擴(kuò)展段。2)Oracle掃描SYS.FET$表,為空間中的擴(kuò)展段定位自由空間。3)第一次掃描找出可以供新的擴(kuò)展段使用的氣泡。新擴(kuò)展段的大小計算使用大于擴(kuò)展段所需塊數(shù)的、下一個可被5整除的數(shù)。例如,如果一個擴(kuò)展段包含23塊,則得到的數(shù)是25塊。然而,如果需要的是5塊或更小,就不必這樣計算,一旦塊數(shù)確定,第一次掃描就尋找塊數(shù)恰好滿足需要的氣泡。4)如果沒有找到恰好適宜的,那么Oracle掃描大些的氣泡。如果一個大的氣泡所擁有的塊數(shù)比所需要的塊數(shù)多5塊或5塊以上(當(dāng)然是在取了約數(shù)以后),那么氣泡中的自由空間分成兩局部,一局部滿足擴(kuò)展段的需要,另一局部仍作為自由空間。新的(小一些的)的自由空間氣泡包括去掉所需的塊數(shù)后剩下的塊數(shù)(5塊或多于5塊)。例如,如果需要的塊數(shù)是25,但找到了一個32塊的氣泡,那么Oracle占用其中的25塊分配給擴(kuò)展段并保持剩下的7塊形成一個分開的氣泡,仍然保存在原處。另外一種情況,找到了一個28塊的氣泡,那么只是把此氣泡供擴(kuò)展段使用。換句話說,如果多余的塊數(shù)少于5就不產(chǎn)生分割操作。5)如果所有現(xiàn)有的氣泡都太小,缺乏以滿足擴(kuò)展段的需要(即沒有找到大小相等的也沒有找到大于數(shù)據(jù)塊數(shù)的氣泡),那么進(jìn)行第三次掃描尋找是否有可以合并的蜂窩能提供所需的空間。在合并以后,再次進(jìn)行第3步和第4步。6)如果前面的幾步都沒有找到能夠供擴(kuò)展段使用的氣泡,那么Oracle檢查AUTOEXTEND功能是否已被使能(后面詳細(xì)介紹這一選項)。如果是的,再檢查數(shù)據(jù)文件是否是可擴(kuò)展的。7)如果AUTOEXTEND沒有被使能或者在磁盤上(數(shù)據(jù)文件所在的磁盤)沒有足夠的空間來擴(kuò)大該數(shù)據(jù)文件,Oracle返回“ORA-1650-55:Unabletoextend〞錯誤消息,引起應(yīng)用失敗。預(yù)防措施:1)將大小相同而且增長率相似的段應(yīng)該保存在相同的表空間集合中,保證釋放的氣泡可以高效地被別的段重新使用。2)理想情況下,一個表空間中的所有段應(yīng)該有相同的存儲參數(shù)(對每一個段有相同的INITIAL/NEXT值)。如果不能做到這一點(diǎn),要保證不同段的存儲參數(shù)要互為倍數(shù)。為所有的表空間指定DEFAULTSTORAGE參數(shù)。3)一旦可能,指定PCTINCREASE=0。當(dāng)由于沒有定義增長模式而不可能指定該值時,用100作為PCTINCREASE的可能值。在任何情況下,不要用如1、5等的隨機(jī)值,以防止生成奇數(shù)大小的擴(kuò)展段。4)周期性顯式地合并應(yīng)用程序的表空間。不要配置SMON來自動合并表空間,因為它需要在表空間的DEFAULTSTORAGE語句中指定一個大于0的PCTINCREASE的值。識別表空間段情況、重構(gòu)特定文件:1)識別表空間中的擴(kuò)展段、氣泡、蜂窩:SETLINES132SETPAGES500COLUMN“FIL_ID〞FROMAT999HEADING“FIL|ID〞COLUMN“FIL〞FORMATA55HEADING“FIL-NAME〞COLUMN“SEGMENT〞FROMATA55COLUMN“STARTBLK〞FROMAT999999HEADING“START|BLK〞COLUMN“#BLOCKS〞FORMAT999,999HEADING“#|BLKS〞SELECTD.“FIL_ID〞,D.“FIL〞,SEGMENT_TYPE||‘‘||OWNER||‘,’||SEGMENT_NAME“SEGMENT〞,E.BLOCK_ID“STARTBLK〞,E.BLOCKS“#BLOCKS〞FROMDBA_EXTENTSE,DBA_DATA_FILESDWHEREE.TABLESPACE_NAME=UPPER(‘&&TBLSPC_NAME’)ANDD.TABLESPACE_NAME=E.TABLESPACE_NAMEANDD.=E.UNIONSELECTS.“FIL_ID〞,D.“FIL〞,‘FREECHUNK’“SEGMENT〞,S.BLOCK_ID“STARTBLK〞,S.BLOCKS“#BLOCKS〞FROMDBA_FREE_SPACES,DBA_DATA_FILESDWHERES.TABLESPACE_NAME=UPPER(‘&&TBLSPC_NAME’)ANDD.TABLESPACE_NAME=S.TABLESPACE_NAMEANDD.=S.ORDERBY1,4,5/結(jié)果:FIL_IDFILSEGMENTSTARTBLK#BLOCKS1/opt/app/oracle/oradata/orcl/system01.dbfROLLBACKSYS,SYSTEM2101/opt/app/oracle/oradata/orcl/system01.dbfROLLBACKSYS,SYSTEM12101/opt/app/oracle/oradata/orcl/system01.dbfCLUSTERSYS,C_OBJ#22201/opt/app/oracle/oradata/orcl/system01.dbfINDEXSYS,I_OBJ#4221/opt/app/oracle/oradata/orcl/system01.dbfCLUSTERSYS,C_TS#4421/opt/app/oracle/oradata/orcl/system01.dbfINDEXSYS,I_TS#4621/opt/app/oracle/oradata/orcl/system01.dbfCLUSTERSYS,C_4831/opt/app/oracle/oradata/orcl/system01.dbfINDEXSYS,I_5121/opt/app/oracle/oradata/orcl/system01.dbfCLUSTERSYS,C_USER#5322)如果有大量的氣泡分散在表空間中,特別是有許多小的氣泡不能供任何擴(kuò)展段使用時,那么就需要重建數(shù)據(jù)文件。3)根據(jù)停工時間決定重構(gòu)方案,重構(gòu)步驟:a)保存這些段中的數(shù)據(jù)(把數(shù)據(jù)輸出或用CREATETABLEASSELECT命令來保存表數(shù)據(jù);對于索引表,用CREATEINDEX腳本來重構(gòu)它們)。b)丟棄數(shù)據(jù)文件中的段。c)用ALTERTABLESPACECOALESCE命令合并屬于數(shù)據(jù)文件的表空間。d)在表空間中重建段。e)重新支持訪問語句,檢查分段情況,保證所有的段已經(jīng)安排得很緊密,已經(jīng)消除了大規(guī)模的分段。Oracle擴(kuò)展段分配算法:用光那些看起來以后不會被使用的塊?。ū确綌U(kuò)展段外最后的幾個塊)DB_×DB_BLOCK_SIZE與INITIAL/NEXT:保證DB_BLOCK_SIZE和擴(kuò)展段大?。↖NITIAL/NEXT)相適應(yīng),增強(qiáng)了每次I/O操作讀盡可能多的數(shù)據(jù)的可能性(DB_×DB_BLOCK_SIZE);而不受到了擴(kuò)展段結(jié)尾,只能讀取擴(kuò)展段中剩下的幾塊的限制。舉個例子,可以更好地理解這一點(diǎn):如果一個表包含5個擴(kuò)展段,每個包含128個8K的數(shù)據(jù)塊(即,INITIA&NEXT=1MB),那么在一次全表掃描中需要讀5MB或5120KB數(shù)據(jù)。如果DB_是8(DB_BLOCK_SIZE是8K),那么理論上需要的最大I/O數(shù)為80次來讀整個表(5120K/(8K×8))。這樣,每個擴(kuò)展段需要16次I/O調(diào)用?;蛘?,如果使用一個不同的INITIAL/NEXT大小,那么I/O調(diào)用的次數(shù)會變化。例如,如果INITIAL&NEXT=520KB),那么在全表掃描期間需要讀2.45MB或2600KB數(shù)據(jù)。假定,DB_仍是8,那么理論上需要多達(dá)45次I/O調(diào)用才能訪問整個表。因為第二個表(2600KB)大約是第一個表(5120KB)的一半,可以假定,要讀整個表的話,小表理論所需的I/O次數(shù)大約是大表的一半。然而,總共只做了5次I/O調(diào)用與假定的情況有很大的出入。讓我們仔細(xì)分析一下當(dāng)?shù)诙€表被掃描時到底發(fā)生了什么情況。在第二個表中的每個擴(kuò)展段包含520K(2600K/STORAGE)或65個數(shù)據(jù)塊?,F(xiàn)在按假定的DB_在一次I/O調(diào)用中至多可讀64K數(shù)據(jù)。因此,訪問每個擴(kuò)展段需要9次I/O調(diào)用讀取了段中的98%的數(shù)據(jù)或64塊,而第9次調(diào)用讀取最后一塊)。因為第9次調(diào)用只讀取了8K(最后一塊),所以不是最優(yōu)的。這5個擴(kuò)展段中的每一個都需要用第9次訪問來讀取其中最后一塊,導(dǎo)致了5次附加的I/O調(diào)用。如果INITIAL/NEXT的大小調(diào)整得好一些,是(DB_BLOCK_READ_COUNT×DB_BLOCK_SIZE)的倍數(shù),那么附加的5塊可以在一次I/O調(diào)用中讀入。例如,如果INITIAL/NEXT=512K,那么僅需要41次I/O調(diào)用來掃描整個表,節(jié)省了4次調(diào)用。這里,我們假定每個段有5個擴(kuò)展段。然而,隨著數(shù)據(jù)庫變得越來越大,擴(kuò)展段數(shù)會相當(dāng)高,這樣,相應(yīng)地I/O調(diào)用也會增加。因此,在指定INITIAL/NEXT大小時考慮DB_BLOCK_SIZE非常重要。另外一個重要的參數(shù),DB_,通常指定為8、16、32等等,以到達(dá)OS每次I/O調(diào)用的最大值。因此,通常該值與DB_BLOCK_SIZE值一致來提供最優(yōu)的I/O。周期性地合并應(yīng)用程序表空間:由SMON進(jìn)程進(jìn)行:ALTERTABLESPACECOALESCEALTERSESSIONSETEVENTS‘IMMEDIATETRACENAMECOALESCELEVEL&<表空間號>’;表空間的重組:因為當(dāng)前磁盤空間滿了,而手頭又沒有新的磁盤,所以需要重組表空間(減小同一磁盤其他表空間的大小,騰出空間),重組之前需要做好充足準(zhǔn)備,相關(guān)操作見24X7第12.1.16;但在Oracle8i以后,支持可移動的表空間,所以不必進(jìn)行復(fù)雜的重組。在進(jìn)行表空間改組前要注意如下一些事項:?要保證移動睡眠表空間(或通過減少臨時表空間)能提供所需要的空間(這是整個重組操作的目的之所在)。同樣,如果臨時表空間確實減少了,保證變小了的臨時表空間仍然能滿足先前所支持的應(yīng)用程序的要求。?中選擇一個睡眠表空間,丟棄或非聯(lián)機(jī)時,應(yīng)該保證其當(dāng)前并不被用戶使用。一個表空間可能當(dāng)前看起來是“睡眠的〞(如,在白天)。然而,卻可能被在晚上運(yùn)行的批處理作業(yè)使用。另外,它也可能被CFO使用,而CFO今天未啟動而已。因此,在決定哪個表空間是睡眠的之前要估計這種使用的可能性。?當(dāng)被丟棄或使非聯(lián)機(jī)的睡眠表空間中有某些相關(guān)的表時,要保證不發(fā)生訪問整體性的沖突。?保證睡眠的表空間中不包含某些活潑表的索引。?保證睡眠的表空間中沒有數(shù)據(jù)字典段(由于編輯了SQL.BSQ文件)。?保證在睡眠的表空間中沒有回滾段。?要提供足夠的提示信息告知用戶這種“睡眠〞的表空間臨時不可用,這樣在刪除操作前,可以注意到這一點(diǎn)。?在任何情況下,保證在重組之前和之后要備份控制文件。當(dāng)允許文件自動增長時需要特別小心。對AUTOEXTEND的文件限制MAXSIZE小于2GB是明智的。否則,由于[BUG:568232],當(dāng)文件增長超過ORACLE不能處理時可能會出現(xiàn)ORA-600[3292]等錯誤。表控制擴(kuò)展段數(shù)目(<100),太大影響空間管理性能并增加數(shù)據(jù)字典記錄允許擴(kuò)展段(EXTENT)隨時間增長,如按月、季度、年,由此調(diào)節(jié)INITIAL/NEXT需要并發(fā)時:INITRANS至少等于FREELISTmaxtrans:同一個block中允許最大并發(fā)事務(wù)數(shù)initrans:同一個block中至少允許這么多并發(fā)事務(wù)數(shù),也就是一開始就保存這么多個事務(wù)需要的空間。(即ITL的個數(shù),這樣可以不用等到其他事務(wù)釋放ITL)PCTFREE/PCTUSEDPCTINCREASE一般設(shè)為0MAXEXTENTS一般設(shè)為UNLIMITED控制非回滾段的段擴(kuò)展頻率,動態(tài)空間管理產(chǎn)生的遞歸調(diào)用會嚴(yán)重影響性能。帶有ASSM的本地管理表空間會略掉任何為PCTUSED、NEXT和FREELISTS所指定的值。表的位置標(biāo)記:指曾經(jīng)有數(shù)據(jù)的最大塊數(shù)(比方很多數(shù)據(jù),后來刪了,但是標(biāo)記并沒有減小),為5的倍數(shù)(如果只用1塊,也會出現(xiàn)4個空塊),全表掃描期間來確定讀哪些塊,可以用索引掃描代替全表掃描來防止訪問已經(jīng)沒有數(shù)據(jù)的塊;用ALTERTABLEDEALLOCATEUNUSED可釋放MINEXTENTS外的未用空間,使用KEEP參數(shù)可以釋放INITIAL/MINEXTENTS中的未用空間,并相應(yīng)調(diào)節(jié)INITIAL/MINEXTENTS大小。表擁有的總塊數(shù)(USER_SEGMENTS.BLOCKS)-未使用的空塊數(shù)(USER_TABLES)-1=位置標(biāo)記實際包含數(shù)據(jù)的塊數(shù):USER_TABLES.BLOCKS如果標(biāo)記差異度過大且頻繁使用,需要重建表TRUNCATE:?在段上獲得一個獨(dú)占鎖(對段頭塊可以獨(dú)占訪問)。如果另外一個事務(wù)當(dāng)前正向表中寫(行一級或表一級的鎖),那么截斷操作必須通過在共享模式下申請一個TX鎖等待。?把這個表中的所有塊從緩沖區(qū)cache中寫到磁盤上。?釋放超過MINEXTENTS的所有擴(kuò)展段。?更新表頭塊中的所有空閑表來反映出這一釋放操作的結(jié)果。如果定義了多個空閑表組,更新對應(yīng)于每個空閑表組的所有塊。?重新設(shè)置位置標(biāo)記?如果配置了多個進(jìn)程(OPS環(huán)境),把段頭和包含空閑表組的塊寫入磁盤中。使用DBMS_SPACE.UNUSED_SPACE可以識別段是否可以釋放未使用塊在內(nèi)存中固定經(jīng)常使用的對象,包括表等如果我們要固定表,那么可以在創(chuàng)立表的時候或者修改表屬性時使用CACHE關(guān)鍵字,將表放置到BufferCache的LRU列表的MRU端。通常我們需要對于較小的但是頻繁使用的表進(jìn)行這種操作。ALTERTABLETABLE_NAMECACHE;我們也可以將需要頻繁使用的表放置到另外一個獨(dú)立的BufferCache中,比方KEEP池。這種操作可以使這些表的數(shù)據(jù)不至于很快被去除出DefaultBufferCache。ALTERTABLE<tablename>STORAGE(BUFFER_POOLKEEP);ALTERINDEX<indexname>
STORAGE(BUFFER_POOLKEEP);Freelist一個freelist同一個時刻只有有一個trans使用,但沒有說這些trans不能交替使用(比方2個DML分別插入100blocks,但兩個dml之間在分配各自的blocks的時候是交替進(jìn)行的而不是串行的),也不必等別的trans或者別的DML用完之后才能用,正因為有一個交替的過程才會造成等待previouslyfreedblocks:這個應(yīng)該指的是當(dāng)session在做事務(wù)的時候可能釋放block,這些釋放的block就處于txfreelist上,這個txfreelist上的block是可以被進(jìn)程自己使用的,也就是說previouslyfreedblocks就是進(jìn)程自己釋放的block。當(dāng)一定時間之后(目前不詳時機(jī)是如何觸發(fā)的),這些previouslyfreedblocks會被釋放回MFL。所以當(dāng)進(jìn)程在txfreelist上找不著(也就是沒有previouslyfreedblocks),然后就去尋找processfreelist(也就是根據(jù)進(jìn)程號算出來的freelist),如果還沒有,那就從MFL去分配,如果MFL還沒有,那就移動HWM假設(shè)freelists=10,則實際還存在一個masterfreelist,當(dāng)HWM移動的時候會移動(10+1)*5(or_bump_highwater_mark_count)個塊,但這些塊不是直接掛在processfreelist上,更不是transectionfreelist,而是放在masterfreelist上,這樣這些塊對于所有transection和processfreelist都是可使用的,因為大家都會在transectionfreelist找不到的時候自己的processfreelist,然后找masterfreelist的,只是不能找別的processfreelist而已。關(guān)于死塊,是這樣的:當(dāng)oracle在freelist中搜索5(_release_insert_threshold:default5)個block當(dāng)發(fā)現(xiàn)每個block都不能裝下一個行的時候(因pctused過高刪除回收等原因),就直接移動HWm以獲取新行,這是合理的。這樣,有可能存在這樣的現(xiàn)象,這個所謂的死塊,總是大量的影響,會可能很頻繁地被這么搜索5次然后擴(kuò)展HWM,所以我們一定要小心指定pctused.當(dāng)然pctused本身也可能大量影響IO(假設(shè)頻繁刪除的話)總結(jié)一下:如果我們定義了storage(freelists4freelistgroups2),那么在segmentheaderblock中有1個SuperMasterFreelist,有2個freelistblock,每個freelistblock中又有1個masterfreelist和4個processfreelist,當(dāng)DML操作產(chǎn)生將本來不是free的block重新標(biāo)志為空閑時,動態(tài)產(chǎn)生一個transactionfreelist。所有的freelistrecord中都只記錄flag,listheaderblockdba和listtailblockdba,整個freelist是由存在于每個位于列表中的blockheader中指向下一個freeblock地址的指針這樣類似鏈表的結(jié)構(gòu)來完成的。1。session需要空間了,先在自己的TXFreelist上找,這是在找previouslyfreedblocks2。找不到,找Processfreelist3。再找不到,找mainfreelist4。再找不到,就是這一步,返回去找其它的TXfreelist,看看有沒有commit了的,如果有,merge到mainfreelist上(這個時候其它事務(wù)的freeblock就能被這個事務(wù)使用了),然后移動最多5個block到自己的processfreelist上,開始使用5。所有的TXfreelist(是所有的還是找一個定值的數(shù)量,這個還需要驗證,因為如果有非常多的transaction,是找完所有的效率高還是到了某個地步找不到干脆直接分配新的extent效率高)上都沒有已經(jīng)commit的事務(wù),那么此時才移動HWM所以,照這樣的步驟,同意你的看法,多個freelist不會造成實際上的空間浪費(fèi),只有多個freelistgroup時候才會有浪費(fèi)。uncommitedTFL是指本session還沒有提交的臨時存在的TFL(私有的)PFL是為本進(jìn)程選擇的freelistprocessfreelist
然后是MFL(設(shè)置了freelist>1則存在一個MFL)mainfreelist如果是搜索空閑空間,是先搜索uncommitTFl>PFL>MFL(這時可能回收TFLs中block進(jìn)MFL)>移動HWM行一行包括兩局部:行頭以及與行中的列相關(guān)的實際數(shù)據(jù)。鏈接的行和非鏈接的行都如此。對于非鏈接的行,將是一整行;而對于鏈接的行,它是行的一局部。行頭至少用3個字節(jié)包含指向行的元數(shù)據(jù),如所有行段的ROWID(如果行已經(jīng)是分鏈/遷移的),物理地存在于這一行局部或整行中,以及集群關(guān)鍵字(如果表是集群的一局部)。實際的數(shù)據(jù)局部包含列頭和列數(shù)據(jù)的長度。注意,一列(如LONGRAW)可能在于多個塊。因此,可以用列頭來識別每塊中列數(shù)據(jù)的大小。這對別的變化的列數(shù)據(jù)類型也有用,如VARCHAR、VARCHAR2和RAW,可用來識別塊中實際包含了多少列數(shù)據(jù)。對于固定長度的列,列頭所指向的長度也是固定的(如DATA列有7個字節(jié))。對于最多包含250個字節(jié)的列使用1個字節(jié)而對于更大的列(超過250個字節(jié))使用3個字節(jié)。小于250個字節(jié)的可變長度的列有1個字節(jié)的頭。然而,如果該列更新后體積變大,列頭要擴(kuò)展為3個字節(jié)。如果因為自由空間有限而使這一擴(kuò)展無法進(jìn)行,那么把該行遷移。如果列包含一個NULL(沒有任何值)而且它物理地放NULL或NOTNULL(它們實際上有值)之前,那么前面NULL列的列頭用0作為數(shù)據(jù)大小。另外,如果一個包含NULL值的列物理地放在行的末尾,那么即使是列頭也不能由Oracle維護(hù)。這是因為開始新的一行說明當(dāng)前行已經(jīng)結(jié)束了而所有沒有提供的列中的值都為NULL。因此,在NULL列之前聲明所有必要的列(非空的)有助于優(yōu)化數(shù)據(jù)庫中中間的使用操作。列通常以聲明的數(shù)據(jù)保存,除非在某些情況下,如當(dāng)表中包含一個LONG/LONGRAW列時,在這種情況下,后者通常保存在最后。同樣,如果修改表使其包含一個新的列,則最新的列保存在最后。行鏈接:產(chǎn)生在第一次插入數(shù)據(jù)的時候如果一個block不能存放一行記錄的情況下。這種情況下,Oracle將使用鏈接一個或者多個在這個段中保存的block存儲這一行記錄,行鏈接比較容易發(fā)生在比較大的行上,例如行上有LONG、LONGRAW、LOB等數(shù)據(jù)類型的字段,這種時候行鏈接是不可防止的會產(chǎn)生的。行遷移:當(dāng)一行記錄初始插入的時候事可以存儲在一個block中的,由于更新操作導(dǎo)致行長增加了,而block的自由空間已經(jīng)完全滿了,這個時候就產(chǎn)生了行遷移。在這種情況下,Ora
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工草地售賣合同范例
- 公司與公司臨時合同范例
- 2006挖機(jī)租賃合同范例
- 買宅地合同范例
- 專題三第5課一、《編輯音頻》教學(xué)設(shè)計 2023-2024學(xué)年青島版(2018)初中信息技術(shù)七年級上冊
- 買木材購銷合同范例
- 深圳市裝飾設(shè)計合同剖析
- 合資機(jī)井合同范本
- 冷庫供貨合同范例
- 勞務(wù)補(bǔ)稅合同范本
- 《鐵路職業(yè)道德》課件-1.1 職業(yè)與職業(yè)化
- 頭療加盟方案
- 2024年內(nèi)蒙古交通職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫含答案
- 《幼兒安全》安安全全坐火車
- 探討小學(xué)語文作文教學(xué)中的仿寫訓(xùn)練 論文
- 《建筑工程質(zhì)量與安全管理》教案
- 商場安全隱患及防范措施
- 冷庫使用安全知識培訓(xùn)
- 2023信息系統(tǒng)密碼應(yīng)用高風(fēng)險判定指引
- 2023年12月全國大學(xué)外語等級考試考務(wù)工作手冊
- 第三單元《 There is a cake on the table 》大單元教案 四年級英語下冊(重大版)
評論
0/150
提交評論