目的
為企業(yè)提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、網(wǎng)站優(yōu)化、成都營銷網(wǎng)站建設(shè)、競價托管、品牌運營等營銷獲客服務(wù)。創(chuàng)新互聯(lián)擁有網(wǎng)絡(luò)營銷運營團(tuán)隊,以豐富的互聯(lián)網(wǎng)營銷經(jīng)驗助力企業(yè)精準(zhǔn)獲客,真正落地解決中小企業(yè)營銷獲客難題,做到“讓獲客更簡單”。自創(chuàng)立至今,成功用技術(shù)實力解決了企業(yè)“網(wǎng)站建設(shè)、網(wǎng)絡(luò)品牌塑造、網(wǎng)絡(luò)營銷”三大難題,同時降低了營銷成本,提高了有效客戶轉(zhuǎn)化率,獲得了眾多企業(yè)客戶的高度認(rèn)可!
希望通過整理此文檔 使大家對 oracle 內(nèi)存結(jié)構(gòu)有一個全面的了解 并在實際的工作中靈活應(yīng)用 使 oracle 的內(nèi)存性能達(dá)到最優(yōu)配置 提升應(yīng)用程序反應(yīng)速度 并進(jìn)行合理的內(nèi)存使用
實例結(jié)構(gòu)
oracle 實例 = 內(nèi)存結(jié)構(gòu) + 進(jìn)程結(jié)構(gòu)
oracle 實例啟動的過程 其實就是 oracle 內(nèi)存參數(shù)設(shè)置的值加載到內(nèi)存中 并啟動相應(yīng)的后臺進(jìn)程進(jìn)行相關(guān)的服務(wù)過程
進(jìn)程結(jié)構(gòu)
oracle 進(jìn)程 = 服務(wù)器進(jìn)程 + 用戶進(jìn)程
幾個重要的后臺進(jìn)程
DBWR 數(shù)據(jù)寫入進(jìn)程
LGWR: 日志寫入進(jìn)程
ARCH: 歸檔進(jìn)程
CKPT: 檢查點進(jìn)程 ( 日志切換 上一個檢查點之后 又超過了指定的時間 預(yù)定義的日志塊寫入磁盤 例程關(guān)閉 DBA 強制產(chǎn)生 表空間 offline)
LCKn ( ) 封鎖進(jìn)程
Dnnn: 調(diào)度進(jìn)程
內(nèi)存結(jié)構(gòu) ( 我們重點講解的 )
內(nèi)存結(jié)構(gòu) =SGA (系統(tǒng)全局區(qū)) +PGA (程序全局區(qū))
SGA 是用于存儲數(shù)據(jù)庫信息的內(nèi)存區(qū) 該信息為數(shù)據(jù)庫進(jìn)程所共享 它包含 Oracle 服務(wù)器的數(shù)據(jù)和控制信息 它是在 Oracle 服務(wù)器所駐留的計算機的實際內(nèi)存中得以分配 如果實際內(nèi)存不夠再往虛擬內(nèi)存中寫
我們重點就是設(shè)置 SGA 理論上 SGA 可占 OS 系統(tǒng)物理內(nèi)存的 / —— /
原則 SGA+PGA+OS 使用內(nèi)存 總物理 RAM
SGA=((db_block_buffers*blocksize)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+ MB
SGA 系統(tǒng)全局區(qū) ( 包括以下五個區(qū) )
A 數(shù)據(jù)緩沖區(qū) : ( db_block_buffers )存儲由磁盤數(shù)據(jù)文件讀入的數(shù)據(jù)
大小 : db_block_buffers*db_block_size
Oracle i 設(shè)置數(shù)據(jù)緩沖區(qū)為 Db_cache_size
原則 SGA 中主要設(shè)置對象 一般為可用內(nèi)存 %
B 共享池 : ( shared_pool_size ) : 數(shù)據(jù)字典 sql 緩沖 pl/sql 語法分析 加大可提速度
原則 SGA 中主要設(shè)置對象 一般為可用內(nèi)存 %
C 日志緩沖區(qū) : ( log_buffer )存儲數(shù)據(jù)庫的修改信息
原則 K M 之間 不應(yīng)該太大
D JAVA 池( Java_pool_size )主要用于 JAVA 語言的開發(fā)
原則 若不使用 java 原則上不能小于 M 給 M 通常就夠了
E 大池( Large_pool_size )?? 如果不設(shè)置 MTS 主要用于數(shù)據(jù)庫備份恢復(fù)管理器 RMAN
原則 若不使用 MTS M 之間 不應(yīng)該太大
SGA= db_block_buffers*db_block_size+ shared_pool_size+ log_buffer+Java_pool+size+large_pool_size
原則 達(dá)到可用內(nèi)存的 % 就可以了
PGA 程序全局區(qū)
PGA 包含單個服務(wù)器進(jìn)程或單個后臺進(jìn)程的數(shù)據(jù)和控制信息 與幾個進(jìn)程共享的 SGA 正相反 PGA 是只被一個進(jìn)程使用的區(qū)域 PGA 在創(chuàng)建進(jìn)程時分配在終止進(jìn)程時回收
A Sort_area_size? 用于排序所占內(nèi)存
B Hash_area_size 用于散列聯(lián)接 位圖索引
這兩個參數(shù)在非 MTS 下都是屬于 PGA 不屬于 SGA 是為每個 session 單獨分配的 在我們的服務(wù)器上除了 OS + SGA 一定要考慮這兩部分
原則 OS 使用內(nèi)存 +SGA+ 并發(fā)執(zhí)行進(jìn)程數(shù) *(sort_area_size+hash_ara_size+ M) * 總內(nèi)存
實例配置
一 物理內(nèi)存多大
二 操作系統(tǒng)估計需要使用多少內(nèi)存
三 數(shù)據(jù)庫是使用文件系統(tǒng)還是裸設(shè)備
四 有多少并發(fā)連接
五 應(yīng)用是 OLTP 類型還是 OLAP 類型
基本掌握的原則是 db_block_buffer 通??梢员M可能的大 shared_pool_size 要適度 log_buffer 通常大到幾百 K 到 M 就差不多了
A 如果 M RAM? 單個 CPU?? db_block_size 是 bytes
SGA= * M= M 左右
建議 shared_pool_size = M db_block_buffer* db_block_size = M
具體 : shared_pool_size = # M
db_block_buffer= ????? # M
log_buffer = ???????? # k ( K*CPU 個數(shù) )
large_pool_size= ????? # M
java_pool_size = ??? # M
sort_area_size = ????? # k ( k M)
sort_area_retained_size = ?? # MTS 時 sort_area_retained_size = sort_area_size
B 如果 G RAM????? 單個 CPU?? db_block_size 是 bytes
SGA= * M= M 左右
建議 shared_pool_size = M db_block_buffer* db_block_size = M
具體 : shared_pool_size= ??? # M
db_block_buffer= ???????? # M
log_buffer = ???????? # k ( K*CPU 個數(shù) )
large_pool_size= ?????? # M
java_pool_size = ??? # M
sort_area_size = ????? # k ( k M)
sort_area_retained_size = ?? # MTS 時 sort_area_retained_size = sort_area_size
C 如果 G???? 單個 CPU?? db_block_size 是 bytes
SGA= * M= M 左右
建議 shared_pool_size = M db_block_buffer *db_block_size = M
具體 : shared_pool_size= ??? # M
db_block_buffer= ???????? # M
log_buffer = ??????????? # k ( K*CPU 個數(shù) )
large_pool_size= ????? # M
java_pool_size = ????? # M
sort_area_size = ???????? # k ( k M)
sort_area_retained_size = ?? # MTS 時 sort_area_retained_size = sort_area_size
假定 bit ORACLE
內(nèi)存 G
shared_pool_size = M data buffer = G
內(nèi)存 G
shared_pool_size = M data buffer = G
內(nèi)存 G
shared_pool_size = M M data buffer = G
參數(shù)更改方式
oracle i
主要都是通過修改 oracle 啟動參數(shù)文件進(jìn)行相關(guān)的配置
參數(shù)文件位置
d:\oracle\admin\DB_Name\pfile\init ora
按以上修改以上參數(shù)值即可
Oracle i:
兩種方式 第一種是修改 oracle 啟動參數(shù)文件后 通過此參數(shù)文件再創(chuàng)建服務(wù)器參數(shù)文件
第二種是直接運行 oracle 修改命令進(jìn)行修改
SQLalter system set db_cache_size= M scope=spfile;
lishixinzhi/Article/program/Oracle/201311/16995
i之前 oracle使用的初始化參數(shù)文件是pfile i開始引用了SPFILE 但保留了pfile
初始化參數(shù)文件在整個ORACLE系統(tǒng)之中起著關(guān)鍵的作用 啟動的過程中 oracle根據(jù)初始化參數(shù)的設(shè)置分配SGA 啟動后臺進(jìn)程 數(shù)據(jù)庫打開后 還是依據(jù)初始化的參數(shù)設(shè)置運行數(shù)據(jù)庫
I以后的oracle版本 初始化參數(shù)文件有spfileSID ORA spfile ORA init ORA oracle在啟動過程中也是按照這個順序依次查找初始化參數(shù)文件 若最終沒有找到 則數(shù)據(jù)庫啟動失敗 同時Alert_sid log報錯
i之后的版本 默認(rèn)啟動都是使用spfile參數(shù)文件啟動 當(dāng)然也可以指定pfile參數(shù)文件啟動ORACLE spfile參數(shù)文件的格式為spfileSID ORA 而pfile參數(shù)文件的格式為initSID ORA
startup pfile= /oradata/oracle/admin/TEST/pfile/init ora *****
另外 pfile和spfile兩者可以相互創(chuàng)建 創(chuàng)建默認(rèn)目錄在$ORACLE_HOME/dbs/
CREATE SPFILE FROM PFILE;
CREATE PFILE FROM SPFILE;
通過spfile創(chuàng)建的的初始化參數(shù)格式為 initSID ORA
修改初始化參數(shù)有兩種方式
一 在mond下修改初始化參數(shù)
修改pfile參數(shù) 可編輯的修改init ora
修改spfile參數(shù) 不可編輯參數(shù)文件 只能通過命令或者EM動態(tài)修改初始化參數(shù)
命令 Alter system set AAA=N scope=MEMORY|SPFILE|BOTH;
SCOPE參數(shù)有三個選項
MEMORY 修改只對運行的實例有效
SPFILE 修改SPFILE設(shè)置
BOTH 同時修改了SPFILE和此實例
注意 在修改靜態(tài)參數(shù)時必須得指定SPFILE參數(shù) 否則會報錯 亦即修改靜態(tài)參數(shù)時SCOPE參數(shù)不允許為BOTH
二 在EM中修改初始化參數(shù)設(shè)置
以sys用戶登錄EM
在主界面上選擇 管理 標(biāo)簽按鈕
在管理頁面下選擇 數(shù)據(jù)庫配置 下的 所有初始化參數(shù) 按鈕 轉(zhuǎn)入初始化參數(shù)設(shè)置頁面
默認(rèn)修改的的是SCOPE=MEMORY的設(shè)置 當(dāng)把 在當(dāng)前正在運行的實例模式下將更改應(yīng)用與SPFile 復(fù)選框選中時 相當(dāng)于SCOPE=BOTH的設(shè)置
在值那項文本框輸入新的值之后 點擊右上角的應(yīng)用按鈕 修改生效
修改屬性為SCOPE=SPFILE
lishixinzhi/Article/program/Oracle/201311/16518
普通參數(shù):也就是Oracle系統(tǒng)正常使用的一些參數(shù),
非凡參數(shù):包括三種,過時參數(shù)、強調(diào)參數(shù)和隱藏參數(shù)。
隨著Oracle數(shù)據(jù)庫新版本的發(fā)布,相應(yīng)每次都會增加或者刪除一些參數(shù)。下面具體介紹如何查詢當(dāng)前系統(tǒng)版本中的各種參數(shù)情況。
一、過時參數(shù) 和 強調(diào)參數(shù)
Oracle 數(shù)據(jù)庫中,系統(tǒng)提供了幾個視圖可以查看系統(tǒng)參數(shù)的情況。視圖 V$OBSOLETE_PARAMETER 中含有所有的過時 (obsolete) 和強調(diào) (underscored) 參數(shù)。
這里首先說明一下什么是 Oracle 的過時 (obsolote) 和強調(diào) (underscored) 參數(shù),過時參數(shù),顧名思義就是在 Oracle 以前的版本中存在,但在新版本中已經(jīng)淘汰了的參數(shù),已經(jīng)不再使用;而強調(diào)參數(shù),是指那些在新版本中保留了下來,但是除非非凡需要不希望用戶使用的那些參數(shù)。在視圖 V$OBSOLETE_PARAMETER 中,包含這些參數(shù)的名稱和一個標(biāo)志字 ISSPECIFIED ,該標(biāo)志字用來指出這個參數(shù)是否在 init.ora 文件中已實際設(shè)置。 下面的 SQL 腳本列出了當(dāng)前系統(tǒng)中所有的過時參數(shù)名稱以及它們是否在當(dāng)前系統(tǒng)中設(shè)定。
/* Formatted on 2010-5-12 17:46:27 (QP5 v5.115.810.9015) */
SELECT name, isspecified FROM v$obsolete_parameter;
上面談到, Oracle 系統(tǒng)并沒有將 V$OBSOLETE_PARAMETER 視圖中的所有參數(shù)均丟棄,而是將其中的一部分轉(zhuǎn)換為強調(diào)參數(shù),下面就來討論如何查看這些參數(shù)是已被丟棄還是被轉(zhuǎn)換。這可以通過系統(tǒng)視圖 X$KSPPO 來查看,該視圖中包含一個名為 KSPPOFLAG 的字段,用來指明該參數(shù)在當(dāng)前版本中是被丟棄還是被強調(diào),假如該值為 1 ,則表示該參數(shù)已被丟棄,該值為 2 ,則表明該參數(shù)現(xiàn)為強調(diào)參數(shù)。
一 SGA
Shared pool tunning
Shared pool的優(yōu)化應(yīng)該放在優(yōu)先考慮 因為一個cache miss在shared pool中發(fā)生比在data buffer中發(fā)生導(dǎo)致的成本更高 由于dictionary數(shù)據(jù)一般比library cache中的數(shù)據(jù)在內(nèi)存中保存的時間長 所以關(guān)鍵是library cache的優(yōu)化
Gets (parse)在namespace中查找對象的次數(shù)
Pins (execution)在namespace中讀取或執(zhí)行對象的次數(shù)
Reloads (reparse)在執(zhí)行階段library cache misses的次數(shù) 導(dǎo)致sql需要重新解析
) 檢查v$librarycache中sql area的gethitratio是否超過 % 如果未超過 % 應(yīng)該檢查應(yīng)用代碼 提高應(yīng)用代碼的效率
Select gethitratio from v$librarycache where namespace= sql area ;
) v$librarycache中reloads/pins的比率應(yīng)該小于 % 如果大于 % 應(yīng)該增加參數(shù)shared_pool_size的值
Select sum(pins) executions sum(reloads) cache misses sum(reloads)/sum(pins) from v$librarycache;
reloads/pins %有兩種可能 一種是library cache空間不足 一種是sql中引用的對象不合法
)shared pool reserved size一般是shared pool size的 % 不能超過 % V$shared_pool_reserved中的request misses= 或沒有持續(xù)增長 或者free_memory大于shared pool reserved size的 % 表明shared pool reserved size過大 可以壓縮
)將大的匿名pl/sql代碼塊轉(zhuǎn)換成小的匿名pl/sql代碼塊調(diào)用存儲過程
)從 i開始 可以將execution plan與sql語句一起保存在library cache中 方便進(jìn)行性能診斷 從v$sql_plan中可以看到execution plans
)保留大的對象在shared pool中 大的對象是造成內(nèi)存碎片的主要原因 為了騰出空間許多小對象需要移出內(nèi)存 從而影響了用戶的性能 因此需要將一些常用的大的對象保留在shared pool中 下列對象需要保留在shared pool中
a 經(jīng)常使用的存儲過程
b 經(jīng)常操作的表上的已編譯的觸發(fā)器
c Sequence 因為Sequence移出shared pool后可能產(chǎn)生號碼丟失
查找沒有保存在library cache中的大對象
Select * from v$db_object_cache where sharable_mem and
type in ( PACKAGE PROCEDURE FUNCTION PACKAGE BODY ) and kept= NO ;
將這些對象保存在library cache中
Execute dbms_shared_pool keep( package_name );
對應(yīng)腳本 dbmspool sql
)查找是否存在過大的匿名pl/sql代碼塊 兩種解決方案
A.轉(zhuǎn)換成小的匿名塊調(diào)用存儲過程
B.將其保留在shared pool中
查找是否存在過大的匿名pl/sql塊
Select sql_text from v$sqlarea where mand_type= and length(sql_text) ;
)Dictionary cache的優(yōu)化
避免出現(xiàn)Dictionary cache的misses 或者misses的數(shù)量保持穩(wěn)定 只能通過調(diào)整shared_pool_size來間接調(diào)整dictionary cache的大小
Percent misses應(yīng)該很低 大部分應(yīng)該低于 % 合計應(yīng)該低于 %
Select sum(getmisses)/sum(gets) from v$rowcache;
若超過 % 增加shared_pool_size的值
Buffer Cache
)granule大小的設(shè)置 db_cache_size以字節(jié)為單位定義了default buffer pool的大小
如果SGA M granule= M 否則granule= M 即需要調(diào)整sga的時候以granule為單位增加大小 并且sga的大小應(yīng)該是granule的整數(shù)倍
) 根據(jù)v$db_cache_advice調(diào)整buffer cache的大小
SELECT size_for_estimate buffers_for_estimate estd_physical_read_factor estd_physical_reads
FROM v$db_cache_advice WHERE NAME= DEFAULT AND advice_status= ON
AND block_size=(SELECT Value FROM v$parameter WHERE NAME= db_block_size );
estd_physical_read_factor=
) 統(tǒng)計buffer cache的cache hit ratio % 如果低于 % 可以用下列方案解決
◆增加buffer cache的值
◆使用多個buffer pool
◆Cache table
◆為 sorting and parallel reads 建獨立的buffer cache
SELECT NAME value FROM v$sysstat WHERE NAME IN ( session logical reads
physical reads physical reads direct physical reads direct(lob) );
Cache hit ratio= (physical reads physical reads direct physical reads direct (lob))/session logical reads;Select (phy value dir value lob value)/log value from v$sysstat log v$sysstat phy v$sysstat dir v$sysstat LOB where log name= session logical reads and phy name= physical reads and dir name= physical reads direct and lob name= physical reads direct (lob) ;
影響cache hit ratio的因素 全表掃描 應(yīng)用設(shè)計 大表的隨機訪問 cache hits的不均衡分布
)表空間使用自動空間管理 消除了自由空間列表的需求 可以減少數(shù)據(jù)庫的競爭
其他SGA對象
)redo log buffer
對應(yīng)的參數(shù)是log_buffer 缺省值與 OS相關(guān) 一般是 K 檢查v$session_wait中是否存在log buffer wait v$sysstat中是否存在redo buffer allocation retries
A 檢查是否存在log buffer wait
Select * from v$session_wait where event= log buffer wait ;
如果出現(xiàn)等待 一是可以增加log buffer的大小 也可以通過將log 文件移到訪問速度更快的磁盤來解決
B
Select name value from v$sysstat where name in
( redo buffer allocation retries redo entries )
Redo buffer allocation retries接近 小于redo entries 的 % 如果一直在增長 表明進(jìn)程已經(jīng)不得不等待redo buffer的空間 如果Redo buffer allocation retries過大 增加log_buffer的值
C 檢查日志文件上是否存在磁盤IO競爭現(xiàn)象
Select event total_waits time_waited average_wait from v$system_event
where event like log file switch pletion% ;
如果存在競爭 可以考慮將log文件轉(zhuǎn)移到獨立的 更快的存儲設(shè)備上或增大log文件
D 檢查點的設(shè)置是否合理
檢查alert log文件中 是否存在 checkpoint not plete
Select event total_waits time_waited average_wait from v$system_event
where event like log file switch (check% ;
如果存在等待 調(diào)整log_checkpoint_interval log_checkpoint_timeout的設(shè)置
E 檢查log archiver的工作
Select event total_waits time_waited average_wait from v$system_event
where event like log file switch (arch% ;
如果存在等待 檢查保存歸檔日志的存儲設(shè)備是否已滿 增加日志文件組 調(diào)整log_archiver_max_processes
F DB_block_checksum=true 因此增加了性能負(fù)擔(dān) (為了保證數(shù)據(jù)的一致性 oracle的寫數(shù)據(jù)的時候加一個checksum在block上 在讀數(shù)據(jù)的時候?qū)hecksum進(jìn)行驗證)
)java pool
對于大的應(yīng)用 java_pool_size應(yīng)= M 對于一般的java存儲過程 缺省的 M已經(jīng)夠用了
)檢查是否需要調(diào)整DBWn
lishixinzhi/Article/program/Oracle/201311/17744