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

下載本文檔

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

文檔簡(jiǎn)介

ORACLE的工作機(jī)制體系結(jié)構(gòu)實(shí)例Oracle 運(yùn)行的時(shí)候,在內(nèi)存中會(huì)要開辟一個(gè)區(qū)間,這個(gè)區(qū)間主要是用于從磁盤(數(shù)據(jù)文件)中讀出數(shù)據(jù)后的一個(gè)在內(nèi)存的緩存和處理。而處理這些數(shù)據(jù)的操作,需要有一些系統(tǒng)的后臺(tái)進(jìn)程,這些進(jìn)行在Oracle數(shù)據(jù)庫啟動(dòng)的時(shí)候,就開始運(yùn)行,一直在響應(yīng)前臺(tái)的操作。實(shí)際上,這一個(gè)區(qū)間(SGA)和這些后臺(tái)進(jìn)程合在一起,就稱為 實(shí)例。實(shí)例是包括SGA區(qū)和后臺(tái)進(jìn)程兩個(gè)部分的。 數(shù)據(jù)庫啟動(dòng)執(zhí)行若干動(dòng)作,經(jīng)歷三個(gè)階段,分別是未加載、加載和打開。1、未加載(nomount) 可以把數(shù)據(jù)庫啟動(dòng)的這一階段看作是Oracle實(shí)例的啟動(dòng)。這種方式啟動(dòng)下可執(zhí)行:重建控制文件、重建數(shù)據(jù)庫。這一啟動(dòng)命令: 讀取數(shù)據(jù)庫參數(shù)文件。 啟動(dòng)所需的后臺(tái)進(jìn)程并按參數(shù)文件中的定義分配內(nèi)存。 將進(jìn)展情況寫入告警日志文件中。2、加載(mount) 在實(shí)例啟動(dòng)加載階段,數(shù)據(jù)庫參數(shù)文件中指定的控制文件被讀取。記住控制文件將數(shù)據(jù)庫各部分聯(lián)系在一起。實(shí)例從控制文件中找到下列信息,然后將進(jìn)展寫入告警日志文件。這種方式啟動(dòng)下可執(zhí)行:數(shù)據(jù)庫日志歸檔、數(shù)據(jù)庫恢復(fù)、重新命名一些數(shù)據(jù)庫文件: 所有數(shù)據(jù)文件和重做日志文件的名稱和位置。 數(shù)據(jù)庫名。 最新系統(tǒng)更改號(hào)(S C N)。3、打開(open) 包含在數(shù)據(jù)庫中的每個(gè)聯(lián)機(jī)數(shù)據(jù)文件在數(shù)據(jù)庫打開前必須被同步。在數(shù)據(jù)庫打開階段: 所有聯(lián)機(jī)數(shù)據(jù)文件的頭與控制文件信息相比較。 所有文件同步后,數(shù)據(jù)庫打開。當(dāng)數(shù)據(jù)庫關(guān)閉時(shí),取決于它的關(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ī)會(huì)。這種方式關(guān)閉后需要實(shí)行崩潰恢復(fù)。實(shí)例是數(shù)據(jù)管理的核心它做所有的工作,而數(shù)據(jù)庫存儲(chǔ)所有的數(shù)據(jù)。其他啟動(dòng)方式:startup restrict 約束方式啟動(dòng)這種方式能夠啟動(dòng)數(shù)據(jù)庫,但只允許具有一定特權(quán)的用戶訪問 非特權(quán)用戶訪問時(shí),會(huì)出現(xiàn)以下提示: ERROR: ORA-01035: ORACLE 只允許具有 RESTRICTED SESSION 權(quán)限的用戶使用 startup force 強(qiáng)制啟動(dòng)方式 當(dāng)不能關(guān)閉數(shù)據(jù)庫時(shí),可以用startup force來完成數(shù)據(jù)庫的關(guān)閉 先關(guān)閉數(shù)據(jù)庫,再執(zhí)行正常啟動(dòng)數(shù)據(jù)庫命令 startup pfile=參數(shù)文件名 帶初始化參數(shù)文件的啟動(dòng)方式 先讀取參數(shù)文件,再按參數(shù)文件中的設(shè)置啟動(dòng)數(shù)據(jù)庫 startup EXCLUSIVE*一個(gè)Delete操作的流程:1、 檢查語法、語義(V$ROWCACHE :data dictionary cache),計(jì)算HASH VALUE,在session的UGA中進(jìn)行匹配(session_cached_cursors),如果UGA中沒有,在library chache 中匹配(library chache lock latch 保護(hù) library chache lock 對(duì)地址堆的訪問,而后 library chache pin latch 保護(hù) library cache pin 對(duì)library cache中sql相關(guān)信息的訪問)2、 根據(jù)執(zhí)行計(jì)劃讀取數(shù)據(jù):cache buffer chain latch 保護(hù)能定位到buffer header 并 pin 住該塊(如果沒有buffer header,就 pin 住某個(gè)空塊(沒有空塊就產(chǎn)生 free buffer waits),并到數(shù)據(jù)文件中讀?。?。如果此時(shí)有某個(gè)進(jìn)程想訪問該塊,將產(chǎn)生 buffer busy waits 。3、 在redo log buffer中記錄delete操作的細(xì)節(jié)。(包括回滾段前后鏡像、數(shù)據(jù)塊前后鏡像)。4、 在相應(yīng)回滾段段頭的事務(wù)表中創(chuàng)建一個(gè)undo條目,把將要?jiǎng)h除的記錄創(chuàng)建前鏡像,存放到Undo Block中。5、 在Buffer Cache中的相應(yīng)數(shù)據(jù)塊上刪除記錄,并且標(biāo)記相應(yīng)的數(shù)據(jù)塊為Dirty。提交(COMMIT)1.Oracle產(chǎn)生一個(gè)SCN2.在回滾段事務(wù)表中標(biāo)記該事務(wù)狀態(tài)為commited3.LGWR Flush Log Buffer到日志文件3.如果此時(shí)數(shù)據(jù)塊仍然在Buffer Cache中,那么SCN將被記錄到Block Header上,這被稱為快速提交(fast commit)4.如果dirty block已經(jīng)被寫回到磁盤,那么下一個(gè)訪問這個(gè)block的進(jìn)程將會(huì)自回滾段中獲取該事務(wù)的狀態(tài),確認(rèn)該事務(wù)被提交。然后這個(gè)進(jìn)程獲得提交SCN并寫回到Block Header上。這被稱為延遲塊清除(delayed block cleanout)。內(nèi)存SGA(系統(tǒng)全局區(qū)、共享全局區(qū))、PGA(進(jìn)程全局區(qū)、私有全局區(qū))內(nèi)存分配原則:10%冗余內(nèi)存,OS SYS進(jìn)程(約1.6G),OS BUFFER(約0.8G),數(shù)據(jù)庫連接消耗內(nèi)存(每個(gè)連接約58M),PGA(每個(gè)連接約2M,V$PGA_TARGET_ADVICE),SGASGAv$sgastat 注意 show parameter sga_max_sizeOracle的內(nèi)存:l 軟件代碼區(qū)l 系統(tǒng)全局區(qū)l 進(jìn)程全局區(qū):包含單個(gè)進(jìn)程的數(shù)據(jù)和控制信息l 排序區(qū)System Global AreaFixed SizeVariable SizeDatabase BuffersRedo buffersLarge poolShared PoolLibrary cacheData dictionary cacheUser Global Area共享SQL區(qū)專用SQL區(qū)db_cache_sizedb_keep_cache_sizedb_recycle_cache_sizedb_nk_cache_size永久性內(nèi)存結(jié)構(gòu)Java poolSGA中的The fixed area包含了數(shù)千個(gè)原子變量,以及如指向SGA中其它區(qū)域的pointers(指針)等小的數(shù)據(jù)結(jié)構(gòu).通過對(duì)fixed table內(nèi)表X$KSMFSV查詢(如下)可以獲得這些變量的名字,變量類型,大小和在內(nèi)存中的地址.the variable area是由large pool和shared pool組成Shared pool中永久性的內(nèi)存包含各種數(shù)據(jù)結(jié)構(gòu)如:the buffer headers, processes, sessions, transaction arrays, the enqueue resources , locks, the online rollback segment arrays, various arrays for recording statistics.其中大部分的SIZE是依靠初始參數(shù)的設(shè)置來確定的.這些初始參數(shù)只能在實(shí)例被關(guān)閉的狀態(tài)下才能夠進(jìn)行修改.所以這里說的永久性是針對(duì)實(shí)例打開狀態(tài)下的生存期而言.The variable area的在SGA中的SIZES就等于LARGE_POOL_SIZE,SHARED_POOL_SIZE和永久性的內(nèi)存arrays的SIZE三者相加.永久性內(nèi)存arrays的SIZE=the variable area - (LARGE_POOL_SIZE+SHARED_POOL_SIZE).數(shù)據(jù)緩沖區(qū)命中率v$sysstat這里命中率的計(jì)算應(yīng)該是令 x = physical reads direct + physical reads direct (lob)命中率 =100 - ( physical reads - x) / (consistent gets + db block gets - x)*100通常如果發(fā)現(xiàn)命中率低于90%,則應(yīng)該調(diào)整應(yīng)用可可以考慮是否增大數(shù)據(jù)緩沖區(qū)共享池的命中率SQL select sum(pinhits-reloads)/sum(pins)*100 hit radio from v$librarycache;hit radio-99.809291假如共享池的命中率低于95%,就要考慮調(diào)整應(yīng)用(通常是沒使用bind var )或者增加內(nèi)存關(guān)于排序部分SQL select name,value from v$sysstat where name like %sort%;NAME VALUE- -sorts (memory) 67935sorts (disk) 1sorts (rows) 7070假如我們發(fā)現(xiàn)sorts (disk)/ (sorts (memory)+ sorts (disk)的比例過高,則通常意味著sort_area_size 部分內(nèi)存較小,可考慮調(diào)整相應(yīng)的參數(shù)。關(guān)于log_bufferSQL select name,value from v$sysstat2 where name in(redo entries,redo buffer allocation retries);NAME VALUE- -redo entries 2325719redo buffer allocation retries 10假如 redo buffer allocation retries/ redo entries 的比例超過1%我們就可以考慮增大log_buffer如何在Linux上擴(kuò)展SGA超過1.7G共享池(SHARED_POOL_SIZE)v$shared_pool_adviceALTER SYSTEM FLUSH SHARED_POOLHow to Keep Objects - 重點(diǎn)使用DBMS_SHARED_POOL.KEEP過程來keep objects, UNKEEP過程從shared pool中移走pinned objectsexecute dbms_shared_pool.keep(address,hash_value); - keep 該匿名塊共享池包括庫高速緩存( library cache)、數(shù)據(jù)字典高速緩存和服務(wù)器控制結(jié)構(gòu)(例如數(shù)據(jù)庫字符集)。Oracle服務(wù)器用庫高速緩存來提高執(zhí)行SQL語句的性能;庫高速緩存包括共享和專用SQL區(qū)。共享SQL區(qū)包括SQL語句語法分析樹和執(zhí)行路徑,而專用SQL區(qū)存儲(chǔ)特定的會(huì)話信息,例如捆綁變量、環(huán)境和會(huì)話參數(shù)、運(yùn)行堆棧和緩沖區(qū)等。Soft parse使用的資源包括CPU 和library cache latch getsHard parse是指要解析的SQL沒有在library cache中,或者執(zhí)行的時(shí)候發(fā)現(xiàn)解析過的SQL已經(jīng)aged out,就是離開了library cache,稱為L(zhǎng)ibrary cache misses使用的資源包括額外的CPU, library cache latch gets, 以及shared pool latch gets.專用SQL區(qū)在每個(gè)事務(wù)初始化時(shí)創(chuàng)建,在與專用SQL區(qū)相關(guān)的游標(biāo)關(guān)閉時(shí)被釋放。一個(gè)用戶會(huì)話能夠一次打開的專用SQL區(qū)的數(shù)量由init.ora參數(shù)OPEN_CURSORS決定。使用這兩個(gè)結(jié)構(gòu),Oracle服務(wù)器能夠重用一條SQL語句的所有執(zhí)行的共同信息。與此同時(shí),可以從專用SQL區(qū)中查詢執(zhí)行的特定會(huì)話信息。注意游標(biāo)使用過程中并不關(guān)閉游標(biāo)的應(yīng)用會(huì)繼續(xù)為應(yīng)用分配越來越多的內(nèi)存,部分原因是為每個(gè)打開的游標(biāo)分配了專用SQL區(qū)。庫高速緩存中的專用SQL區(qū)可更進(jìn)一步分為永久區(qū)和運(yùn)行區(qū)。共享池的大小取決于init.ora文件參數(shù)SHARED_POOL_SIZE,它是以字節(jié)為單位的。你必須將這個(gè)值設(shè)得足夠大,以確保有足夠的可用空間來裝載和存儲(chǔ)PL/SQL塊和SQL語句。共享區(qū)經(jīng)過長(zhǎng)期裝卸和卸載數(shù)據(jù)對(duì)象會(huì)產(chǎn)生許多碎片,如果在共享池中沒有足夠的連續(xù)空間用來裝載目標(biāo)數(shù)據(jù),會(huì)產(chǎn)生錯(cuò)誤。解決這個(gè)問題的捷徑是運(yùn)行SQL命令A(yù)LTER SYSTEM FLUSH SHARED_POOL。但是如果在數(shù)據(jù)庫操作時(shí),經(jīng)常遇到共享池錯(cuò)誤,你必須增大共享池Library cache包含 shared SQL and PL/SQL areas(PL/SQL包括Procedures, Functions, Packages, Trigger, 匿名PL/SQL塊) Sizing the Library Cache定義stored object(packages,views等等)的內(nèi)存需求;定義經(jīng)常使用的sql statement的所需內(nèi)存1. 初始時(shí)將SHARED_POOL_SIZE設(shè)得很大,運(yùn)行應(yīng)用程序2. 計(jì)算stored object所占的內(nèi)存SELECT SUM(sharable_mem) FROM v$db_object_cacheWHERE type = PACKAGE or type = PACKAGE BODY or type = FUNCTION or type = PROCEDURE;3. 應(yīng)用程序運(yùn)行一段時(shí)間后,估計(jì)常用sql語句所占的內(nèi)存(不包括動(dòng)態(tài)SQL)SELECT SUM(sharable_mem)FROM v$sqlareaWHERE executions 5;4. 對(duì)每個(gè)user每個(gè)打開的cursor,需要250bytes,可在運(yùn)行高峰期間使用查詢:SELECT SUM(250 * users_opening) FROM v$sqlarea;5. 在測(cè)試環(huán)境中,可讓一個(gè)用戶打開一定數(shù)量的cursor,運(yùn)行下列語句測(cè)試共享內(nèi)存,然后乘上user數(shù)SELECT 250 * value bytes_per_userFROM v$sesstat s, v$statname nWHERE s.statistic# = n.statistic#AND = opened cursors currentAND s.sid = 15;以上內(nèi)存的和,再加上一點(diǎn)內(nèi)存(留給動(dòng)態(tài)SQL使用),作為你的應(yīng)用的理想內(nèi)存設(shè)置;預(yù)留一部分空間作為大的內(nèi)存需要,避免miss和碎片;一些大的內(nèi)存需要: PL/SQL塊的編譯,trigger的編譯;小的object不會(huì)使預(yù)留空間碎片化,反而保證reserved list有大的連續(xù)塊,一旦從reserved list中分配的內(nèi)存釋放它就返回reserved list。影響的參數(shù):SHARED_POOL_RESERVED_SIZE初始值=SHARED_POOL_SIZE*10%, 超過50%,oracle server報(bào)錯(cuò)OPEN_CURSORS 缺省=50定義了涉及分配給用戶進(jìn)程的私有SQL區(qū)域的cursors數(shù)量, 一個(gè)private SQL area一直存在直至cursor關(guān)閉;為了利用更多的內(nèi)存給共享SQL區(qū)域,需要提高session每個(gè)session允許多cursor數(shù)量,開發(fā)人員應(yīng)關(guān)閉不需要的cursor節(jié)省內(nèi)存CURSOR_SPACE_FOR_TIME 缺省=FALSE 布爾值設(shè)置TRUE,表示以空間換取時(shí)間,共享SQL區(qū)不會(huì)被aged out直至相關(guān)的cursor被關(guān)閉,因此確信有足夠的內(nèi)存,沒有cache miss;除非RELOADS in V$LIBRARYCACHE一直為0,否則不要改變此參數(shù)值若應(yīng)用為FORM或使用動(dòng)態(tài)SQL,設(shè)此值為FALSE - 因?yàn)閯?dòng)態(tài)sql總是不一致,將占用過多內(nèi)存SESSION_CACHED_CURSORS 缺省=0 表示沒有cache當(dāng)一個(gè)session打算關(guān)閉一個(gè)cursor時(shí),如果這個(gè)cursor的parse count超過3次,那么這個(gè)cursor將會(huì)被加到session cursor cache list的MRU端.當(dāng)一個(gè)session打算parse一個(gè)sql時(shí),它會(huì)先去session的pga內(nèi)搜索session cursor cache list,如果找到那么會(huì)把這個(gè)cursor脫離list,然后當(dāng)關(guān)閉的時(shí)候再把這個(gè)cursor加到MRU端. session_cached_cursor提供了快速軟分析的功能,提供了比soft parse更高的性能. 檢查系統(tǒng)是否需要此參數(shù)的方法:對(duì)某個(gè)典型用戶sessionselect a.sid,,a.value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and (=session cursor cache hits or like parse count%);If few parses result in hits,則可提高此參數(shù),注意它將increase overall demands on memory. - ?Data Dictionary CacheSelect type, parameter, gets, getmisses, round(getmisses/decode(gets,0,null,gets)*100,2) ratio(%) from v$rowcache;Goal for a Good Ratio SUM(GETMISSES)/SUM(GETS) Performance ManagerMemoryData Dictionary Cache Hit%檢索需要在共享池中要求大于100K連續(xù)空間的對(duì)象:select * from v$db_object_cache where sharable_mem 100000 and type in (PACKAGE, PACKAGE BODY, PROCEDURE, FUNCTION);考察返回的結(jié)果,確認(rèn)是否需要pin到共享池中,返回結(jié)果中的KEPT字段如果是YES,那么表示該對(duì)象已經(jīng)固定在了共享池中,為NO,則表示還沒有固定。如果需要固定,使用下面的語句:exec dbms_shared_pool.keep(SYS.STANDARD); 數(shù)據(jù)庫默認(rèn)安裝的時(shí)候沒有創(chuàng)建dbms_shared_pool包,所以需要先創(chuàng)建該包。cd $ORACLE_HOME/rdbms/adminsqlplus “/ as sysdba”dbmspool.sqlDATA BUFFER - 數(shù)據(jù)庫緩沖區(qū)高速緩存v$db_cache_advice=一堆數(shù)據(jù)塊(DB_BLOCK_SIZE*DB_BLOCK_BUFFERS)數(shù)據(jù)庫的任何修改都在該緩沖里完成(LRU-LRUW)。所有的塊,被讀到內(nèi)存中后,它的塊頭(data block header)放在一個(gè)Cache buffer chain 中,Cache buffer chain由多個(gè)雙向hash 鏈表組成,hash鏈表數(shù)量由_db_block_hash_buckets決定.每個(gè)數(shù)據(jù)塊頭由DBA(data block address)作為key,經(jīng)hash函數(shù)后放在鏈表上,它和block buffer中的block一一對(duì)應(yīng),數(shù)據(jù)塊頭不包括實(shí)際的數(shù)據(jù),僅是一個(gè)簡(jiǎn)單的描述. 后臺(tái)進(jìn)程掃描hash鏈表前,必須獲得cache buffer chain latch,如果在Cache Buffer chain中找不某塊,就由磁盤讀入. 若需要查找某個(gè) block,則根據(jù) block的信息能計(jì)算 hash value 然后迅速定位到 hash table ,然后根據(jù)hash table 信息去查看是否存在所想要的 buffer ,若有則命中,若沒有則不命中。顯然不可能根據(jù)list去逐個(gè)搜索,這樣效率太低.LRU 就是一種盡可能將常用的數(shù)據(jù)保留在內(nèi)存的算法.當(dāng)數(shù)據(jù)庫需要一個(gè)數(shù)據(jù)緩沖區(qū), 他會(huì)從數(shù)據(jù)庫緩沖區(qū)的LRU 隊(duì)列的尾部找一個(gè)空閑的緩沖, 將一個(gè)數(shù)據(jù)塊讀入, 然后數(shù)據(jù)庫會(huì)把這個(gè)緩沖區(qū)放到LRU 隊(duì)列的中部, 如果該緩沖被其他程序用到的話, 那么他會(huì)往隊(duì)列的頭上移動(dòng), 如果這個(gè)緩沖沒有被其他程序用到,并且沒有被修改過, 那么他會(huì)慢慢的移動(dòng)到LRU 隊(duì)列的尾部, 最終被認(rèn)為是空緩沖區(qū)被其他數(shù)據(jù)塊所覆蓋.一旦這個(gè)緩沖區(qū)被修改過DBWR 把他從LRU 隊(duì)列中移出, 放到LRUW 隊(duì)列 (也叫贓緩沖區(qū)) 中, 等待DBWR 把他們批量寫入數(shù)據(jù)文件, 然后再把他們的緩沖區(qū)連接到LRU 隊(duì)列的尾部.周而復(fù)始的工作.如果查找在一個(gè)閥值內(nèi)沒有結(jié)果或者造成dirty緩沖區(qū)已經(jīng)溢出,在進(jìn)一步查找free buffer前系統(tǒng)將發(fā)出一個(gè)消息給DBWR讓他可以將LRUW隊(duì)列的緩沖區(qū)寫入磁盤. 這個(gè)閥值被叫做這個(gè)閥值被叫做DBWR scan depthdirty緩沖區(qū)大小可以用 _DB_LARGE_DIRTY_QUEUE和 2*_DB_BLOCK_WRITE_BATCH 來確定. 前臺(tái)進(jìn)程繼續(xù)搜索free buffer.直到 _DB_BLOCK_MAX_SCAN_CNT還沒有發(fā)現(xiàn)系統(tǒng)就會(huì)掛起該進(jìn)程.記錄dirty buffers inspected的靜態(tài)變量并把該進(jìn)程標(biāo)志為free buffer wait.cache 和 buffer_pool_keep是不一樣的,cache 是如果對(duì)該表全表掃描的話,會(huì)把塊放在mru端 ,buffer_pool_keep是放在 keep池中select table_name,cache,buffer_pool from dba_tables where table_name=TEST;將表和索引 Cache 到 SGA 中從ORACLE805之后,支持ALTER TABLE table_name STORAGE(BUFFER_POOL KEEP)命令了。但是在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_HOMErdbmsadmindbmspool.sql;exec dbms_shared_pool.keep(procedure_name,P);重做日志緩沖區(qū)(LOG_BUFFER)log buffer分成內(nèi)部的buffer blocks,而這些block各有8個(gè)字節(jié)的頭部信息存在于variable area中.當(dāng)重做日志緩沖區(qū)填滿時(shí),將它的內(nèi)容寫入聯(lián)機(jī)重做日志文件。是循環(huán)使用。是數(shù)據(jù)庫最活躍的情形,可以用V$SYSSTAT視圖進(jìn)行監(jiān)控。查詢V$SYSSTAT視圖value域,它表明用戶進(jìn)程等待重做日志緩沖區(qū)所花費(fèi)的時(shí)間(此處value的值應(yīng)接近于0,否則應(yīng)增大初始化參數(shù)文件的Log_buffers的值):SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME = redo log space requests;PGAv$pgastat v$pga_target_advice后臺(tái)進(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é)搜集dirty buffer,slaves負(fù)責(zé)寫磁盤工作的前提條件:1. dirty buffer超出了dirty buffer list的threshold.2. server process在buffer cache中查找free buffer時(shí),則也可能會(huì)通知DBWn將dirty buffer寫入datafile.3. DBWn每3秒會(huì)檢查是否有dirty數(shù)據(jù)要寫入datafile.4.CKPT5.tablespace offline或tablespace begin backup(這里實(shí)際上是由CKPT引起).6.drop object7. shutdown (這里實(shí)際上也是由CKPT引起)建議你使用與存儲(chǔ)數(shù)據(jù)文件的物理磁盤一樣多的DBWR進(jìn)程;DBWR寫入數(shù)據(jù)文件的任何修改已經(jīng)被記錄在重做日志文件中.一次checkpoint的成功過程是:dbwr搜集dirty buffer,交給slave寫磁盤,寫完畢通知dbwr,然后dbwr才返回檢查點(diǎn)完成。增加寫進(jìn)程,同時(shí)要調(diào)整db_block_lru_latches參數(shù),如修改或添加如下兩個(gè)參數(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.超時(shí)5.DBWR需要寫入的數(shù)據(jù)的SCN號(hào)大于LGWR記錄的SCN號(hào),DBWR觸發(fā)LGWR寫入歸檔進(jìn)程(ARCH)。ARCHIVE_LOG_START檢查點(diǎn)(CKPT)。同步數(shù)據(jù)文件,日志文件和控制文件CKPT會(huì)更新數(shù)據(jù)文件/控制文件的頭信息.CKPT工作的主要條件如下1.在日志切換的時(shí)候2.數(shù)據(jù)庫用immediate,transaction,normal選項(xiàng)shutdown數(shù)據(jù)庫的時(shí)候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用戶和服務(wù)器進(jìn)程(Snnn)?;貪Lv$rollstat v$waitstat v$sysstat x$bh dba_rollback_segs一下事務(wù)的流程:1.分配一個(gè)回滾段2.在回滾段事務(wù)表中分配一個(gè)事務(wù)槽3.分配undo block4.更新數(shù)據(jù)塊上的ITL事務(wù)槽5.把前鏡像記錄在undo block內(nèi)6.更改數(shù)據(jù)塊的內(nèi)容ITL事務(wù)槽-Interested Transaction List(ITL)ITL內(nèi)容包括:xid-Transaction IDUba-Undo Block AddressLck-Lock Statusxid=Undo.Segment.Number+Transaction.Table.Slot.Number+Wrapuba=Address.Of.Last.Undo.Block.Used+Sequence+Last.Entry.in.UNDO.Record.MapALTER SYSTEM SET UNDO_MANAGEMENT=MANUAL SCOPE=SPFILE;SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;當(dāng)一個(gè)事務(wù)開始的時(shí)候,會(huì)首先把變化前的數(shù)據(jù)和變化后的數(shù)據(jù)先寫入日志緩沖區(qū),然后把變化前的數(shù)據(jù)寫入回滾段,最后才在數(shù)據(jù)緩沖區(qū)中修改數(shù)據(jù)一致性讀取consistent reads假設(shè)查詢開始的時(shí)候的SCN 為T,則在查詢所掃描的數(shù)據(jù)塊中,如果數(shù)據(jù)的COMMIT SCN 小于T,則查詢接受該數(shù)據(jù),如果COMMIT SCN 大于T 或者說還沒有產(chǎn)生COMMIT SCN,則查詢會(huì)嘗試去回滾段中查找數(shù)據(jù)。這是為了保證數(shù)據(jù)的讀取的時(shí)間點(diǎn)的一致性,所以叫一致性讀。我們可以參考v$rollstat、v$transaction和x$bh 表,在x$bh 中的class字段,如果是回滾段塊,假設(shè)回滾段USN 為n,則回滾段頭class 為11+2n,回滾段塊為12+2n。回滾段的使用、擴(kuò)展、回縮同一個(gè)事務(wù)不能跨越回滾段;一個(gè)回滾段至少包含2個(gè)extent。每個(gè)回滾段有一個(gè)回滾段頭,回滾段頭是一個(gè)block,里面主要記錄了事務(wù)表信息。當(dāng)產(chǎn)生一個(gè)事務(wù)的時(shí)候,就在回滾段頭的事務(wù)表中記錄一條信息,該信息中包含了事務(wù)標(biāo)志、事務(wù)狀態(tài)、使用的回滾段塊數(shù)等等信息。使用時(shí)從第一個(gè)extent的第二個(gè)block到最后一個(gè)extent循環(huán)使用;如果其中的一個(gè)extent有未提交的事物,那么前面的extent不能跨越該extent,只能在2個(gè)extent之間擴(kuò)展新的extent,并修改相應(yīng)的節(jié)點(diǎn)指針(回滾段的extent 之間是通過指針連起來的一個(gè)單向循環(huán)的鏈表結(jié)構(gòu));系統(tǒng)回滾段與延遲回滾段SYSTEM 回滾段是創(chuàng)建在系統(tǒng)表空間中,主要是用于系統(tǒng)級(jí)的事務(wù)和分配普通事務(wù)于其他回滾段上。當(dāng)手工創(chuàng)建數(shù)據(jù)庫后需要?jiǎng)?chuàng)建普通回滾段之前必須首先創(chuàng)建系統(tǒng)回滾段。系統(tǒng)回滾段主要用于兩個(gè)方面。一是系統(tǒng)事務(wù),比如針對(duì)數(shù)據(jù)字典的操作的truncate table 和 drop table 。如果truncate table or drop table 的過程中沒有成功,則系統(tǒng)會(huì)根據(jù)系統(tǒng)回滾段中的數(shù)據(jù)字典操作信息對(duì)該DDL 操作進(jìn)行回退。另一個(gè)方面,就是延遲回滾段(Deferred Rollback Segment) 。表空間offline時(shí)用戶申請(qǐng)回滾,數(shù)據(jù)庫會(huì)將回滾信息寫入系統(tǒng)回滾段(就是延遲回滾段),等到online時(shí),在寫入表空間。回滾段的設(shè)置和管理init.ora: transactions_per_rollback_segment 和transactions,max_rollback_segments1:系統(tǒng)并發(fā)事務(wù)數(shù)有多少?(主要是產(chǎn)生恢復(fù)信息的會(huì)話數(shù)+一部分冗余數(shù)(20)=總回滾段數(shù))2:系統(tǒng)是否存在大查詢或者大是事務(wù)?頻繁么?3:能提供給系統(tǒng)的回滾段表空間的磁盤空間是多少?不要將回滾段的MAXEXTENTS設(shè)為UNLIMITED, 回滾段所在表空間也不要設(shè)為AUTOEXTEND方式, 否則將會(huì)使得由于某個(gè)不正常的事務(wù)導(dǎo)致整個(gè)數(shù)據(jù)庫處于失控狀態(tài)。9iundo_retention 表示在自動(dòng)管理模式下,回滾段中的數(shù)據(jù)在被覆蓋前保留多長(zhǎng)的時(shí)間,單位是秒。這個(gè)參數(shù)應(yīng)該決定于系統(tǒng)所中一些大查詢運(yùn)行的時(shí)間長(zhǎng)度,以避免ORA-01555 錯(cuò)誤。在9i 下創(chuàng)建非自動(dòng)管理的的回滾段而不使用UNDO 表空間,則設(shè)置undo_management為MANUAL,然后在系統(tǒng)表空間中創(chuàng)建一個(gè)回滾段(注意這是必須的),創(chuàng)建自己的回滾段表空間,這時(shí)可以在回滾段表空間中創(chuàng)建回滾段,創(chuàng)建完畢刪除系統(tǒng)表空間中的回滾段。著名的ORA-01555 問題一致讀獲取的時(shí)候發(fā)現(xiàn)回滾段已經(jīng)被覆蓋而出現(xiàn)找不著變化前映像,也就是當(dāng)COMMIT SCN 大于T 查詢嘗試去回滾段中找回?cái)?shù)據(jù)卻發(fā)現(xiàn)回滾段已經(jīng)被覆蓋了(因?yàn)榛貪L段是循環(huán)使用的),則會(huì)出現(xiàn)著名的ORA-01555 錯(cuò)誤。重做v$sysstat v$log v$logfile v$log_historyalter system switch logfile;重做記錄了塊的改變,包括回滾段頭塊、回滾段塊、數(shù)據(jù)塊,并且在塊改變之前先記錄重做信息。更改矢量(change vector)當(dāng)要改變數(shù)據(jù)庫的數(shù)據(jù)時(shí),這些改變的細(xì)節(jié)被記錄為更改矢量。通過這些記錄,數(shù)據(jù)庫處理過程可以被重現(xiàn)。簡(jiǎn)而言之,一個(gè)更改矢量就是記錄了一個(gè)數(shù)據(jù)塊的行槽從一個(gè)狀態(tài)改變到另一個(gè)狀態(tài)的過程。也就是redo的記錄單位是entry,即:file X,block Y,row slot Z。Redo也記錄了數(shù)據(jù)塊(table block & index block)前照,其實(shí)記錄的就是undo,因?yàn)榧词箾]有commit,改動(dòng)也會(huì)被記錄到redo 文件里,這時(shí)的table block & index block就是未提交的最新狀態(tài),如果此時(shí)系統(tǒng)崩潰,則需要redo中記錄的undo(前照)進(jìn)行恢復(fù),所以redo記錄了數(shù)據(jù)塊、索引塊、回滾塊 。ORACLE推薦logswitch時(shí)間最好在15-30分鐘之間。跟redologfile有關(guān)的其它數(shù)據(jù)庫參數(shù)1、log_buffer它最好不要大于512K或者128K*CPU個(gè)數(shù)。我們可以用下面的SQL語句檢測(cè)log_buffer使用情況:SELECT RBAR.NAME,RBAR.VALUE,RE.NAME,RE.VALUE,(RBAR.VALUE * 100) / RE.VALUE | % radio FROM V$SYSSTAT RBAR, V$SYSSTAT RE WHERE RBAR.NAME = redo buffer allocation retries AND RE.NAME = redo entries;這個(gè)比率小于1%才好,否則增加log_buffer的大小2、log_checkpoint_intervalOracle8.1版本后log_checkpoint_interval指的是兩次checkpoint之間操作系統(tǒng)數(shù)據(jù)塊的個(gè)數(shù)。checkpoint時(shí)Oracle把內(nèi)存里修改過的數(shù)據(jù)塊用DBWR寫到物理文件,用LGWR寫到日志和控制文件。從性能優(yōu)化來說log_checkpoint_interval=redo log file size bytes/512bytes3、log_checkpoint_timeoutOracle8.1版本后log_checkpoint_timeout指的是兩次checkpoint之間時(shí)間秒數(shù)。Oracle建議不用這個(gè)參數(shù)來控制,因?yàn)槭聞?wù)(transaction)大小不是按時(shí)間等量分布的。用log_checkpoint_interval參數(shù)控制會(huì)好一些。禁用此參數(shù)或者按默認(rèn)的900。alter system archive log current;第二個(gè)存檔日志目的地可以通過初始化參數(shù)LOG_ARCHEVE_DUPLEX_DEST設(shè)定。LOG_ARCHEVE_DEST和LOG_ARCHEVE_DUPLEX_DEST都可以存檔所有的聯(lián)機(jī)重作日志文件。另一個(gè)初始化參數(shù)LOG_ARCHIVE_MIN_SUCCEED_DEST如果設(shè)置了的話,可以決定一個(gè)重作日志組必須被成功存檔到的存檔日志目的地?cái)?shù),在一個(gè)目的地滿或其介質(zhì)有錯(cuò)時(shí),該參數(shù)可以防止Oracle被凍結(jié)。要確保這兩個(gè)目的地被配置在兩個(gè)分離的磁盤/控制器上,避免I/O沖突對(duì)數(shù)據(jù)庫性能的影響。一些參數(shù)v$parameter查看系統(tǒng)當(dāng)前使用的所有參數(shù)SET pagesize 9000 SET head OFF SET term OFF SELECT DECODE(isdefault, TRUE, # ) | DECODE(isdefault, TRUE, RPAD(name,43), RPAD(name,45) | = | value FROM v$parameter ORDER BY name;查看所有參數(shù)是否已被init.ora重新設(shè)定SELECT name, isspecified FROM v$obsolete_parameter ;查看過時(shí)參數(shù)和強(qiáng)調(diào)參數(shù)SELECT kspponm,DECODE(ksppoflg, 1,Obsolete, 2, Underscored)FROM x$ksppo ORDER BY kspponm; 查看當(dāng)前系統(tǒng)中的所有隱藏參數(shù)(以sys身份登錄)SELECT ksppinm, ksppstvl, ksppdesc FROM x$ksppi x, x$ksppcv y WHERE x.inst_id = userenv(Instance) and y.inst_id = userenv(Instance) and x.indx = y.indx and x.ksppinm like %_&par% order by translate(x.ksppinm, _, );用戶參數(shù)select * from v$fixed_table where name like %NLS%;SELECT * FROM V$NLS_PARAMETERS;ALTER SESSION SET NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS;最常被修改的參數(shù):Shared_pool_size分配給共享池的內(nèi)存字節(jié)數(shù)隨著用戶的需求,可以按時(shí)增加此值Rollback_segments數(shù)據(jù)庫啟動(dòng)時(shí)獲取的一個(gè)或多個(gè)當(dāng)事務(wù)處理量增加或減少時(shí),可以從該回滾段名列表中增加或刪除回滾段名Processes可同時(shí)訪問數(shù)據(jù)庫的最大進(jìn)程數(shù)量session=1.1*process+5,一般而言,session和process是一一對(duì)應(yīng)的,5是Oracle后臺(tái)進(jìn)程的session,10%是提供給recursive session使用的。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針對(duì)每個(gè)session,排序首先會(huì)使用sort_area_size ,如果不足則會(huì)使用臨時(shí)表空間。實(shí)際上就是外排序過程,把要排序的對(duì)象分割為內(nèi)存可以容納的小段(sort run),然后每個(gè)sort run都放到sort area里面去排序,排序結(jié)果作為中間信息放在臨時(shí)表空間的臨時(shí)段內(nèi),由于分段排序的結(jié)果當(dāng)然不會(huì)是最終要求的排序結(jié)果,所以還要經(jīng)過一個(gè)merge的過程,才會(huì)得到最終排序結(jié)果,原理大概是比較每個(gè)sort run的第一名,取出領(lǐng)先者,然后該sort run的第二名頂上,繼續(xù)上述過程直到取完。所以建議:sort_area_size 所能容納記錄數(shù)至少大于排序記錄數(shù)的 平方根5. open_cursor見SGA介紹中的相關(guān)內(nèi)容6. database_writers許多DBA有個(gè)錯(cuò)誤的概念,認(rèn)為此參數(shù)受CPU數(shù)量的限制,實(shí)際并非如此。提示: 如果工作在一個(gè)可以支持多進(jìn)程的操作系統(tǒng)上,需做的第一件事就是改變這個(gè)參數(shù)的值。重新啟動(dòng)數(shù)據(jù)庫,使用startup命令,Oralce將會(huì)按照以下順序在缺省目錄中搜索參數(shù)文件:spfile$ORACLE_SID.ora 缺省目錄 UNIX: $ORACLE_HOME/dbs/ NT: $ORACLE_HOMEdatabasespfile.ora缺省目錄 UNIX: $ORACLE_HOME/dbs/ NT: $ORACLE_HOMEdatabaseinit$ORACLESID.ora 缺省目錄UNIX: $ORACLE_HOME/dbs/ NT: $ORACLE_HOMEdatabase or $ORACLE_HOMEadmindb_namepfile創(chuàng)建了spfile,重新啟動(dòng)數(shù)據(jù)庫,Oracle會(huì)按順序搜索以上目錄,spfile就會(huì)自動(dòng)生效。startup pfile=E:Oracleadmineyglenpfileinit.ora;create spfile from pfile;然后我們可以使用ALTER SYSTEM方式將修改固定到SPFILE.ALTER SYSTEM SET log_archive_start=FALSE SCOPE=spfile;空間管理主體思想一直圍繞著內(nèi)部段的擴(kuò)展。不僅僅影響到空間大小,自由塊太分散的話會(huì)影響性能(I/O,及擴(kuò)展時(shí)間等)空閑表(主空閑表、進(jìn)程空閑表、事務(wù)空閑表),可能存在于表頭塊中表空間drop tablespace * including contents;注:LMT是segment中extent的管理,ASSM是the free space of segment的管理。在Oracle8I的版本中,Oracle推出了一種全新的表空間管理方式:本地化管理的表空間。所謂本地化管理,就是指Oracle不再利用數(shù)據(jù)字典表來記錄Oracle表空間里面的extent的使用狀況,而是在每個(gè)表空間的數(shù)據(jù)文件的頭部加入了一個(gè)位圖區(qū),在其中記

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論