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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

ORACLE的工作機制體系結構實例Oracle 運行的時候,在內存中會要開辟一個區(qū)間,這個區(qū)間主要是用于從磁盤(數(shù)據文件)中讀出數(shù)據后的一個在內存的緩存和處理。而處理這些數(shù)據的操作,需要有一些系統(tǒng)的后臺進程,這些進行在Oracle數(shù)據庫啟動的時候,就開始運行,一直在響應前臺的操作。實際上,這一個區(qū)間(SGA)和這些后臺進程合在一起,就稱為 實例。實例是包括SGA區(qū)和后臺進程兩個部分的。 數(shù)據庫啟動執(zhí)行若干動作,經歷三個階段,分別是未加載、加載和打開。1、未加載(nomount) 可以把數(shù)據庫啟動的這一階段看作是Oracle實例的啟動。這種方式啟動下可執(zhí)行:重建控制文件、重建數(shù)據庫。這一啟動命令: 讀取數(shù)據庫參數(shù)文件。 啟動所需的后臺進程并按參數(shù)文件中的定義分配內存。 將進展情況寫入告警日志文件中。2、加載(mount) 在實例啟動加載階段,數(shù)據庫參數(shù)文件中指定的控制文件被讀取。記住控制文件將數(shù)據庫各部分聯(lián)系在一起。實例從控制文件中找到下列信息,然后將進展寫入告警日志文件。這種方式啟動下可執(zhí)行:數(shù)據庫日志歸檔、數(shù)據庫恢復、重新命名一些數(shù)據庫文件: 所有數(shù)據文件和重做日志文件的名稱和位置。 數(shù)據庫名。 最新系統(tǒng)更改號(S C N)。3、打開(open) 包含在數(shù)據庫中的每個聯(lián)機數(shù)據文件在數(shù)據庫打開前必須被同步。在數(shù)據庫打開階段: 所有聯(lián)機數(shù)據文件的頭與控制文件信息相比較。 所有文件同步后,數(shù)據庫打開。當數(shù)據庫關閉時,取決于它的關閉方式執(zhí)行不同的任務:正常(normal)在所有的用戶離線后發(fā)生的正常關閉。事務(transactional)事務關閉就是當所有的用戶執(zhí)行完當前的事務后,將用戶從數(shù)據庫上清除。立即(immediate)立即關閉就是從數(shù)據庫清除所有當前用戶之后,回退所有未完成的操作。異常(abort)異常關閉沒有給數(shù)據庫任何整理的機會。這種方式關閉后需要實行崩潰恢復。實例是數(shù)據管理的核心它做所有的工作,而數(shù)據庫存儲所有的數(shù)據。其他啟動方式:startup restrict 約束方式啟動這種方式能夠啟動數(shù)據庫,但只允許具有一定特權的用戶訪問 非特權用戶訪問時,會出現(xiàn)以下提示: ERROR: ORA-01035: ORACLE 只允許具有 RESTRICTED SESSION 權限的用戶使用 startup force 強制啟動方式 當不能關閉數(shù)據庫時,可以用startup force來完成數(shù)據庫的關閉 先關閉數(shù)據庫,再執(zhí)行正常啟動數(shù)據庫命令 startup pfile=參數(shù)文件名 帶初始化參數(shù)文件的啟動方式 先讀取參數(shù)文件,再按參數(shù)文件中的設置啟動數(shù)據庫 startup EXCLUSIVE*一個Delete操作的流程:1、 檢查語法、語義(V$ROWCACHE :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相關信息的訪問)2、 根據執(zhí)行計劃讀取數(shù)據:cache buffer chain latch 保護能定位到buffer header 并 pin 住該塊(如果沒有buffer header,就 pin 住某個空塊(沒有空塊就產生 free buffer waits),并到數(shù)據文件中讀?。?。如果此時有某個進程想訪問該塊,將產生 buffer busy waits 。3、 在redo log buffer中記錄delete操作的細節(jié)。(包括回滾段前后鏡像、數(shù)據塊前后鏡像)。4、 在相應回滾段段頭的事務表中創(chuàng)建一個undo條目,把將要刪除的記錄創(chuàng)建前鏡像,存放到Undo Block中。5、 在Buffer Cache中的相應數(shù)據塊上刪除記錄,并且標記相應的數(shù)據塊為Dirty。提交(COMMIT)1.Oracle產生一個SCN2.在回滾段事務表中標記該事務狀態(tài)為commited3.LGWR Flush Log Buffer到日志文件3.如果此時數(shù)據塊仍然在Buffer Cache中,那么SCN將被記錄到Block Header上,這被稱為快速提交(fast commit)4.如果dirty block已經被寫回到磁盤,那么下一個訪問這個block的進程將會自回滾段中獲取該事務的狀態(tài),確認該事務被提交。然后這個進程獲得提交SCN并寫回到Block Header上。這被稱為延遲塊清除(delayed block cleanout)。內存SGA(系統(tǒng)全局區(qū)、共享全局區(qū))、PGA(進程全局區(qū)、私有全局區(qū))內存分配原則:10%冗余內存,OS SYS進程(約1.6G),OS BUFFER(約0.8G),數(shù)據庫連接消耗內存(每個連接約58M),PGA(每個連接約2M,V$PGA_TARGET_ADVICE),SGASGAv$sgastat 注意 show parameter sga_max_sizeOracle的內存:l 軟件代碼區(qū)l 系統(tǒng)全局區(qū)l 進程全局區(qū):包含單個進程的數(shù)據和控制信息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永久性內存結構Java poolSGA中的The fixed area包含了數(shù)千個原子變量,以及如指向SGA中其它區(qū)域的pointers(指針)等小的數(shù)據結構.通過對fixed table內表X$KSMFSV查詢(如下)可以獲得這些變量的名字,變量類型,大小和在內存中的地址.the variable area是由large pool和shared pool組成Shared pool中永久性的內存包含各種數(shù)據結構如:the buffer headers, processes, sessions, transaction arrays, the enqueue resources , locks, the online rollback segment arrays, various arrays for recording statistics.其中大部分的SIZE是依靠初始參數(shù)的設置來確定的.這些初始參數(shù)只能在實例被關閉的狀態(tài)下才能夠進行修改.所以這里說的永久性是針對實例打開狀態(tài)下的生存期而言.The variable area的在SGA中的SIZES就等于LARGE_POOL_SIZE,SHARED_POOL_SIZE和永久性的內存arrays的SIZE三者相加.永久性內存arrays的SIZE=the variable area - (LARGE_POOL_SIZE+SHARED_POOL_SIZE).數(shù)據緩沖區(qū)命中率v$sysstat這里命中率的計算應該是令 x = physical reads direct + physical reads direct (lob)命中率 =100 - ( physical reads - x) / (consistent gets + db block gets - x)*100通常如果發(fā)現(xiàn)命中率低于90%,則應該調整應用可可以考慮是否增大數(shù)據緩沖區(qū)共享池的命中率SQL select sum(pinhits-reloads)/sum(pins)*100 hit radio from v$librarycache;hit radio-99.809291假如共享池的命中率低于95%,就要考慮調整應用(通常是沒使用bind var )或者增加內存關于排序部分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 部分內存較小,可考慮調整相應的參數(shù)。關于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上擴展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(address,hash_value); - keep 該匿名塊共享池包括庫高速緩存( library cache)、數(shù)據字典高速緩存和服務器控制結構(例如數(shù)據庫字符集)。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ā)現(xiàn)解析過的SQL已經aged out,就是離開了library cache,稱為Library cache misses使用的資源包括額外的CPU, library cache latch gets, 以及shared pool latch gets.專用SQL區(qū)在每個事務初始化時創(chuàng)建,在與專用SQL區(qū)相關的游標關閉時被釋放。一個用戶會話能夠一次打開的專用SQL區(qū)的數(shù)量由init.ora參數(shù)OPEN_CURSORS決定。使用這兩個結構,Oracle服務器能夠重用一條SQL語句的所有執(zhí)行的共同信息。與此同時,可以從專用SQL區(qū)中查詢執(zhí)行的特定會話信息。注意游標使用過程中并不關閉游標的應用會繼續(xù)為應用分配越來越多的內存,部分原因是為每個打開的游標分配了專用SQL區(qū)。庫高速緩存中的專用SQL區(qū)可更進一步分為永久區(qū)和運行區(qū)。共享池的大小取決于init.ora文件參數(shù)SHARED_POOL_SIZE,它是以字節(jié)為單位的。你必須將這個值設得足夠大,以確保有足夠的可用空間來裝載和存儲PL/SQL塊和SQL語句。共享區(qū)經過長期裝卸和卸載數(shù)據對象會產生許多碎片,如果在共享池中沒有足夠的連續(xù)空間用來裝載目標數(shù)據,會產生錯誤。解決這個問題的捷徑是運行SQL命令ALTER SYSTEM FLUSH SHARED_POOL。但是如果在數(shù)據庫操作時,經常遇到共享池錯誤,你必須增大共享池Library cache包含 shared SQL and PL/SQL areas(PL/SQL包括Procedures, Functions, Packages, Trigger, 匿名PL/SQL塊) Sizing the Library Cache定義stored object(packages,views等等)的內存需求;定義經常使用的sql statement的所需內存1. 初始時將SHARED_POOL_SIZE設得很大,運行應用程序2. 計算stored object所占的內存SELECT SUM(sharable_mem) FROM v$db_object_cacheWHERE type = PACKAGE or type = PACKAGE BODY or type = FUNCTION or type = PROCEDURE;3. 應用程序運行一段時間后,估計常用sql語句所占的內存(不包括動態(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,運行下列語句測試共享內存,然后乘上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;以上內存的和,再加上一點內存(留給動態(tài)SQL使用),作為你的應用的理想內存設置;預留一部分空間作為大的內存需要,避免miss和碎片;一些大的內存需要: PL/SQL塊的編譯,trigger的編譯;小的object不會使預留空間碎片化,反而保證reserved list有大的連續(xù)塊,一旦從reserved list中分配的內存釋放它就返回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關閉;為了利用更多的內存給共享SQL區(qū)域,需要提高session每個session允許多cursor數(shù)量,開發(fā)人員應關閉不需要的cursor節(jié)省內存CURSOR_SPACE_FOR_TIME 缺省=FALSE 布爾值設置TRUE,表示以空間換取時間,共享SQL區(qū)不會被aged out直至相關的cursor被關閉,因此確信有足夠的內存,沒有cache miss;除非RELOADS in V$LIBRARYCACHE一直為0,否則不要改變此參數(shù)值若應用為FORM或使用動態(tài)SQL,設此值為FALSE - 因為動態(tài)sql總是不一致,將占用過多內存SESSION_CACHED_CURSORS 缺省=0 表示沒有cache當一個session打算關閉一個cursor時,如果這個cursor的parse count超過3次,那么這個cursor將會被加到session cursor cache list的MRU端.當一個session打算parse一個sql時,它會先去session的pga內搜索session cursor cache list,如果找到那么會把這個cursor脫離list,然后當關閉的時候再把這個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 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ù)空間的對象:select * from v$db_object_cache where sharable_mem 100000 and type in (PACKAGE, PACKAGE BODY, PROCEDURE, FUNCTION);考察返回的結果,確認是否需要pin到共享池中,返回結果中的KEPT字段如果是YES,那么表示該對象已經固定在了共享池中,為NO,則表示還沒有固定。如果需要固定,使用下面的語句:exec dbms_shared_pool.keep(SYS.STANDARD); 數(shù)據庫默認安裝的時候沒有創(chuàng)建dbms_shared_pool包,所以需要先創(chuàng)建該包。cd $ORACLE_HOME/rdbms/adminsqlplus “/ as sysdba”dbmspool.sqlDATA BUFFER - 數(shù)據庫緩沖區(qū)高速緩存v$db_cache_advice=一堆數(shù)據塊(DB_BLOCK_SIZE*DB_BLOCK_BUFFERS)數(shù)據庫的任何修改都在該緩沖里完成(LRU-LRUW)。所有的塊,被讀到內存中后,它的塊頭(data block header)放在一個Cache buffer chain 中,Cache buffer chain由多個雙向hash 鏈表組成,hash鏈表數(shù)量由_db_block_hash_buckets決定.每個數(shù)據塊頭由DBA(data block address)作為key,經hash函數(shù)后放在鏈表上,它和block buffer中的block一一對應,數(shù)據塊頭不包括實際的數(shù)據,僅是一個簡單的描述. 后臺進程掃描hash鏈表前,必須獲得cache buffer chain latch,如果在Cache Buffer chain中找不某塊,就由磁盤讀入. 若需要查找某個 block,則根據 block的信息能計算 hash value 然后迅速定位到 hash table ,然后根據hash table 信息去查看是否存在所想要的 buffer ,若有則命中,若沒有則不命中。顯然不可能根據list去逐個搜索,這樣效率太低.LRU 就是一種盡可能將常用的數(shù)據保留在內存的算法.當數(shù)據庫需要一個數(shù)據緩沖區(qū), 他會從數(shù)據庫緩沖區(qū)的LRU 隊列的尾部找一個空閑的緩沖, 將一個數(shù)據塊讀入, 然后數(shù)據庫會把這個緩沖區(qū)放到LRU 隊列的中部, 如果該緩沖被其他程序用到的話, 那么他會往隊列的頭上移動, 如果這個緩沖沒有被其他程序用到,并且沒有被修改過, 那么他會慢慢的移動到LRU 隊列的尾部, 最終被認為是空緩沖區(qū)被其他數(shù)據塊所覆蓋.一旦這個緩沖區(qū)被修改過DBWR 把他從LRU 隊列中移出, 放到LRUW 隊列 (也叫贓緩沖區(qū)) 中, 等待DBWR 把他們批量寫入數(shù)據文件, 然后再把他們的緩沖區(qū)連接到LRU 隊列的尾部.周而復始的工作.如果查找在一個閥值內沒有結果或者造成dirty緩沖區(qū)已經溢出,在進一步查找free buffer前系統(tǒng)將發(fā)出一個消息給DBWR讓他可以將LRUW隊列的緩沖區(qū)寫入磁盤. 這個閥值被叫做這個閥值被叫做DBWR scan depthdirty緩沖區(qū)大小可以用 _DB_LARGE_DIRTY_QUEUE和 2*_DB_BLOCK_WRITE_BATCH 來確定. 前臺進程繼續(xù)搜索free buffer.直到 _DB_BLOCK_MAX_SCAN_CNT還沒有發(fā)現(xiàn)系統(tǒng)就會掛起該進程.記錄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)命令了。但是在805與8i中,需要設置buffer_pool_keep參數(shù)來設置KEEP池大小。這塊內存來自數(shù)據緩存區(qū),也就是從db_block_buffers中分配。在ORACLE8和8i中,還必須設置db_block_lru_latches參數(shù)。該參數(shù)應該比2*3*CPU數(shù)量少,但是要大于1,否則無法設置buffer_pool_keep。在ORACLE9i 中則需要設置DB_KEEP_CACHE_SIZE來設置KEEP池內存的大小。這樣將表KEEP才有用。而且KEEP池要能夠容納得下才行的將函數(shù)Cache 到 SGA 中$ORACLE_HOMErdbmsadmindbmspool.sql;exec dbms_shared_pool.keep(procedure_name,P);重做日志緩沖區(qū)(LOG_BUFFER)log buffer分成內部的buffer blocks,而這些block各有8個字節(jié)的頭部信息存在于variable area中.當重做日志緩沖區(qū)填滿時,將它的內容寫入聯(lián)機重做日志文件。是循環(huán)使用。是數(shù)據庫最活躍的情形,可以用V$SYSSTAT視圖進行監(jiān)控。查詢V$SYSSTAT視圖value域,它表明用戶進程等待重做日志緩沖區(qū)所花費的時間(此處value的值應接近于0,否則應增大初始化參數(shù)文件的Log_buffers的值):SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME = redo log space requests;PGAv$pgastat v$pga_target_advice后臺進程v$bgprocess數(shù)據庫寫進程(DBWR)(DB_BLOCK_WRITE_BATCH,DB_BLOCK_MAX_SCAN,DB_WRITES,DB_BLOCK_LRU_LATCHES,DB_BLOCK_CHECKPOINT_BATCH,DB_BLOCK_CHECKSUM)負責數(shù)據文件的讀寫和db_data_buffer的清理dbwr負責搜集dirty buffer,slaves負責寫磁盤工作的前提條件:1. dirty buffer超出了dirty buffer list的threshold.2. server process在buffer cache中查找free buffer時,則也可能會通知DBWn將dirty buffer寫入datafile.3. DBWn每3秒會檢查是否有dirty數(shù)據要寫入datafile.4.CKPT5.tablespace offline或tablespace begin backup(這里實際上是由CKPT引起).6.drop object7. shutdown (這里實際上也是由CKPT引起)建議你使用與存儲數(shù)據文件的物理磁盤一樣多的DBWR進程;DBWR寫入數(shù)據文件的任何修改已經被記錄在重做日志文件中.一次checkpoint的成功過程是:dbwr搜集dirty buffer,交給slave寫磁盤,寫完畢通知dbwr,然后dbwr才返回檢查點完成。增加寫進程,同時要調整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重做日志緩沖區(qū)未被寫入磁盤3.有大于1M重做日志緩沖區(qū)未被寫入磁盤4.超時5.DBWR需要寫入的數(shù)據的SCN號大于LGWR記錄的SCN號,DBWR觸發(fā)LGWR寫入歸檔進程(ARCH)。ARCHIVE_LOG_START檢查點(CKPT)。同步數(shù)據文件,日志文件和控制文件CKPT會更新數(shù)據文件/控制文件的頭信息.CKPT工作的主要條件如下1.在日志切換的時候2.數(shù)據庫用immediate,transaction,normal選項shutdown數(shù)據庫的時候3.根據初始話文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT,FAST_START_IO_TARGET的設置的數(shù)值來確定4.用戶觸發(fā)系統(tǒng)監(jiān)控和進程監(jiān)控進程(SMON和PMON)。調度進程(Dnnn)。MTS_DISPATCHERS恢復進程(RECO)。DISTRIBUTED_TRANSACTIONS快照進程(SNPn)。OB_QUEUE_PROCESS,JOB_QUEUE_INTERVAL鎖進程(LCKn)。并行查詢進程(Pnnn)。PARALLEL_MIN_SERVERS,PARALLEL_MAX_SERVERS用戶和服務器進程(Snnn)?;貪Lv$rollstat v$waitstat v$sysstat x$bh dba_rollback_segs一下事務的流程:1.分配一個回滾段2.在回滾段事務表中分配一個事務槽3.分配undo block4.更新數(shù)據塊上的ITL事務槽5.把前鏡像記錄在undo block內6.更改數(shù)據塊的內容ITL事務槽-Interested Transaction List(ITL)ITL內容包括: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;當一個事務開始的時候,會首先把變化前的數(shù)據和變化后的數(shù)據先寫入日志緩沖區(qū),然后把變化前的數(shù)據寫入回滾段,最后才在數(shù)據緩沖區(qū)中修改數(shù)據一致性讀取consistent reads假設查詢開始的時候的SCN 為T,則在查詢所掃描的數(shù)據塊中,如果數(shù)據的COMMIT SCN 小于T,則查詢接受該數(shù)據,如果COMMIT SCN 大于T 或者說還沒有產生COMMIT SCN,則查詢會嘗試去回滾段中查找數(shù)據。這是為了保證數(shù)據的讀取的時間點的一致性,所以叫一致性讀。我們可以參考v$rollstat、v$transaction和x$bh 表,在x$bh 中的class字段,如果是回滾段塊,假設回滾段USN 為n,則回滾段頭class 為11+2n,回滾段塊為12+2n?;貪L段的使用、擴展、回縮同一個事務不能跨越回滾段;一個回滾段至少包含2個extent。每個回滾段有一個回滾段頭,回滾段頭是一個block,里面主要記錄了事務表信息。當產生一個事務的時候,就在回滾段頭的事務表中記錄一條信息,該信息中包含了事務標志、事務狀態(tài)、使用的回滾段塊數(shù)等等信息。使用時從第一個extent的第二個block到最后一個extent循環(huán)使用;如果其中的一個extent有未提交的事物,那么前面的extent不能跨越該extent,只能在2個extent之間擴展新的extent,并修改相應的節(jié)點指針(回滾段的extent 之間是通過指針連起來的一個單向循環(huán)的鏈表結構);系統(tǒng)回滾段與延遲回滾段SYSTEM 回滾段是創(chuàng)建在系統(tǒng)表空間中,主要是用于系統(tǒng)級的事務和分配普通事務于其他回滾段上。當手工創(chuàng)建數(shù)據庫后需要創(chuàng)建普通回滾段之前必須首先創(chuàng)建系統(tǒng)回滾段。系統(tǒng)回滾段主要用于兩個方面。一是系統(tǒng)事務,比如針對數(shù)據字典的操作的truncate table 和 drop table 。如果truncate table or drop table 的過程中沒有成功,則系統(tǒng)會根據系統(tǒng)回滾段中的數(shù)據字典操作信息對該DDL 操作進行回退。另一個方面,就是延遲回滾段(Deferred Rollback Segment) 。表空間offline時用戶申請回滾,數(shù)據庫會將回滾信息寫入系統(tǒng)回滾段(就是延遲回滾段),等到online時,在寫入表空間?;貪L段的設置和管理init.ora: transactions_per_rollback_segment 和transactions,max_rollback_segments1:系統(tǒng)并發(fā)事務數(shù)有多少?(主要是產生恢復信息的會話數(shù)+一部分冗余數(shù)(20)=總回滾段數(shù))2:系統(tǒng)是否存在大查詢或者大是事務?頻繁么?3:能提供給系統(tǒng)的回滾段表空間的磁盤空間是多少?不要將回滾段的MAXEXTENTS設為UNLIMITED, 回滾段所在表空間也不要設為AUTOEXTEND方式, 否則將會使得由于某個不正常的事務導致整個數(shù)據庫處于失控狀態(tài)。9iundo_retention 表示在自動管理模式下,回滾段中的數(shù)據在被覆蓋前保留多長的時間,單位是秒。這個參數(shù)應該決定于系統(tǒng)所中一些大查詢運行的時間長度,以避免ORA-01555 錯誤。在9i 下創(chuàng)建非自動管理的的回滾段而不使用UNDO 表空間,則設置undo_management為MANUAL,然后在系統(tǒng)表空間中創(chuàng)建一個回滾段(注意這是必須的),創(chuàng)建自己的回滾段表空間,這時可以在回滾段表空間中創(chuàng)建回滾段,創(chuàng)建完畢刪除系統(tǒng)表空間中的回滾段。著名的ORA-01555 問題一致讀獲取的時候發(fā)現(xiàn)回滾段已經被覆蓋而出現(xiàn)找不著變化前映像,也就是當COMMIT SCN 大于T 查詢嘗試去回滾段中找回數(shù)據卻發(fā)現(xiàn)回滾段已經被覆蓋了(因為回滾段是循環(huán)使用的),則會出現(xiàn)著名的ORA-01555 錯誤。重做v$sysstat v$log v$logfile v$log_historyalter system switch logfile;重做記錄了塊的改變,包括回滾段頭塊、回滾段塊、數(shù)據塊,并且在塊改變之前先記錄重做信息。更改矢量(change vector)當要改變數(shù)據庫的數(shù)據時,這些改變的細節(jié)被記錄為更改矢量。通過這些記錄,數(shù)據庫處理過程可以被重現(xiàn)。簡而言之,一個更改矢量就是記錄了一個數(shù)據塊的行槽從一個狀態(tài)改變到另一個狀態(tài)的過程。也就是redo的記錄單位是entry,即:file X,block Y,row slot Z。Redo也記錄了數(shù)據塊(table block & index block)前照,其實記錄的就是undo,因為即使沒有commit,改動也會被記錄到redo 文件里,這時的table block & index block就是未提交的最新狀態(tài),如果此時系統(tǒng)崩潰,則需要redo中記錄的undo(前照)進行恢復,所以redo記錄了數(shù)據塊、索引塊、回滾塊 。ORACLE推薦logswitch時間最好在15-30分鐘之間。跟redologfile有關的其它數(shù)據庫參數(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 allocation retries AND RE.NAME = redo entries;這個比率小于1%才好,否則增加log_buffer的大小2、log_checkpoint_intervalOracle8.1版本后log_checkpoint_interval指的是兩次checkpoint之間操作系統(tǒng)數(shù)據塊的個數(shù)。checkpoint時Oracle把內存里修改過的數(shù)據塊用DBWR寫到物理文件,用LGWR寫到日志和控制文件。從性能優(yōu)化來說log_checkpoint_interval=redo log file size bytes/512bytes3、log_checkpoint_timeoutOracle8.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設定。LOG_ARCHEVE_DEST和LOG_ARCHEVE_DUPLEX_DEST都可以存檔所有的聯(lián)機重作日志文件。另一個初始化參數(shù)LOG_ARCHIVE_MIN_SUCCEED_DEST如果設置了的話,可以決定一個重作日志組必須被成功存檔到的存檔日志目的地數(shù),在一個目的地滿或其介質有錯時,該參數(shù)可以防止Oracle被凍結。要確保這兩個目的地被配置在兩個分離的磁盤/控制器上,避免I/O沖突對數(shù)據庫性能的影響。一些參數(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) | = | value FROM v$parameter ORDER BY name;查看所有參數(shù)是否已被init.ora重新設定SELECT name, isspecified FROM v$obsolete_parameter ;查看過時參數(shù)和強調參數(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 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分配給共享池的內存字節(jié)數(shù)隨著用戶的需求,可以按時增加此值Rollback_segments數(shù)據庫啟動時獲取的一個或多個當事務處理量增加或減少時,可以從該回滾段名列表中增加或刪除回滾段名Processes可同時訪問數(shù)據庫的最大進程數(shù)量session=1.1*process+5,一般而言,session和process是一一對應的,5是Oracle后臺進程的session,10%是提供給recursive session使用的。db_block_buffers見SGA介紹中的相關內容shared_pool_size見SGA介紹中的相關內容log_buffer見SGA介紹中的相關內容sort_area_size針對每個session,排序首先會使用sort_area_size ,如果不足則會使用臨時表空間。實際上就是外排序過程,把要排序的對象分割為內存可以容納的小段(sort run),然后每個sort run都放到sort area里面去排序,排序結果作為中間信息放在臨時表空間的臨時段內,由于分段排序的結果當然不會是最終要求的排序結果,所以還要經過一個merge的過程,才會得到最終排序結果,原理大概是比較每個sort run的第一名,取出領先者,然后該sort run的第二名頂上,繼續(xù)上述過程直到取完。所以建議:sort_area_size 所能容納記錄數(shù)至少大于排序記錄數(shù)的 平方根5. open_cursor見SGA介紹中的相關內容6. database_writers許多DBA有個錯誤的概念,認為此參數(shù)受CPU數(shù)量的限制,實際并非如此。提示: 如果工作在一個可以支持多進程的操作系統(tǒng)上,需做的第一件事就是改變這個參數(shù)的值。重新啟動數(shù)據庫,使用startup命令,Oralce將會按照以下順序在缺省目錄中搜索參數(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,重新啟動數(shù)據庫,Oracle會按順序搜索以上目錄,spfile就會自動生效。startup pfile=E:Oracleadmineyglenpfileinit.ora;create spfile from pfile;然后我們可以使用ALTER SYSTEM方式將修改固定到SPFILE.ALTER SYSTEM SET log_archive_start=FALSE SCOPE=spfile;空間管理主體思想一直圍繞著內部段的擴展。不僅僅影響到空間大小,自由塊太分散的話會影響性能(I/O,及擴展時間等)空閑表(主空閑表、進程空閑表、事務空閑表),可能存在于表頭塊中表空間drop tablespace * including contents;注:LMT是segment中extent的管理,ASSM是the free space of segment的管理。在Oracle8I的版本中,Oracle推出了一種全新的表空間管理方式:本地化管理的表空間。所謂本地化管理,就是指Oracle不再利用數(shù)據字典表來記錄Oracle表空間里面的extent的使用狀況,而是在每個表空間的數(shù)據文件的頭部加入了一個位圖區(qū),在其中記

溫馨提示

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

評論

0/150

提交評論