




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 HYPERLINK /Database/ShowArticle.asp?SID=42&ID=1221 ORACLE的工作機制體系結(jié)構(gòu)實例Oracle 運行的時候,在內(nèi)存中會要開發(fā)一個區(qū)間,那個區(qū)間要緊是用于從磁盤(數(shù)據(jù)文件)中讀出數(shù)據(jù)后的一個在內(nèi)存的緩存和處理。而處理這些數(shù)據(jù)的操作,需要有一些系統(tǒng)的后臺進程,這些進行在Oracle數(shù)據(jù)庫啟動的時候,就開始運行,一直在響應前臺的操作。實際上,這一個區(qū)間(SGA)和這些后臺進程合在一起,就稱為 實例。實例是包括SGA區(qū)和后臺進程兩個部分的。 數(shù)據(jù)庫啟動執(zhí)行若干動作,經(jīng)歷三個時期,分不是未加載、加載和打開。1、未加載(nomount) 能夠把數(shù)據(jù)庫
2、啟動的這一時期看作是Oracle實例的啟動。這種方式啟動下可執(zhí)行:重建操縱文件、重建數(shù)據(jù)庫。這一啟動命令: 讀取數(shù)據(jù)庫參數(shù)文件。 啟動所需的后臺進程并按參數(shù)文件中的定義分配內(nèi)存。 將進展情況寫入告警日志文件中。2、加載(mount) 在實例啟動加載時期,數(shù)據(jù)庫參數(shù)文件中指定的操縱文件被讀取。記住操縱文件將數(shù)據(jù)庫各部分聯(lián)系在一起。實例從操縱文件中找到下列信息,然后將進展寫入告警日志文件。這種方式啟動下可執(zhí)行:數(shù)據(jù)庫日志歸檔、數(shù)據(jù)庫恢復、重新命名一些數(shù)據(jù)庫文件: 所有數(shù)據(jù)文件和重做日志文件的名稱和位置。 數(shù)據(jù)庫名。 最新系統(tǒng)更改號(S C N)。3、打開(open) 包含在數(shù)據(jù)庫中的每個聯(lián)機數(shù)據(jù)文
3、件在數(shù)據(jù)庫打開前必須被同步。在數(shù)據(jù)庫打開時期: 所有聯(lián)機數(shù)據(jù)文件的頭與操縱文件信息相比較。 所有文件同步后,數(shù)據(jù)庫打開。當數(shù)據(jù)庫關(guān)閉時,取決于它的關(guān)閉方式執(zhí)行不同的任務:正常(normal)在所有的用戶離線后發(fā)生的正常關(guān)閉。事務(transactional)事務關(guān)閉確實是當所有的用戶執(zhí)行完當前的事務后,將用戶從數(shù)據(jù)庫上清除。立即(immediate)立即關(guān)閉確實是從數(shù)據(jù)庫清除所有當前用戶之后,回退所有未完成的操作。異常(abort)異常關(guān)閉沒有給數(shù)據(jù)庫任何整理的機會。這種方式關(guān)閉后需要實行崩潰恢復。實例是數(shù)據(jù)治理的核心它做所有的工作,而數(shù)據(jù)庫存儲所有的數(shù)據(jù)。其他啟動方式:startup res
4、trict 約束方式啟動這種方式能夠啟動數(shù)據(jù)庫,但只同意具有一定特權(quán)的用戶訪問 非特權(quán)用戶訪問時,會出現(xiàn)以下提示: ERROR: ORA-01035: ORACLE 只同意具有 RESTRICTED SESSION 權(quán)限的用戶使用 startup force 強制啟動方式 當不能關(guān)閉數(shù)據(jù)庫時,能夠用startup force來完成數(shù)據(jù)庫的關(guān)閉 先關(guān)閉數(shù)據(jù)庫,再執(zhí)行正常啟動數(shù)據(jù)庫命令 startup pfile=參數(shù)文件名 帶初始化參數(shù)文件的啟動方式 先讀取參數(shù)文件,再按參數(shù)文件中的設(shè)置啟動數(shù)據(jù)庫 startup EXCLUSIVE*一個Delete操作的流程:檢查語法、語義(V$ROWCACH
5、E :data dictionary cache),計算HASH VALUE,在session的UGA中進行匹配(session_cached_cursors),假如UGA中沒有,在library chache 中匹配(library chache lock latch 愛護 library chache lock 對地址堆的訪問,而后 library chache pin latch 愛護 library cache pin 對library cache中sql相關(guān)信息的訪問)依照執(zhí)行打算讀取數(shù)據(jù):cache buffer chain latch 愛護能定位到buffer header 并
6、pin 住該塊(假如沒有buffer header,就 pin 住某個空塊(沒有空塊就產(chǎn)生 free buffer waits),并到數(shù)據(jù)文件中讀?。?。假如現(xiàn)在有某個進程想訪問該塊,將產(chǎn)生 buffer busy waits 。在redo log buffer中記錄delete操作的細節(jié)。(包括回滾段前后鏡像、數(shù)據(jù)塊前后鏡像)。在相應回滾段段頭的事務表中創(chuàng)建一個undo條目,把將要刪除的記錄創(chuàng)建前鏡像,存放到Undo Block中。在Buffer Cache中的相應數(shù)據(jù)塊上刪除記錄,同時標記相應的數(shù)據(jù)塊為Dirty。提交(COMMIT)1.Oracle產(chǎn)生一個SCN2.在回滾段事務表中標記該事
7、務狀態(tài)為commited3.LGWR Flush Log Buffer到日志文件3.假如現(xiàn)在數(shù)據(jù)塊仍然在Buffer Cache中,那么SCN將被記錄到Block Header上,這被稱為快速提交(fast commit)4.假如dirty block差不多被寫回到磁盤,那么下一個訪問那個block的進程將會自回滾段中獵取該事務的狀態(tài),確認該事務被提交。然后那個進程獲得提交SCN并寫回到Block Header上。這被稱為延遲塊清除(delayed block cleanout)。內(nèi)存SGA(系統(tǒng)全局區(qū)、共享全局區(qū))、PGA(進程全局區(qū)、私有全局區(qū))內(nèi)存分配原則:10%冗余內(nèi)存,OS SYS進
8、程(約1.6G),OS BUFFER(約0.8G),數(shù)據(jù)庫連接消耗內(nèi)存(每個連接約58M),PGA(每個連接約2M,V$PGA_TARGET_ADVICE),SGASGAv$sgastat 注意 show parameter sga_max_sizeOracle的內(nèi)存:軟件代碼區(qū)系統(tǒng)全局區(qū)進程全局區(qū):包含單個進程的數(shù)據(jù)和操縱信息排序區(qū)System Global AreaFixed SizeVariable SizeDatabase BuffersRedo buffersLarge poolShared PoolLibrary cacheData dictionary cacheUser Glo
9、bal 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ù)千個原子變量,以及如指向SGA中其它區(qū)域的pointers(指針)等小的數(shù)據(jù)結(jié)構(gòu).通過對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
10、 buffer headers, processes, sessions, transaction arrays, the enqueue resources , locks, the online rollback segment arrays, various arrays for recording statistics.其中大部分的SIZE是依靠初始參數(shù)的設(shè)置來確定的.這些初始參數(shù)只能在實例被關(guān)閉的狀態(tài)下才能夠進行修改.因此那個地點講的永久性是針對實例打開狀態(tài)下的生存期而言.The variable area的在SGA中的SIZES就等于LARGE_POOL_SIZE,SHARED_P
11、OOL_SIZE和永久性的內(nèi)存arrays的SIZE三者相加.永久性內(nèi)存arrays的SIZE=the variable area - (LARGE_POOL_SIZE+SHARED_POOL_SIZE).數(shù)據(jù)緩沖區(qū)命中率v$sysstat那個地點命中率的計算應該是令 x = physical reads direct + physical reads direct (lob)命中率 =100 - ( physical reads - x) / (consistent gets + db block gets - x)*100通常假如發(fā)覺命中率低于90%,則應該調(diào)整應用可能夠考慮是否增大數(shù)據(jù)緩
12、沖區(qū)共享池的命中率SQL select sum(pinhits-reloads)/sum(pins)*100 hit radio from v$librarycache;hit radio99.809291假如共享池的命中率低于95%,就要考慮調(diào)整應用(通常是沒使用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ā)覺sorts (disk)/ (so
13、rts (memory)+ sorts (disk)的比例過高,則通常意味著sort_area_size 部分內(nèi)存較小,可考慮調(diào)整相應的參數(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%我
14、們就能夠考慮增大log_buffer HYPERLINK /archives/2005/11/oracle_howto_make_sga_17g.html 如何在Linux上擴展SGA超過1.7G共享池(SHARED_POOL_SIZE)v$shared_pool_adviceALTER SYSTEM FLUSH SHARED_POOLHow to Keep Objects - 重點使用DBMS_SHARED_POOL.KEEP過程來keep objects, UNKEEP過程從shared pool中移走pinned objectsexecute dbms_shared_pool.keep(
15、address,hash_value); - keep 該匿名塊共享池包括庫高速緩存( library cache)、數(shù)據(jù)字典高速緩存和服務器操縱結(jié)構(gòu)(例如數(shù)據(jù)庫字符集)。Oracle服務器用庫高速緩存來提高執(zhí)行SQL語句的性能;庫高速緩存包括共享和專用SQL區(qū)。共享SQL區(qū)包括SQL語句語法分析樹和執(zhí)行路徑,而專用SQL區(qū)存儲特定的會話信息,例如捆綁變量、環(huán)境和會話參數(shù)、運行堆棧和緩沖區(qū)等。Soft parse使用的資源包括CPU 和library cache latch getsHard parse是指要解析的SQL沒有在library cache中,或者執(zhí)行的時候發(fā)覺解析過的SQL差不多
16、aged out,確實是離開了library cache,稱為Library cache misses使用的資源包括額外的CPU, library cache latch gets, 以及shared pool latch gets.專用SQL區(qū)在每個事務初始化時創(chuàng)建,在與專用SQL區(qū)相關(guān)的游標關(guān)閉時被釋放。一個用戶會話能夠一次打開的專用SQL區(qū)的數(shù)量由init.ora參數(shù)OPEN_CURSORS決定。使用這兩個結(jié)構(gòu),Oracle服務器能夠重用一條SQL語句的所有執(zhí)行的共同信息。與此同時,能夠從專用SQL區(qū)中查詢執(zhí)行的特定會話信息。注意游標使用過程中并不關(guān)閉游標的應用會接著為應用分配越來越多的
17、內(nèi)存,部分緣故是為每個打開的游標分配了專用SQL區(qū)。庫高速緩存中的專用SQL區(qū)可更進一步分為永久區(qū)和運行區(qū)。共享池的大小取決于init.ora文件參數(shù)SHARED_POOL_SIZE,它是以字節(jié)為單位的。你必須將那個值設(shè)得足夠大,以確保有足夠的可用空間來裝載和存儲PL/SQL塊和SQL語句。共享區(qū)通過長期裝卸和卸載數(shù)據(jù)對象會產(chǎn)生許多碎片,假如在共享池中沒有足夠的連續(xù)空間用來裝載目標數(shù)據(jù),會產(chǎn)生錯誤。解決那個問題的捷徑是運行SQL命令ALTER SYSTEM FLUSH SHARED_POOL。然而假如在數(shù)據(jù)庫操作時,經(jīng)常遇到共享池錯誤,你必須增大共享池Library cache包含 share
18、d 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. 初始時將SHARED_POOL_SIZE設(shè)得專門大,運行應用程序2. 計算stored object所占的內(nèi)存SELECT SUM(sharable_mem) FROM v$db_object_cacheWHERE type = PACKAGE or
19、 type = PACKAGE BODY or type = FUNCTION or type = PROCEDURE;3. 應用程序運行一段時刻后,可能常用sql語句所占的內(nèi)存(不包括動態(tài)SQL)SELECT SUM(sharable_mem)FROM v$sqlareaWHERE executions 5;4. 對每個user每個打開的cursor,需要250bytes,可在運行高峰期間使用查詢:SELECT SUM(250 * users_opening) FROM v$sqlarea;5. 在測試環(huán)境中,可讓一個用戶打開一定數(shù)量的cursor,運行下列語句測試共享內(nèi)存,然后乘上user
20、數(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)存的和,再加上一點內(nèi)存(留給動態(tài)SQL使用),作為你的應用的理想內(nèi)存設(shè)置;預留一部分空間作為大的內(nèi)存需要,幸免miss和碎片;一些大的內(nèi)存需要: PL/SQL塊的編譯,trigger的編譯;小的object可不能使預留空間碎片化,反而保證reserved list有大的連續(xù)塊,一旦從reserved list中分
21、配的內(nèi)存釋放它就返回reserved list。阻礙的參數(shù):SHARED_POOL_RESERVED_SIZE初始值=SHARED_POOL_SIZE*10%, 超過50%,oracle server報錯OPEN_CURSORS 缺省=50定義了涉及分配給用戶進程的私有SQL區(qū)域的cursors數(shù)量, 一個private SQL area一直存在直至cursor關(guān)閉;為了利用更多的內(nèi)存給共享SQL區(qū)域,需要提高session每個session同意多cursor數(shù)量,開發(fā)人員應關(guān)閉不需要的cursor節(jié)約內(nèi)存CURSOR_SPACE_FOR_TIME 缺省=FALSE 布爾值設(shè)置TRUE,表示以
22、空間換取時刻,共享SQL區(qū)可不能被aged out直至相關(guān)的cursor被關(guān)閉,因此確信有足夠的內(nèi)存,沒有cache miss;除非RELOADS in V$LIBRARYCACHE一直為0,否則不要改變此參數(shù)值若應用為FORM或使用動態(tài)SQL,設(shè)此值為FALSE - 因為動態(tài)sql總是不一致,將占用過多內(nèi)存SESSION_CACHED_CURSORS 缺省=0 表示沒有cache當一個session打算關(guān)閉一個cursor時,假如那個cursor的parse count超過3次,那么那個cursor將會被加到session cursor cache list的MRU端.當一個session打
23、算parse一個sql時,它會先去session的pga內(nèi)搜索session cursor cache list,假如找到那么會把那個cursor脫離list,然后當關(guān)閉的時候再把那個cursor加到MRU端. session_cached_cursor提供了快速軟分析的功能,提供了比soft parse更高的性能. 檢查系統(tǒng)是否需要此參數(shù)的方法:對某個典型用戶sessionselect a.sid,a.value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and (=session cursor cache h
24、its 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
25、ManagerMemoryData Dictionary Cache Hit%檢索需要在共享池中要求大于100K連續(xù)空間的對象:select * from v$db_object_cache where sharable_mem 100000 and type in (PACKAGE, PACKAGE BODY, PROCEDURE, FUNCTION);考察返回的結(jié)果,確認是否需要pin到共享池中,返回結(jié)果中的KEPT字段假如是YES,那么表示該對象差不多固定在了共享池中,為NO,則表示還沒有固定。假如需要固定,使用下面的語句:exec dbms_shared_pool.keep(SYS.S
26、TANDARD); 數(shù)據(jù)庫默認安裝的時候沒有創(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)放在一個Cache buffer chain 中,Cache buffer chain由多個雙向
27、hash 鏈表組成,hash鏈表數(shù)量由_db_block_hash_buckets決定.每個數(shù)據(jù)塊頭由DBA(data block address)作為key,經(jīng)hash函數(shù)后放在鏈表上,它和block buffer中的block一一對應,數(shù)據(jù)塊頭不包括實際的數(shù)據(jù),僅是一個簡單的描述. 后臺進程掃描hash鏈表前,必須獲得cache buffer chain latch,假如在Cache Buffer chain中找不某塊,就由磁盤讀入. 若需要查找某個 block,則依照 block的信息能計算 hash value 然后迅速定位到 hash table ,然后依照hash table 信息
28、去查看是否存在所想要的 buffer ,若有則命中,若沒有則不命中。顯然不可能依照list去逐個搜索,如此效率太低.LRU 確實是一種盡可能將常用的數(shù)據(jù)保留在內(nèi)存的算法.當數(shù)據(jù)庫需要一個數(shù)據(jù)緩沖區(qū), 他會從數(shù)據(jù)庫緩沖區(qū)的LRU 隊列的尾部找一個空閑的緩沖, 將一個數(shù)據(jù)塊讀入, 然后數(shù)據(jù)庫會把那個緩沖區(qū)放到LRU 隊列的中部, 假如該緩沖被其他程序用到的話, 那么他會往隊列的頭上移動, 假如那個緩沖沒有被其他程序用到,同時沒有被修改過, 那么他會慢慢的移動到LRU 隊列的尾部, 最終被認為是空緩沖區(qū)被其他數(shù)據(jù)塊所覆蓋.一旦那個緩沖區(qū)被修改過DBWR 把他從LRU 隊列中移出, 放到LRUW 隊列
29、 (也叫贓緩沖區(qū)) 中, 等待DBWR 把他們批量寫入數(shù)據(jù)文件, 然后再把他們的緩沖區(qū)連接到LRU 隊列的尾部.周而復始的工作.假如查找在一個閥值內(nèi)沒有結(jié)果或者造成dirty緩沖區(qū)差不多溢出,在進一步查找free buffer前系統(tǒng)將發(fā)出一個消息給DBWR讓他能夠?qū)RUW隊列的緩沖區(qū)寫入磁盤. 那個閥值被叫做那個閥值被叫做DBWR scan depthdirty緩沖區(qū)大小能夠用 _DB_LARGE_DIRTY_QUEUE和 2*_DB_BLOCK_WRITE_BATCH 來確定. 前臺進程接著搜索free buffer.直到 _DB_BLOCK_MAX_SCAN_CNT還沒有發(fā)覺系統(tǒng)就會掛起
30、該進程.記錄dirty buffers inspected的靜態(tài)變量并把該進程標志為free buffer wait.cache 和 buffer_pool_keep是不一樣的,cache 是假如對該表全表掃描的話,會把塊放在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
31、)命令了。然而在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ù)應該比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.sq
32、l;exec dbms_shared_pool.keep(procedure_name,P);重做日志緩沖區(qū)(LOG_BUFFER)log buffer分成內(nèi)部的buffer blocks,而這些block各有8個字節(jié)的頭部信息存在于variable area中.當重做日志緩沖區(qū)填滿時,將它的內(nèi)容寫入聯(lián)機重做日志文件。是循環(huán)使用。是數(shù)據(jù)庫最活躍的情形,能夠用V$SYSSTAT視圖進行監(jiān)控。查詢V$SYSSTAT視圖value域,它表明用戶進程等待重做日志緩沖區(qū)所花費的時刻(此處value的值應接近于0,否則應增大初始化參數(shù)文件的Log_buffers的值):SELECT NAME, VALUE
33、 FROM V$SYSSTAT WHERE NAME = redo log space requests;PGAv$pgastat v$pga_target_advice后臺進程v$bgprocess數(shù)據(jù)庫寫進程(DBWR)(DB_BLOCK_WRITE_BATCH,DB_BLOCK_MAX_SCAN,DB_WRITES,DB_BLOCK_LRU_LATCHES,DB_BLOCK_CHECKPOINT_BATCH,DB_BLOCK_CHECKSUM)負責數(shù)據(jù)文件的讀寫和db_data_buffer的清理dbwr負責搜集dirty buffer,slaves負責寫磁盤工作的前提條件:1. dir
34、ty buffer超出了dirty buffer list的threshold.2. server process在buffer cache中查找free buffer時,則也可能會通知DBWn將dirty buffer寫入datafile.3. DBWn每3秒會檢查是否有dirty數(shù)據(jù)要寫入datafile.4.CKPT5.tablespace offline或tablespace begin backup(那個地點實際上是由CKPT引起).6.drop object7. shutdown (那個地點實際上也是由CKPT引起)建議你使用與存儲數(shù)據(jù)文件的物理磁盤一樣多的DBWR進程;DBWR寫
35、入數(shù)據(jù)文件的任何修改差不多被記錄在重做日志文件中.一次checkpoint的成功過程是:dbwr搜集dirty buffer,交給slave寫磁盤,寫完畢通知dbwr,然后dbwr才返回檢查點完成。增加寫進程,同時要調(diào)整db_block_lru_latches參數(shù),如修改或添加如下兩個參數(shù): db_writer_processes=4 db_block_lru_latches=8日志寫進程(LGWR)。LOG_CHECKPOINT_INTERVAL,LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINTS_TO_ALERTLGWR工作的要緊條件如下1.用戶提交2.有1/3重
36、做日志緩沖區(qū)未被寫入磁盤3.有大于1M重做日志緩沖區(qū)未被寫入磁盤4.超時5.DBWR需要寫入的數(shù)據(jù)的SCN號大于LGWR記錄的SCN號,DBWR觸發(fā)LGWR寫入歸檔進程(ARCH)。ARCHIVE_LOG_START檢查點(CKPT)。同步數(shù)據(jù)文件,日志文件和操縱文件CKPT會更新數(shù)據(jù)文件/操縱文件的頭信息.CKPT工作的要緊條件如下1.在日志切換的時候2.數(shù)據(jù)庫用immediate,transaction,normal選項shutdown數(shù)據(jù)庫的時候3.依照初始話文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT,FAST_START_IO_TA
37、RGET的設(shè)置的數(shù)值來確定4.用戶觸發(fā)系統(tǒng)監(jiān)控和進程監(jiān)控進程(SMON和PMON)。調(diào)度進程(Dnnn)。MTS_DISPATCHERS恢復進程(RECO)。DISTRIBUTED_TRANSACTIONS快照進程(SNPn)。OB_QUEUE_PROCESS,JOB_QUEUE_INTERVAL鎖進程(LCKn)。并行查詢進程(Pnnn)。PARALLEL_MIN_SERVERS,PARALLEL_MAX_SERVERS用戶和服務器進程(Snnn)。回滾v$rollstat v$waitstat v$sysstat x$bh dba_rollback_segs一下事務的流程:1.分配一個回滾
38、段2.在回滾段事務表中分配一個事務槽3.分配undo block4.更新數(shù)據(jù)塊上的ITL事務槽5.把前鏡像記錄在undo block內(nèi)6.更改數(shù)據(jù)塊的內(nèi)容ITL事務槽-Interested Transaction List(ITL)ITL內(nèi)容包括:xidTransaction IDUbaUndo Block AddressLckLock Statusxid=Undo.Segment.Number+Transaction.Table.Slot.Number+Wrapuba=Address.Of.Last.Undo.Block.Used+Sequence+Last.Entry.in.UNDO.Re
39、cord.MapALTER SYSTEM SET UNDO_MANAGEMENT=MANUAL SCOPE=SPFILE;SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;當一個事務開始的時候,會首先把變化前的數(shù)據(jù)和變化后的數(shù)據(jù)先寫入日志緩沖區(qū),然后把變化前的數(shù)據(jù)寫入回滾段,最后才在數(shù)據(jù)緩沖區(qū)中修改數(shù)據(jù)一致性讀取consistent reads假設(shè)查詢開始的時候的SCN 為T,則在查詢所掃描的數(shù)據(jù)塊中,假如數(shù)據(jù)的COMMIT SCN 小于T,則查詢同意該數(shù)據(jù),假如COMMIT SCN 大于T 或者講還沒有產(chǎn)生COMMIT SCN,則查詢會嘗試去回滾段
40、中查找數(shù)據(jù)。這是為了保證數(shù)據(jù)的讀取的時刻點的一致性,因此叫一致性讀。我們能夠參考v$rollstat、v$transaction和x$bh 表,在x$bh 中的class字段,假如是回滾段塊,假設(shè)回滾段USN 為n,則回滾段頭class 為11+2n,回滾段塊為12+2n?;貪L段的使用、擴展、回縮同一個事務不能跨越回滾段;一個回滾段至少包含2個extent。每個回滾段有一個回滾段頭,回滾段頭是一個block,里面要緊記錄了事務表信息。當產(chǎn)生一個事務的時候,就在回滾段頭的事務表中記錄一條信息,該信息中包含了事務標志、事務狀態(tài)、使用的回滾段塊數(shù)等等信息。使用時從第一個extent的第二個block
41、到最后一個extent循環(huán)使用;假如其中的一個extent有未提交的事物,那么前面的extent不能跨越該extent,只能在2個extent之間擴展新的extent,并修改相應的節(jié)點指針(回滾段的extent 之間是通過指針連起來的一個單向循環(huán)的鏈表結(jié)構(gòu));系統(tǒng)回滾段與延遲回滾段SYSTEM 回滾段是創(chuàng)建在系統(tǒng)表空間中,要緊是用于系統(tǒng)級的事務和分配一般事務于其他回滾段上。當手工創(chuàng)建數(shù)據(jù)庫后需要創(chuàng)建一般回滾段之前必須首先創(chuàng)建系統(tǒng)回滾段。系統(tǒng)回滾段要緊用于兩個方面。一是系統(tǒng)事務,比如針對數(shù)據(jù)字典的操作的truncate table 和 drop table 。假如truncate table o
42、r drop table 的過程中沒有成功,則系統(tǒng)會依照系統(tǒng)回滾段中的數(shù)據(jù)字典操作信息對該DDL 操作進行回退。另一個方面,確實是延遲回滾段(Deferred Rollback Segment) 。表空間offline時用戶申請回滾,數(shù)據(jù)庫會將回滾信息寫入系統(tǒng)回滾段(確實是延遲回滾段),等到online時,在寫入表空間?;貪L段的設(shè)置和治理init.ora: transactions_per_rollback_segment 和transactions,max_rollback_segments1:系統(tǒng)并發(fā)事務數(shù)有多少?(要緊是產(chǎn)生恢復信息的會話數(shù)+一部分冗余數(shù)(20)=總回滾段數(shù))2:系統(tǒng)是否
43、存在大查詢或者大是事務?頻繁么?3:能提供給系統(tǒng)的回滾段表空間的磁盤空間是多少?不要將回滾段的MAXEXTENTS設(shè)為UNLIMITED, 回滾段所在表空間也不要設(shè)為AUTOEXTEND方式, 否則將會使得由于某個不正常的事務導致整個數(shù)據(jù)庫處于失控狀態(tài)。9iundo_retention 表示在自動治理模式下,回滾段中的數(shù)據(jù)在被覆蓋前保留多長的時刻,單位是秒。那個參數(shù)應該決定于系統(tǒng)所中一些大查詢運行的時刻長度,以幸免ORA-01555 錯誤。在9i 下創(chuàng)建非自動治理的的回滾段而不使用UNDO 表空間,則設(shè)置undo_management為MANUAL,然后在系統(tǒng)表空間中創(chuàng)建一個回滾段(注意這是必
44、須的),創(chuàng)建自己的回滾段表空間,這時能夠在回滾段表空間中創(chuàng)建回滾段,創(chuàng)建完畢刪除系統(tǒng)表空間中的回滾段。聞名的ORA-01555 問題一致讀獵取的時候發(fā)覺回滾段差不多被覆蓋而出現(xiàn)找不著變化前映像,也確實是當COMMIT SCN 大于T 查詢嘗試去回滾段中找回數(shù)據(jù)卻發(fā)覺回滾段差不多被覆蓋了(因為回滾段是循環(huán)使用的),則會出現(xiàn)聞名的ORA-01555 錯誤。重做v$sysstat v$log v$logfile v$log_historyalter system switch logfile;重做記錄了塊的改變,包括回滾段頭塊、回滾段塊、數(shù)據(jù)塊,同時在塊改變之前先記錄重做信息。更改矢量(change
45、 vector)當要改變數(shù)據(jù)庫的數(shù)據(jù)時,這些改變的細節(jié)被記錄為更改矢量。通過這些記錄,數(shù)據(jù)庫處理過程能夠被重現(xiàn)。簡而言之,一個更改矢量確實是記錄了一個數(shù)據(jù)塊的行槽從一個狀態(tài)改變到另一個狀態(tài)的過程。也確實是redo的記錄單位是entry,即:file X,block Y,row slot Z。Redo也記錄了數(shù)據(jù)塊(table block & index block)前照,事實上記錄的確實是undo,因為即使沒有commit,改動也會被記錄到redo 文件里,這時的table block & index block確實是未提交的最新狀態(tài),假如現(xiàn)在系統(tǒng)崩潰,則需要redo中記錄的undo(前照)進
46、行恢復,因此redo記錄了數(shù)據(jù)塊、索引塊、回滾塊 。ORACLE推舉logswitch時刻最好在15-30分鐘之間。跟redologfile有關(guān)的其它數(shù)據(jù)庫參數(shù)1、log_buffer它最好不要大于512K或者128K*CPU個數(shù)。我們能夠用下面的SQL語句檢測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 alloc
47、ation retries AND RE.NAME = redo entries;那個比率小于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=redo log file size bytes/512bytes3、log_checkpoint_timeout
48、Oracle8.1版本后log_checkpoint_timeout指的是兩次checkpoint之間時刻秒數(shù)。Oracle建議不用那個參數(shù)來操縱,因為事務(transaction)大小不是按時刻等量分布的。用log_checkpoint_interval參數(shù)操縱會好一些。禁用此參數(shù)或者按默認的900。alter system archive log current;第二個存檔日志目的地能夠通過初始化參數(shù)LOG_ARCHEVE_DUPLEX_DEST設(shè)定。LOG_ARCHEVE_DEST和LOG_ARCHEVE_DUPLEX_DEST都能夠存檔所有的聯(lián)機重作日志文件。另一個初始化參數(shù)LOG_A
49、RCHIVE_MIN_SUCCEED_DEST假如設(shè)置了的話,能夠決定一個重作日志組必須被成功存檔到的存檔日志目的地數(shù),在一個目的地滿或其介質(zhì)有錯時,該參數(shù)能夠防止Oracle被凍結(jié)。要確保這兩個目的地被配置在兩個分離的磁盤/操縱器上,幸免I/O沖突對數(shù)據(jù)庫性能的阻礙。一些參數(shù)v$parameter查看系統(tǒng)當前使用的所有參數(shù)SET pagesize 9000 SET head OFF SET term OFF SELECT DECODE(isdefault, TRUE, # ) | DECODE(isdefault, TRUE, RPAD(name,43), RPAD(name,45) | =
50、 | value FROM v$parameter ORDER BY name;查看所有參數(shù)是否已被init.ora重新設(shè)定SELECT name, isspecified FROM v$obsolete_parameter ;查看過時參數(shù)和強調(diào)參數(shù)SELECT kspponm,DECODE(ksppoflg, 1,Obsolete, 2, Underscored)FROM x$ksppo ORDER BY kspponm; 查看當前系統(tǒng)中的所有隱藏參數(shù)(以sys身份登錄)SELECT ksppinm, ksppstvl, ksppdesc FROM x$ksppi x, x$ksppcv y
51、 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;最常被修改的
52、參數(shù):Shared_pool_size分配給共享池的內(nèi)存字節(jié)數(shù)隨著用戶的需求,能夠按時增加此值Rollback_segments數(shù)據(jù)庫啟動時獵取的一個或多個當事務處理量增加或減少時,能夠從該回滾段名列表中增加或刪除回滾段名Processes可同時訪問數(shù)據(jù)庫的最大進程數(shù)量session=1.1*process+5,一般而言,session和process是一一對應的,5是Oracle后臺進程的session,10%是提供給recursive session使用的。db_block_buffers見 HYPERLINK l _SGA SGA介紹中的相關(guān)內(nèi)容shared_pool_size見 HYP
53、ERLINK l _SGA SGA介紹中的相關(guān)內(nèi)容log_buffer見 HYPERLINK l _SGA SGA介紹中的相關(guān)內(nèi)容sort_area_size針對每個session,排序首先會使用sort_area_size ,假如不足則會使用臨時表空間。實際上確實是外排序過程,把要排序的對象分割為內(nèi)存能夠容納的小段(sort run),然后每個sort run都放到sort area里面去排序,排序結(jié)果作為中間信息放在臨時表空間的臨時段內(nèi),由于分段排序的結(jié)果因此可不能是最終要求的排序結(jié)果,因此還要通過一個merge的過程,才會得到最終排序結(jié)果,原理大概是比較每個sort run的第一名,取出
54、領(lǐng)先者,然后該sort run的第二名頂上,接著上述過程直到取完。因此建議:sort_area_size 所能容納記錄數(shù)至少大于排序記錄數(shù)的 平方根5. open_cursor見 HYPERLINK l _SGA 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: $ORA
55、CLE_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,重新啟動數(shù)據(jù)庫,Oracle會按順序搜索以上目錄,spfile就會自動生效。startup pfile=E:Oracleadmineyglenpfileinit.ora;
56、create spfile from pfile;然后我們能夠使用ALTER SYSTEM方式將修改固定到SPFILE.ALTER SYSTEM SET log_archive_start=FALSE SCOPE=spfile;空間治理主體思想一直圍繞著內(nèi)部段的擴展。不僅僅阻礙到空間大小,自由塊太分散的話會阻礙性能(I/O,及擴展時刻等)空閑表(主空閑表、進程空閑表、事務空閑表),可能存在于表頭塊中表空間drop tablespace * including contents;注:LMT是segment中extent的治理, HYPERLINK l _自動段空間治理(ASSM) ASSM是th
57、e free space of segment的治理。在Oracle8I的版本中,Oracle推出了一種全新的表空間治理方式:本地化治理的表空間。所謂本地化治理,確實是指Oracle不再利用數(shù)據(jù)字典表來記錄Oracle表空間里面的extent的使用狀況,而是在每個表空間的數(shù)據(jù)文件的頭部加入了一個位圖區(qū),在其中記錄每個extent的使用狀況。每當一個extent被使用,或者被釋放以供重新使用時,Oracle都會更新數(shù)據(jù)文件頭部的那個記錄,反映那個變化。Oracle之因此推出了這種新的表空間治理方法,這種表空間組織方法的優(yōu)點:1. 本地化治理的表空間幸免了遞歸的空間治理操作。而這種情況在數(shù)據(jù)字典治
58、理的表空間是經(jīng)常出現(xiàn)的,當表空間里的區(qū)的使用狀況發(fā)生改變時,數(shù)據(jù)字典的表的信息發(fā)生改變,從而同時也使用了在系統(tǒng)表空間里的回滾段。2. 本地化治理的表空間幸免了在數(shù)據(jù)字典相應表里面寫入空閑空間、已使用空間的信息,從而減少了數(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ù)字
59、典來治理的話,它會把相關(guān)信息記在數(shù)據(jù)字典的表里,從而產(chǎn)生回滾信息。由于這種表空間的以上特性,因此它支持在一個表空間里邊進行更多的并發(fā)操作,并減少了對數(shù)據(jù)字典的依靠。關(guān)于表空間中的每一個空間(一個或多個extent),我們必須明白:1、那個可用空間位于什么數(shù)據(jù)文件2、那個空間的尺寸是多大3、假如它在用了,是哪一個段占用的那個空間直到8i之前,所有的表空間差不多上采納字典治理模式,為了確保能保存以上的信息,ORACLE用了兩個數(shù)據(jù)字典表:UET$(已使用的區(qū)間)或FET$(空閑空間):當一個段被刪除的時候,ORACLE就移動UET$中相應的行到FET$,那個過程的發(fā)生是連續(xù)的,而且可能發(fā)生等待。當
60、并發(fā)性專門高的時候,數(shù)據(jù)字典的爭用就來了。另外有一個問題確實是,當表的空間專門不連續(xù)或表空間有大量的碎片引起這兩個表的增大,那么也就會引起數(shù)據(jù)庫性能上的下降。表空間分段:氣泡(bubble):一個連續(xù)的自由空間塊;蜂窩(honeycomb):一系列看起來相連的塊。蜂窩由氣泡構(gòu)成(氣泡間有邊界),去掉邊界,蜂窩并成一個大的氣泡。氣泡和蜂窩多是由于擴展段的釋放而產(chǎn)生。過多的小的氣泡會導致DDL操作時多次掃描SYS.FET$,并花時刻合并可用空間,阻礙性能。讓我們看一下當一個行被從一個應用程序中插入到表中時發(fā)生的一系列動作:1) 查表的自由列表,考慮在哪能夠放一個新行。假如沒有自由塊可用,需要分配一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國奧運毛絨玩具數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國臺式真空充氣包裝機數(shù)據(jù)監(jiān)測研究報告
- 新疆維吾爾自治區(qū)喀什地區(qū)莎車縣2024-2025學年高二上學期1月期末考試物理試題(含答案)
- 2024-2025學年重慶市酉陽縣八年級(上)期末歷史試卷(含答案)
- 2019-2025年消防設(shè)施操作員之消防設(shè)備中級技能考前沖刺模擬試卷B卷含答案
- 2020年中考生物試題(含答案)
- 遺產(chǎn)繼承遺囑代辦合同(2篇)
- 采購與供應鏈分包合同(2篇)
- 2025年大學英語四級考試模擬試卷一
- 艾滋病相關(guān)知識培訓課件
- 藥物指導健康宣教
- 甲狀腺功能減退危象課件
- 后疫情時代全球貿(mào)易規(guī)則重構(gòu)
- 抗日戰(zhàn)爭中的英雄人物課件
- SHAFER氣液聯(lián)動執(zhí)行機構(gòu)培訓
- 醫(yī)療器械公司員工入職培訓
- (完整版)高中物理公式大全
- 《高血糖危象》課件
- 鐵路線路工培訓課件
- 《答司馬諫議書》 統(tǒng)編版高中語文必修下冊
- 儲備土地管護投標方案 (技術(shù)方案)
評論
0/150
提交評論