Oracle原理學(xué)習(xí)筆記_第1頁
Oracle原理學(xué)習(xí)筆記_第2頁
Oracle原理學(xué)習(xí)筆記_第3頁
Oracle原理學(xué)習(xí)筆記_第4頁
Oracle原理學(xué)習(xí)筆記_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

ORACLE的工作機制

體系結(jié)構(gòu)

實例

Oracle運行的時候,在內(nèi)存中會要開辟一個區(qū)間,這個區(qū)間主要是用于從磁盤(數(shù)據(jù)文

件)中讀出數(shù)據(jù)后的一個在內(nèi)存的緩存和處理。而處理這些數(shù)據(jù)的操作,需要有一些系統(tǒng)的

后臺進程,這些進行在Oracle數(shù)據(jù)庫啟動的時候,就開始運行,一直在響應(yīng)前臺的操作。實

際.上,這-一個區(qū)間(SGA)和這些后臺進程合在一起,就稱為實例。實例是包括SGA區(qū)和后

臺進程兩個部分的。

數(shù)據(jù)庫啟動執(zhí)行若干動作,經(jīng)歷三個階段,分別是天加載、加我和打開。

1、未加載(nomount)可以把數(shù)據(jù)庫啟動的這一階段看作是Oracle實例的啟動。

這種方式啟動下可執(zhí)行:聿建控制文件、重建數(shù)據(jù)庫。這一啟動命令:

?讀取數(shù)據(jù)庫參數(shù)文件。

?啟動所需的后臺進程并按參數(shù)文件中的定義分配內(nèi)存。

?將進展情況寫入告警日志文件中。

2、加載(mount)在實例啟動加載階段,數(shù)據(jù)庫參數(shù)文件中指定的控制文件被讀

取。記住控制文件將數(shù)據(jù)庫各部分聯(lián)系在一起。實例從控制文件中找到下列信息,然

后將進展寫入告警日志文件。這種方式啟動下可執(zhí)行:數(shù)據(jù)庫日志歸檔、數(shù)據(jù)庫恢復(fù)、

重新命名?些數(shù)據(jù)庫文件:

?所有數(shù)據(jù)文件和重做日志文件的名稱和位置。

?數(shù)據(jù)庫名。

?最新系統(tǒng)更改號(SCN)o

3、打開(opon)包含在數(shù)據(jù)庫中的每個聯(lián)機激據(jù)文件在數(shù)據(jù)庫打開前必須被同步.

在數(shù)據(jù)庫打開階段:

?所有聯(lián)機數(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ù)庫任何整理的機會。這種方式關(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

強制啟動方式

當(dāng)不能關(guān)閉數(shù)據(jù)庫時,可以用slarlupforce來完成數(shù)據(jù)庫的關(guān)閉

先關(guān)閉數(shù)據(jù)庫,再執(zhí)行正常啟動數(shù)據(jù)庫命令

,startuppfile二參數(shù)文件名

帶初始化參數(shù)文件的啟動方式

先讀取參數(shù)文件,再按參數(shù)文件中的設(shè)置啟動數(shù)據(jù)庫

?startupEXCLUSIVE

一個Delete操作的流程:

檢查語法、語義(V$ROWCACHE:datadictionarycache),計算HASHVALLE,

在session的UGA中進行匹配(session_cachcdcursors),如果UGA中沒有,

在librarychache中匹配(libraryohachelocklatch保護library

chachelock對地址堆的訪問,而后librarychachepinlatch保護

Iibrarycachepin對librarycache中sql相關(guān)信息的訪問)

根據(jù)執(zhí)行計劃讀取數(shù)據(jù):cachebufferchainlatch保護能定位到buffer

header并pin住該塊(如果沒有bufferheader,就pin住某個空塊(沒

有空塊就產(chǎn)生freebufferwaits),并到數(shù)據(jù)文件中讀?。?。如果此時有

某個進程想訪問該塊,將產(chǎn)生bufferbusywaits。

在redologb」ffer中記錄delete操作的細節(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)生一個SCN2.在回滾段事務(wù)表中標(biāo)記該事務(wù)狀態(tài)為

commiled

3.LGWRFlushLogBuffer到日志文件3.如果此時數(shù)據(jù)塊仍然在BufferCache中,

那么SCN將被記錄到BlockHeader上,這被稱為快速提交(fastconimit)

4.如果dirtyblock已經(jīng)被寫回到磁盤,那么下一個訪問這個block的進程將會自回

滾段中獲取該事務(wù)的狀態(tài),確認該事務(wù)被提交。然后這個進程獲得提交SCN并寫回

到BlockHeader上。這被稱為延遲塊清除(delayedblockcleanout)?

內(nèi)存

SGA(系統(tǒng)全局區(qū)、共享全局區(qū))、PGA(進程全局區(qū)、私有全局區(qū))

內(nèi)存分配原則:

10%冗余內(nèi)存,OSSYS進程(約1.6冗,OSBUFFER(約0.8G),數(shù)據(jù)庫連接消耗內(nèi)存(每

個連接約5~8M),PGA(每個連接約2M,V$PGATARGETADVICE),SGA

SGA

vSsgastat

注意showparamptersga_maxsize

Oracle的

?軟件

?系統(tǒng)

?進程

?排序

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)如:lhebufferheaders,processes,sessions,

v$shared_poo1_advice

ALTERSYSTEMFLUSHSHARED_POOL

HowtoKeepObjects一重點

使用DBMS_SHARED_POOL.KEEP過程來keepobjects,UNKEEP過程從sharedpool中移走

pinnedobjects

executedbms_shared_pool.keep('address,hash_value');—keep該匿名塊

共享池包括庫高遨緩存/librarycache人數(shù)據(jù)字典高速緩存和服務(wù)器控制結(jié)構(gòu)I例價

數(shù)據(jù)庫字符集)。Oracle服務(wù)器用庫高速緩存來提高執(zhí)行SQL語句的性能;庫高速緩存包括共

享和專用SQL區(qū)。共享SQL區(qū)包括SQL語句語法分析樹和執(zhí)行路徑,而專用SQL區(qū)存儲特定的

會話信息,例如捆綁變量、環(huán)境和會話參數(shù)、運行堆棧和緩沖區(qū)等。

Softparse使用的資源包括CPU和librarycachelatchgets

Hardparse是指要解圻的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ù)0PEN_CURS0RS決定。使用這兩

個結(jié)構(gòu),Oracle服務(wù)器能夠重用一條SQL語句的所有執(zhí)行的共同信息。與此同時,可以從專

用SQL區(qū)中查詢執(zhí)行的特定會話信息。

注意游標(biāo)使用過程中并不關(guān)閉游標(biāo)的應(yīng)用會繼續(xù)為應(yīng)用分配越來越多的內(nèi)存,部分原因

是為每個打開的游標(biāo)分配了專用SQL區(qū)。

庫高速緩存中的專用SQL區(qū)可更進一步分為永久區(qū)和運行區(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)生錯誤。解決這個問題的捷徑是運行SQL命令A(yù)LTERSYSTEMFLUSH

S11ARED_POOLV但是如果在數(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"OLSIZE設(shè)得很大,運行應(yīng)用程序

2.計算storedobject所占的內(nèi)存

SELECTSUM(sharab1e_mem)FROMv$db_object_cacheWHEREtype=

'PACKAGEfortype='PACKAGEBODY,ortype='FUNCTION'ortype='PROCEDURE';

3.應(yīng)用程序運行一段時間后,估計常用sql語句所占的內(nèi)存(不包括動態(tài)SQL)

SELECTSUM(sharab1e_mem)FROMv$sqlareaWHEREexecutions>5;

4.對每個user每個打開的cursor,需要250bytes,可在運行高峰期間使用杳詢:

SELECTSUM(250*users_opening)FROMv$sqlarea;

5.在測試環(huán)境中,可讓一個用戶打開一定數(shù)量的cursor,運行下列語句測試共享內(nèi)存,

然后乘上user數(shù)

SELECT250*valuebytesperuserFROMv$sesstats,v$statname

nWHEREs.statistic#=n.statistic#ANDn.name=Jopenedcursorscurrent'AND

s.sid=15;

以上內(nèi)存的和,再加上一點內(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ù):SHAREDP00L_RESERVED_SIZE初始值二SHARED_P00L_SIZE*10%,超過

50%,oreicleserver報錯

0PEN_CURS0RS缺省二50

定義了涉及分配給用戶進程的私有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;除非RELOADSmV$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)閉的時候再把這個cui'sor力口至MRU端.

session_cached_cursor提供了快速軟分析的功能,提供了比softparse更高的性能.

檢查系統(tǒng)是否需要此參數(shù)的方法:

對某個典型用戶session

selecta.sid,b.name,a.valuefromv$sesstata,v$statnamebwhere

a.statistic#=b.statistictiand(b.name='sessioncursorcachehits'orb.namelike

'parsecounl%);

Iffewparsesresultinhits,則可提高此參數(shù),注意它將increaseoveralldemands

onmemory.—????

DataDictionaryCache

Select

type,parameter,gets,getmisses,round(getmisses/decode(gets,0,null,gets)*100,2)

“ratio(%)“fromv$rowc&che;

GoalforaGoodRatio

SUM(GETMISSES)/SUM(GETS)<15%,否則應(yīng)增大SHARED_POOL_SIZE

不可能希望getmisses趨近于0,因為數(shù)據(jù)庫啟動后需要讀取objects定義

OEM―>PerformanceManager—>Memory—>DataDictionaryCacheHit%

檢索需要在共享池中要求大于100K連續(xù)空間的對象:

select*fromv$db_Gbject_cachewheresharab1e_mem>andtypein('PACKAGE',

'PACKAGEBODY*,'PROCEDURE','FUNCTION*);

考察返回的結(jié)果,確認是否需要pin到共享池中,返回結(jié)果中的KEPT字段如果是YES,

那么表示該對象已經(jīng)固定在了共享池中,為N0,則表示還沒有固定。

如果需要固定,使用下面的語句:

execdbmsshared_poo1.keep('SYS.STANDARD');

數(shù)據(jù)庫默認安裝的時侯沒有創(chuàng)建dbms_shared_pool包,所以需要先創(chuàng)建該包。

cd$()RAC【,E_HOME/rdbms/admin

sqlplus"/assysdba”

@dbmspool.sql

DATABUFFER--數(shù)據(jù)庫緩沖區(qū)高速緩存

v$db_cache_advice

二=一堆數(shù)據(jù)塊(DB_BLOCK_SIZE*DB_BLOCK_BUFFERS)

數(shù)據(jù)庫的任何修改都在該緩沖里完成(LRU—>LRUW)o

所有的塊,被讀到內(nèi)存中后,它的塊頭(datablockheader)放在一個Cachebufferchain

+,Cachebufferchain由多個雙向hash鏈表組成,hash鏈表數(shù)量由

db_blockhashbuckets決定.每個數(shù)據(jù)塊頭由DBA(datablockaddress)作為key,經(jīng)hash

函數(shù)后放在鏈表上,它和blockbuffer中的block一一對應(yīng),數(shù)據(jù)塊頭不包括實際的數(shù)據(jù),僅

是一個簡單的描述.后臺進程掃描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隊列的尾部,最終被認為是空緩沖區(qū)被其他數(shù)據(jù)塊所覆蓋.?旦這個緩沖區(qū)被修改

過DBWR把他從LRU隊列中移出,放到LRUW隊列(也叫贓緩沖區(qū))中,等待DBWR把他們批

量寫入數(shù)據(jù)文件,然后再把他們的緩沖區(qū)連接到LRU隊列的尾部.周而復(fù)始的工作.

如果查找在一個閥值內(nèi)沒有結(jié)果或者造成dirty緩沖區(qū)已經(jīng)溢此在進一步查找free

buffer前系統(tǒng)將發(fā)出一個消息給DBWR讓他可以將LRUW隊列的緩沖區(qū)寫入磁盤.這個閥值被

叫做這個閥值被叫做DBWRscandepthd個ty緩沖區(qū)大小可以用_DBLARGE_DIRTY_QUEUE和

2*_DB_BL0C:K_WRITE_BATCH來確定.前臺進程繼續(xù)搜索freebuffer.直到

_DB_BLOCK_MAX_SCAN_CNT還沒有發(fā)現(xiàn)系統(tǒng)就會掛起該進程.記錄dirtybuffersinspected的

的靜態(tài)變量并把該進程標(biāo)志為freebufferwait.

cache和buffer_pool_keep足不一樣的,cache足如果對該表全表掃描的話,會把塊

放在mru端,buffer_pool_keep是放在keep池中

selecttablename,cache,bufferpoolfromdbatableswheretablename:'TEST';

將表和索引Cache到SGA中

從0RACLE805之后,支持ALTERTABLEtable_nameSTORAGE(BUFFER_P00LKEEP)命令了。

但是在805與8i中,需要設(shè)置buffer_pool_keep參數(shù)來設(shè)置KEEP池大小。這塊內(nèi)存來自數(shù)

據(jù)緩存區(qū),也就是從db_block_buffcrs中分配。在0RACLE8和8i中,還必須設(shè)置

db_block_lru」atchos參數(shù)“該參數(shù)應(yīng)該比2*3*CPU數(shù)量少,但是要大于1,否則無法設(shè)置

buffer_pooLkeepo在0RACLE9i中則需要設(shè)置DBKEEP_CACH憶SIZE來設(shè)置KEEP池內(nèi)存的

大小。這樣將表KEEP才有用。而且KEEP池要能夠容納得下才行的

將函數(shù)Cache到SGA中

@SORACLE_HOMI'Ardbms\admin\dbmspooI.sql;

execdbms_shared_poo1.keep('procedure_name','P');

重做日志緩沖區(qū)(LOG_BUFFER)

logbuffer分成內(nèi)部的bufferblocks,而這些block各有8個字節(jié)的頭部信息存在于

variablearea中.

當(dāng)重做日志緩沖區(qū)填滿時,將它的內(nèi)容寫入聯(lián)機重做日志文件。是循環(huán)使用。是數(shù)據(jù)庫

最活躍的情形,可以用V$SYSSTAT視圖進行監(jiān)控。查詢Y$SYSSTAT視圖value域,它表明用

戶進程等待重做日志緩沖區(qū)所花費的時間(此處value的值應(yīng)接近于0,否則應(yīng)增大初始化

參數(shù)文件的Logbuffers的值):

SELECTNAME,VALUEFROMV$SYSSTATWHERENAME='redologspacerequests*;

PGA

v$pgastatv$pgatarget_advice

后臺進程

v$bgpi'occss

■數(shù)據(jù)庫寫進程(DBWR)

(DBBLOCKWRITEBATCH,DBBLOCKMAXSCAN,DBWRITES,DBBLOCKLRULATCHES,DBBLO

OCKCHECKPOINTBATCH,DBBLOCKCHECKSUM)

負責(zé)數(shù)據(jù)文件的讀寫和db^data_buffer的清理

dbwr負責(zé)搜集dirtybuffer,slaves負貴寫磁盤

工作的前提條件:

1.dirtybuffer超出了dirtybufferlistMthreshold.2.serverprocess4

buffercache中查找freebuffeH寸,則也可能會通知DBWn將dirtybuffer寫入

datafile.3.DBWn每3秒會檢查是否有dirty數(shù)據(jù)要寫入

datafile.4.CKPT5.tablespaceoffline或tablespacebeginbackup(這里實際上

是由CKPT引起).6.dropobject7.shutdown(這里實際上也是由CKPT引起)

建議你使用與存儲數(shù)據(jù)文件的物理磁盤一樣多的DBVR進程;

DBWR寫入數(shù)據(jù)文件的任何修改已經(jīng)被記錄在重做日志文件中.

?次checkpoint的成功過程是:dbw「搜集dirtybuffer,交給slave寫磁盤,寫完畢

通知dbwr,然后dbwr才返回檢杳點完成。

增加寫進程,同時要調(diào)整db_block」ru」atches參數(shù),如修改或添加如下兩個參數(shù):

db_writer_processes=4

db_block」ru」atches=8

■日志寫進程(LGWR〕。

LOGCHI-CKPOINT^INTERVAL,L(X;_CHECKP()INT_TIMKOCT,LOG_CHI-CKP()1\TS_TO_ALERT

LGWR工作的主要條件如下

1.用戶提交

2.有1/3重做日志緩沖區(qū)未被寫入磁盤

3.有大于1M重做日志緩沖區(qū)未被寫入磁盤

4.超時

5.DBWR需要寫入的數(shù)據(jù)的SCN號大于LGWR記錄的SCN號,DBWR觸發(fā)LGWR寫入

■歸檔進程(ARCH)。

ARCHIVE_LOG_START

■檢查點(CKPT)o

同步數(shù)據(jù)文件,口志文件和控制文件

CKPT會更新數(shù)據(jù)文件/控制文件的頭信息.

CKPT工作的主要條件如下.

1.在日志切換的時候

2.數(shù)據(jù)庫用immediate,transaction,normal選項shutdown數(shù)據(jù)庫的時候

3.根據(jù)初始話文件LOG_CIiECKPOINT_INTERVAL.

LOG.CHECKPOINT_TIMI-OUT,FAST_START_IO_TARGET的設(shè)置的數(shù)值來確定

4.用戶觸發(fā)

■系統(tǒng)監(jiān)控和進程監(jiān)控進程(SMON和PMON)o

■調(diào)度進程(Dnnn)o

MTSDISPATCHERS

■恢復(fù)進程(RECO)o

DISTRIBUTED_TRANSACTIONS

■快照進程(SNPn)o

OB_QUEUE_PROCESS,JOB_QUEUE_INTERVAL

■鎖進程(LCKn)o

■并行查詢進程(Pnr.n)。

PARALLEL_MIN_SERVERS,PARALLEL_MAX_SERVERS

■用戶和服務(wù)器進程(Snnn)o

回滾

v$rollstatv$waitstatv$sysstatx$bhdba_rolIbacksegs

一下事務(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)容包括:

xid—TransactionID

UbaUndoBlockAddress

LekLockStatus

xid=Undo.Segment.Number+Transaction.Table.Slot.Number+Wrap

uba=Address.Of.Last.Undo.Block.Used+Sequence+Last.Entry,in.UNDO.Record.Map

ALTERSYSTI-MSETUNDO_MANAGEMENT=MANUALSCOPE二SPFILE;

SETTRANSACTIONUSEROLLBACKSEGMENTRBJARGEl;

當(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ù)的讀取的時間點的一致性,所以叫一致性

讀。

我們可以參考vSrollstatxv$transaction和x$bh表,在x$bh中的class字段,如果

是回滾段塊,假設(shè)回滾段USN為n,則回滾段頭class為ll+2n,回滾段塊為12+2n。

回滾段的使用、擴展、回縮

同一個事務(wù)不能跨越回滾段;一個回滾段至少包含2個exleni。每個回滾段有一個回滾

段頭,回滾段頭是一個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

之間擴展新的extent,并修改相應(yīng)的節(jié)點指針(回滾段的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ù)字典的操作的

truncatetabl?和droptablev如果truncatetableordroptable的過程中沒有成功,

則系統(tǒng)會根據(jù)系統(tǒng)回滾段中的數(shù)據(jù)字典操作信息對該DDL操作進行回退。另一個方面,就是

延遲回滾段(DeferredRollbackSegment)。表空間offline時用戶申請回滾,數(shù)據(jù)庫會將

回滾信息寫入系統(tǒng)回滾段(就是延遲回滾段),等到。nLne時,在寫入表空間。

回滾段的設(shè)置和管理

init.ora:transactionsperrollback_segmentfUtransactions,

maxrollbacksegments

1:系統(tǒng)并發(fā)事務(wù)數(shù)有多少?(主要是產(chǎn)生恢復(fù)信息的會話數(shù)+一部分冗余數(shù)(20)=總回滾

段數(shù))

2:系統(tǒng)是否存在大查詢或者大是事務(wù)?頻繁么?

3:能提供給系統(tǒng)的回滾段表空間的磁盤空間是多少?

不要將回滾段的MAXEXTENTS設(shè)為UNLIMITED,回滾段所在表空間也不要設(shè)為AUTOEKTEND

方式,否則將會使得由于某個不正常的事務(wù)導(dǎo)致整個數(shù)據(jù)庫處于失控狀態(tài)。

9i

undo_retention表示在自動管理模式下,回滾段中的數(shù)據(jù)在被覆蓋前保留多長的時間,

單位是秒。這個參數(shù)應(yīng)該決定于系統(tǒng)所中一些大查詢運行的時間改度,以避免0RA-01555錯

誤。

在9i下創(chuàng)建非自動管理的的回滾段而不使用UNDO表空間,則設(shè)置undojnanagement

為MANUAL,然后在系統(tǒng)表空間中創(chuàng)建一個回滾段(注意這是必須的),創(chuàng)建自己的回滾段表空

間,這時可以在I可滾段表空間中創(chuàng)建回滾段,創(chuàng)建完畢刪除系統(tǒng)表空間中的回滾段。

著名的0RA-01555問題

一致讀獲取的時候發(fā)現(xiàn)回滾段已經(jīng)被覆蓋而出現(xiàn)找人著變化前映像,也就是當(dāng)COMMIT

SCN大于T行詢嘗試去回滾段中找回數(shù)據(jù)卻發(fā)現(xiàn)回滾段已經(jīng)被覆蓋了(因為回滾段是循環(huán)使

用的),則會出現(xiàn)著名的0M名的55錯誤。

重做

vSs>fsstatvSlogv$logfilcv$1og_history

altersystemswitchlogfile;

重做記錄了塊的改變,包括I可滾段頭塊、I可滾段塊、數(shù)據(jù)塊,并且在塊改變之前先記錄

重做信息。

更改矢量(changevector)一當(dāng)要改變數(shù)據(jù)庫的數(shù)據(jù)時,這些改變的細節(jié)被記錄為更改

矢量。通過這些記錄,數(shù)據(jù)庫處理過程可以被重現(xiàn)。

簡而言之,一個更改矢量就是記錄/一個數(shù)據(jù)塊的行槽從一個狀態(tài)改變到另一個狀態(tài)的

過程。

也就是redo的記錄單位是entry,即:fileX,blockY,rowslotZ。

Redo也記錄了數(shù)據(jù)塊(tableblock&indexblock)前照,其實記錄的就是undo,因

為即使沒有commit,改動也會被記錄到redo文件里,這時的tableblock&indexblock

就是未提交的最新狀態(tài),如果此時系統(tǒng)崩潰,則需要redo中記錄的undo(前照)進行恢復(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.V^.LUE,(RBAR.VALUE*100)/

RE.VALUE|'"radio”FR0MV$SYSSTATRBAR,V$SYSSTATREWHERERBAR.NAME

='redobufferallocationretries,ANDRE.NAME='redoentries,;

這個比率小于1%才好,否則增加log_buffer的大小

2、log_checkpoint_interval

0racle8.1版本后log_checkpoint_interval指的是兩次checkpoint之間操作系統(tǒng)數(shù)據(jù)

塊的個數(shù)。checkpoint時Oracle把內(nèi)存里修改過的數(shù)據(jù)塊用DBWR寫到物理文件,用LGWR

寫到日志和控制文件.

從性能優(yōu)化來說logcheckpoint_interval=redologfilesizebytes/512bytes

3、logcheckpoint_timcout

0raclc8.1版本后1ogcheckpoint_timcout指的是兩次checkpoint之間時間秒數(shù)。

Oracle建議不用這個參數(shù)來控制,因為事務(wù)(transaction)大小不是按時間等量分布的。用

log_checkpoint_incerva1參數(shù)控制會好一些。禁用此參數(shù)或者按默認的900。

altersystemarchivelogcurrent;

第二個存檔日志目的地可以通過初始化參數(shù)LOG_ARCHEV憶DUPIEX_DEST設(shè)定。

L()G_ARCHEVE_DEST和LOG_ARCHEVE_DUPLEX_DEST都可以存檔所有的聯(lián)機重作日志文件。另一

個初始化參數(shù)LOGAKCH1VJM1NSUCCEEDDEST如果設(shè)置「的話,可以決定一個重作Fl志組必

須被成功存檔到的存檔日志目的地數(shù),在一個目的地滿或其介質(zhì)有錯時,該參數(shù)可以防止

Oracle被凍結(jié)。要確保這兩個目的地被配置在兩個分離的磁盤/控制器上,避免I/O沖突對

數(shù)據(jù)庫性能的影響。

一些參數(shù)

vSparameter

查看系統(tǒng)當(dāng)前使用的所有參數(shù)

SETpagesize9000

SETheadOFF

SETtermOFF

SELECTI)ECODI-(isdefault,'TRUE','#')11DECODE(isdefault,'TRUE',

RP.AD(name,43),RPAD(name,45))I'='||valueFROMv$parajneterORDERBYname;

查看所有參數(shù)是否已被init.ora重新設(shè)定

SELECTname,isspecifiedFROMv$obsoleteparameter;

查看過時參數(shù)和強調(diào)參數(shù)

SELECTkspponm,DECODE(ksppoflg,1,,Obsolete*,2,*Underscored*)FROMxSksppo

ORDERBYkspponm;

杳看當(dāng)前系統(tǒng)中的所有隙藏參數(shù)(以sys身份登錄)

SELECTksppinm,ksppstvl,ksppdescFROMx$ksppix,x$ksppcvyWHEREx.inst_id

=usorenv(,Instance')andy.instid=uscrcnv(,Instance')andx.indx=y.indx

andx.ksppinmlike*%_&par%'orderbytranslatc(x.ksppinm,''');

用戶參數(shù)

select*fromv$fixed_tablewherenamelike'%NLS%';

SELECT*FROMV$NLS_PARAMETERS;

ALTERSESSIONSETNLS_l)ATE_FOI^fAT=,YYYY-MM-DDHH24:MISS';

最常被修改的參數(shù):

Shared_pool_size分配給共享池的內(nèi)存字節(jié)數(shù)隨著用戶的需求,可以按時增加

此值

Rollback_segments數(shù)據(jù)庫啟動時獲取的一個或多個當(dāng)事務(wù)處理量增加或減少時,可

以從該回滾段名列表中增加或刪除回滾段名

Processes可同時訪問數(shù)據(jù)庫的最大進程數(shù)量

session=l.l*process+5,一般而言,session和process是對應(yīng)的,5是Oracle

后臺進程的session,10%是提供給recursivesession使用的。

db_b1ock_buffers見SG.A介紹中的相關(guān)內(nèi)容

shared_pool_size見SGA介紹中的相關(guān)內(nèi)容

log_buffer見邈_介紹中的相關(guān)內(nèi)容

sort_area_size

針對每個session,排序首先會使用sortareasize,如果不足則會使用臨時表空訶。實

際上就是外排序過程,把要排序的對象分割為內(nèi)存可以容納的小段(sortrun),然后每個

sortrun都放至sortarea里面去排序,排序結(jié)果作為中間信息放在臨時表空間的臨時段內(nèi),

由于分段排序的結(jié)果當(dāng)然不會是最終要求的排序結(jié)果,所以還要經(jīng)過一個merge的過程,才

會得到最終排序結(jié)果,原理大概是比較每個sortrun的第一名,取出領(lǐng)先者,然后該sortrun

的第二名頂上,繼續(xù)上述過程直到取完。

所以建議:Sort_arec_Size所能容納記錄數(shù)至少大于排序記錄數(shù)的平方根

5.open_cursor見SGA介紹中的相關(guān)內(nèi)容

6.database_writers

許多DBA有個錯誤的概念,認為此參數(shù)受CPU數(shù)量的限制,實際并非如此。提示:如果

工作在一個可以支持多進程的操作系統(tǒng)上,需做的第一件事就是改變這個參數(shù)的值。

重新啟動數(shù)據(jù)庫,使月startup命令,Oralce將會按照以下順序在缺省目錄中搜索參數(shù)

文件:

spfile${ORACLE_SID}.ora

缺省目錄UNIX:${OEACLE_HOME)/dbs/NT:${ORACLEJ1OME)\database

spfile.ora

缺省目錄UNIX:${ORACLE_HOME)/dbs/NT:S(ORACLE_HOME)\database

init${ORACLESID).ora

缺省目錄UNIX:${ORACLE_HOME}/dbs/

NT:${ORACLE_HOME}\databaseor${ORACLE_H()ME}\a(lmin\db_name\pfile\

創(chuàng)建了spfile,重新啟動數(shù)據(jù)庫,()racle會按順序搜索以上目錄,spfile就會自動生效。

startuppfile=,E:\Oracle\admin\eyglen\pfile\init.ora';

createspfilefrompfile;

然后我們可以使用ALTERSYSTEM方式將修改固定到SPFILE.

ALTERSYSTEMSETleg.archive_start=FALSESCOPE二spfile;

空間管理

.主體思想一直圍繞著內(nèi)部段的擴展。不僅僅影響到空間大小,自由塊太分散的話會影響

性能(I/O,及擴展時間等)

空閑表(主空閑表、進程空閑表、事務(wù)空閑表),可能存在于表頭塊中

表空間

droptablespace***includingcontents;

注:LMT是segment中extent的管理,ASSM是thefreespacoofsegment的管理<,

在0racle8I的版本中,Oracle推出了一種全新的表空間管理方式:本地化管理的表空

間。所謂本地化管理,就是指Oracle不再利用數(shù)據(jù)字典表來記錄Oracle表空間里面的extent

的使用狀況,而是在每個表空間的數(shù)據(jù)文件的頭部加入了一個位圖區(qū),在其中記錄每個

extent的使用狀況。每當(dāng)一個extent被使用,或者被釋放以供重新使用時,Oracle都會更

新數(shù)據(jù)文件頭部的這個記錄,反映這個變化。

Oracle之所以推出了這種新的表空間管理方法,這種表空間組織方法的優(yōu)點:

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)

生回滾信息。

由于這種表空間的以上特性,所以它支持在一個表空間里邊進行更多的并發(fā)操作,并減

少了對數(shù)據(jù)字典的依賴。

對于表空間中的每一個空間(一個或多個extent),我們必須知道:

1、這個可用空間位于什么數(shù)據(jù)文件

2、這個空間的尺寸是多大

3、如果它在用了,是哪一個段占用的這個空間

直到8i之前,所有的表空間都是采用字典管理模式,為了確保能保存以上的信息,ORACLE

用了兩個數(shù)據(jù)字典表:UET5(已使用的區(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)成(氣泡間有邊界),去掉邊界,蜂窩并成一個大的氣泡。氣泡和蜂窩多是由于

擴展段的釋放而產(chǎn)生。過多的小的氣泡會導(dǎo)致DDL操作時多次掃描SYS.FET$,并花時間合并

可用空間,影響性能。

讓我們看一下當(dāng)一個行被從一個應(yīng)用程序中插入到表中時發(fā)生的一系列動作:

1)杳表的自由列表,考慮在哪可以放一個新行。如果沒有自由塊可用,需要分配一個新

的擴展段。

2)Oracle掃描SYS.FET$表,為空間中的擴展段定位自由空間。

3)第一次掃描找出可以供新的擴展段使用的氣泡。新擴展段的大小計算使用大于擴展段

所需塊數(shù)的、下一個可被5整除的數(shù)。例如,如果一個擴展段包含23塊,則得到的數(shù)是25

塊v然而,如果需要的是5塊或更小,就不必這樣計算,一旦塊數(shù)確定,第一次掃描就尋找

塊數(shù)恰好滿足需要的氣泡。

4)如果沒有找到恰好合適的,那么Oracle掃描大些的氣泡。如果一個大的氣泡所擁有

的塊數(shù)比所需要的塊數(shù)多5塊或5塊以上(當(dāng)然是在取了約數(shù)以后),那么氣泡中的自由空間

分成兩部分,一部分滿足擴展段的需要,另一部分仍作為自由空間。新的(小一些的)的自

由空間氣泡包括去掉所需的塊數(shù)后剩下的塊數(shù)(5塊或多于5塊)。例如,如果需要的塊數(shù)

是25,但找到了一個32塊的氣泡,那么Oracle占用其中的25塊分配給擴展段并保持剩下

的7塊形成一個分開的氣泡,仍然保留在原處。另外一種情況,找到了一個28塊的氣泡,那

么只是把此氣泡供擴展段使用。換句話說,如果多余的塊數(shù)少于5就不產(chǎn)生分割操作。

5)如果所有現(xiàn)有的氣泡都太小,不足以滿足擴展段的需要(即沒有找到大小相等的也沒

有找到大于數(shù)據(jù)塊數(shù)的氣泡),那么進行第三次掃描尋找是否有可以合并的蜂窩能提供所需的

空間。在合并以后,再次進行第3步和第4步。

6)如果前面的幾步都沒有找到能夠供擴展段使用的氣泡,那么Oracle檢查AUTOEXTEND

功能是否已被使能(后面詳細介紹這一選項)。如果是的,再檢查數(shù)據(jù)文件是否是可擴展的。

7)如果AUTOEXTEND沒有被使能或者在磁盤上(數(shù)據(jù)文件所在的磁盤)沒有足夠的空間

來擴大該數(shù)據(jù)文件,Oracle返回“0RAT650-55:Unabletoextend”錯誤消息,引起應(yīng)用失

敗。

預(yù)防措施:

1)將大小相同而且增長率相似的段應(yīng)該保存在相同的表空間集合中,保證釋放的氣泡可

以高效地被別的段重新使用。

2)理想情況下,一個表空間中的所有段應(yīng)該有相同的存儲參數(shù)(對每一個段有相同的

1NITIAL/NEXT值)。如果不能做到這一點,要保證不同段的存儲參數(shù)要互為倍數(shù),為所有的

表空間指定DEFAULTSTORAGE參數(shù)。

3)一旦可能,指定PCTINCREASE=O。當(dāng)由于沒有定義增長模式而不可能指定該值時,

用100作為PCTINCREASE的可能值。在任何情況下,不要用如1、5等的隨機值,以防止生成

奇數(shù)大小的擴展段。

4)周期性顯式地合并應(yīng)用程序的表空間。不要配置SMON來自動合并表空間,因為它需

要在表空間的DEFAULTSTORAGE語句中指定一個大于0的PCTINCREASE的值。

識別表空間段情況、重構(gòu)特定文件:

1)識別表空間中的擴展段、氣泡、蜂窩:

SETLINES132

SETPAGES500

COLUMN“FIL」D”FROMAT999HEADING

COLUMN“FIL”FORMATA55HEADING"Fl『NAME”

COLUMN“SEGMENT”FROMATA55

COLUMN“STARTBLK”FROMATHEADING“START|BLK”

COLUMN"BLOCKS”FORMAT999,999HEADING“中BLKS”

SELECTD.FILE.ID“FIL」D",D.FILE_NAME“FIL”,SEGMENT-TYPE11''||OWNER

I|'/IlSEGMENT_NAME“SEGMENT",E.BLOCKED“STARTBLK”,

E.BLOCKS“#BLOCKS”

FROMDBA_EXTENTSE,DBA_DATA_FILESD

WHEREE.TABLESPACE.NAME=UPPER('&&TBLSPC_NAME')

ANDD.TABLESPACE_NAME=E.TABLESPACE_NAMEANDD.FILE_ID=E.FILE_ID

INION

SELECTS.FILE_IDrtFIL_IDw,D.FILE.NAME“FIL",'FREECHUNK'"SEGMENT”,

S.BLOCK」D“STARTBLK”,S.BLOCKS“#BLOCKS”

FROMDBA_FREE_SPACES,DBA_DATA_FILESD

WHERES.TABLESPACE_NAME=UPPER('&&TBLSPC_NAME')

ANDD.TABLESPACE_NAME=S.TABLESPACE_NAMEANDD.FILEJD=S.FILE_ID

ORDERBY1,4,5

結(jié)果:

FISTART

L_IDFILSEGMENTBLKBLOCKS

/opt/app/oracle/oradata/or(

1cl/systemOl.dbfROIJ.BACKSYS,SYSTEM210

/opt/app/orac1e/oradata/orc.

1cl/systemOl.dbfROLLBACKSYS,SYSTEM1210

/opt/app/orac1e/oradata/orc

1cl/systemOl.dbfCLUSTERSYS,C_OBJ#2220

1/opt/app/orac1e/oradata/orcINDEXSYS,IOBJ#422

cl/systcmOl.dbf

/opt/app/orac1e/oradata/or(

1cl/systemOl.dbfCLUSTERSYS,C_TS#442

/opt/app/orac1e/oradata/orc

1cl/systemOl.dbfINDEXSYS,I一TS#462

/opt/app/orac1e/oradata/orcCLUSTER

1cl/systcmOl.dbfSYS,C_FILE#_BLOC

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論