這篇文章給大家分享的是有關(guān)怎么配置oracle數(shù)據(jù)庫服務(wù)器的內(nèi)存的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)長期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為薩爾圖企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都做網(wǎng)站,薩爾圖網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
SGA:是用于存儲數(shù)據(jù)庫信息的內(nèi)存區(qū),該信息為數(shù)據(jù)庫進(jìn)程所共享。它包含Oracle 服務(wù)器的數(shù)據(jù)和控制信息,它是在Oracle服務(wù)器所駐留的計算機(jī)的實(shí)際內(nèi)存中得以分配,如果實(shí)際內(nèi)存不夠再往虛擬內(nèi)存中寫。
PGA:是一塊包含一個服務(wù)進(jìn)程的數(shù)據(jù)和控制信息的內(nèi)存區(qū)域。它是Oracle在一個服務(wù)進(jìn)程啟動時創(chuàng)建的,是非共享的。一個Oracle進(jìn)程擁有一個PGA內(nèi)存區(qū)。一個PGA也只能被擁有它的那個服務(wù)進(jìn)程所訪問,只有這個進(jìn)程中的Oracle代碼才能讀寫它。因此,PGA中的結(jié)構(gòu)是不需要Latch保護(hù)的。
我們重點(diǎn)就是設(shè)置SGA,理論上SGA可占OS系統(tǒng)物理內(nèi)存的1/2——1/3
ORACLE給的建議是: OLTP系統(tǒng) PGA=(Total Memory)*80%*20%。DSS系統(tǒng)PGA=(Total Memory)*80%*50%。
ORACLE建議一個數(shù)據(jù)庫服務(wù)器,分80%的內(nèi)存給數(shù)據(jù)庫,20%的內(nèi)存給操作系統(tǒng),那怎么給一個數(shù)據(jù)庫服務(wù)器配內(nèi)存呢?
SQL> select * from v$pgastat;
NAME VALUE UNIT
---------------------------------------------------------------- ---------- ------------
aggregate PGA target parameter 104857600 bytes
-----這個值等于參數(shù)PGA_AGGREGATE_TARGET的值,如果此值為0,表示禁用了PGA自動管理。
aggregate PGA auto target 75220992 bytes
-----表示PGA還能提供多少內(nèi)存給自動運(yùn)行模式,通常這個值接近pga_aggregate_target-total pga inuse.
global memory bound 20971520 bytes
-----工作區(qū)執(zhí)行的最大值,如果這個值小于1M,馬上增加PGA大小
total PGA inuse 30167040 bytes
-----當(dāng)前分配PGA的總大小,這個值有可能大于PGA,如果PGA設(shè)置太小.這個值接近select sum(pga_used_mem) from v$process.
total PGA allocated 52124672 bytes
-----工作區(qū)花費(fèi)的總大小
maximum PGA allocated 67066880 bytes
total freeable PGA memory 0 bytes --沒有了空閑的PGA
process count 23 --當(dāng)前有23個process
max processes count 25
PGA memory freed back to OS 0 bytes
total PGA used for auto workareas 8891392 bytes
maximum PGA used for auto workareas 22263808 bytes
total PGA used for manual workareas 0 bytes --為0自動管理
maximum PGA used for manual workareas 0 bytes --為0自動管理
over allocation count 0
如果PGA設(shè)置太小,導(dǎo)致PGA有時大于PGA_AGGREGATE_TARGET的值,此處為0,說明PGA沒有擴(kuò)展大于TARGET的值,如果此值出現(xiàn)過,那么增加PGA大小。
bytes processed 124434432 bytes
extra bytes read/written 0 bytes
cache hit percentage 100 percent ---命中率為100%,如果太小增加PGA
recompute count (total) 6651
19 rows selected
SQL> select max(pga_used_mem)/1024/1024 M from v$process; ----當(dāng)前一個process消耗最大的內(nèi)存
M
----------
9.12815189
SQL> select min(pga_used_mem)/1024/1024 M from v$process where pga_used_mem>0; ---process消耗最少內(nèi)存
M
----------
0.19186878
SQL> select max(pga_used_mem)/1024/1024 M from v$process ; ----process曾經(jīng)消耗的最大內(nèi)存
M
----------
9.12815189
SQL> select sum(pga_used_mem)/1024/1024 from v$process; ----當(dāng)前process一共消耗的PGA
SUM(PGA_USED_MEM)/1024/1024
---------------------------
28.8192501068115
如何設(shè)置PGA呢?我們可以在壓力測試階段,模擬一下系統(tǒng)的運(yùn)行,然后運(yùn)行
select (select sum(pga_used_mem)/1024/1024 from v$process) /(select count(*) from v$process) from dual;得到一個process大約占用了多少的內(nèi)存,然后估算系統(tǒng)一共會有多少連接,比如一共有500個連接,
那么Sessions=1.1*process +5=500,那么processes=450,再乘以一個process需要消耗的內(nèi)存,就能大約估算出PGA需要設(shè)置多大。
最好將PGA設(shè)置的值比計算出的值大一點(diǎn),PGA值設(shè)定好后,就可以根據(jù)系統(tǒng)的性質(zhì),如果系統(tǒng)為OLTOP,那么總的內(nèi)存可以設(shè)置為PGA/0.16,最后也能估算出SGA的大小,建議還是多配點(diǎn)內(nèi)存,反正便宜。
下面摘抄eygle的關(guān)于一個process能夠分配的最大內(nèi)存(串行操作)的規(guī)則:
10gR1之前,對于串行操作(非并行)一個process能夠分配的最大的內(nèi)存為min(5%pga_aggregate_target,100m)
10gR2之后,對于串行操作(非并行)一個process能夠分配的最大內(nèi)存有如下規(guī)則:
如果pga_aggregate_target<=500m,那么最大的內(nèi)存為20%*pga_aggregate_target.
如果500m
如果1000m如果pga_aggregate_target>2.5G,那么最大內(nèi)存為2.5G.
SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
2 FROM SYS.x$ksppi x, SYS.x$ksppcv y
3 WHERE x.inst_id = USERENV ('Instance')
4 AND y.inst_id = USERENV ('Instance')
5 AND x.indx = y.indx
6 AND x.ksppinm LIKE '%&par%'
7 /
NAME VALUE DESCRIB
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
_smm_max_size 20480 maximum work area size in auto mode (serial)
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 100M
此處我的一個process能夠分配的最大內(nèi)存為20M,因?yàn)槲业腜GA=100M,符合上面的規(guī)則。
隱含參數(shù)_smm_max_size表示一個process能夠分配最大的memory.
買了piner的《oracle高可用環(huán)境》一書,正好趁這段時間學(xué)習(xí)一下。
把看到的東西總結(jié)一下發(fā)表于此,今天先發(fā)第一章關(guān)于SGA與PGA的內(nèi)容。
以后會陸續(xù)將總結(jié)在此發(fā)表,與大家共享。
SGA與PGA的結(jié)構(gòu)如下圖:
SGA:
查看SGA:
Sqlp> show sga
或 select * from v$sga;
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 176161448 bytes
Database Buffers 109051904 bytes
Redo Buffers 2945024 bytes
Fixed Size:包括了數(shù)據(jù)庫與實(shí)例的控制信息、狀態(tài)信息、字典信息等,啟動時就被固定在SGA中,不會改變。
Variable Size:包括了shard pool、large pool、java pool、stream pool、游標(biāo)區(qū)和其他結(jié)構(gòu)
Database Buffers:數(shù)據(jù)庫中數(shù)據(jù)塊緩沖的地方,是SGA中最大的地方,決定數(shù)據(jù)庫性能
Redo Buffers:提供REDO緩沖的地方,在OLAP中不需要太大
V$sgastat記錄了SGA的一些統(tǒng)計信息
V$sga_dynamic_components保存SGA中可以手動調(diào)整的區(qū)域的一些調(diào)整記錄
Shard pool:
Shard_pool_size決定其大小,10g以后自動管理
Shard_pool中數(shù)據(jù)字典和控制區(qū)結(jié)構(gòu)用戶無法直接控制,與用戶有關(guān)的只有sql緩沖區(qū)(library cache)。
將經(jīng)常訪問的過程或包用DBMS_SHARED_POOL.KEEP存儲過程將該包pin在共享池中。
手工清除共享池的內(nèi)容:alter system flush shard_pool;
共享池相關(guān)的幾個常用的視圖:
V$sqlarea 記錄了所有sql的統(tǒng)計信息,包括執(zhí)行次數(shù)、物理讀、邏輯讀、耗費(fèi)時間等
V$sqltext_with_newline 完全顯示sql語句,通過hash_value來標(biāo)示語句,piece排序
V$sql_plan保存了sql的執(zhí)行計劃,通過工具查看
V$shared_pool_advice對共享池的預(yù)測,可以做調(diào)整SGA的參考
Data buffer:
在OLTP系統(tǒng)中要求data buffer 的命中率在95%以上
select sum(pins) "execution",sum(pinhits) "hits",
((sum(pinhits)/sum(pins))*100) "pinhitration",
sum(reloads) "misses",((sum(pins)/(sum(pins)
+sum(reloads)))*100) "relhitratio"
from V$librarycache
PINS NUMBER Number of times a PIN was requested for objects of this namespace
PINHITS NUMBER Number of times all of the metadata pieces of the library object were found in memory
RELOADS NUMBER Any PIN of an object that is not the first PIN performed since the object handle was created, and which requires loading the object from disk
Oracle把從data buffer中獲得的數(shù)據(jù)庫叫cache hit,把從磁盤獲得的腳cache miss
數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)塊通過臟列表(dirty list)和LRU列表(LRU list)來管理。
Data buffer可細(xì)分為:default pool、keep pool、recycle pool對應(yīng)的參數(shù)為db_cache_size、 db_keep_cache_size 、db_recycle_size分別表示緩沖區(qū)大小
從9i開始o(jì)racle支持不同塊大小的表空間,相應(yīng)的可以為不同塊大小的表空間指定不同塊大小的數(shù)據(jù)緩沖區(qū),不同塊大小的數(shù)據(jù)緩沖區(qū)可以用相應(yīng)的db_nk_cache_size來指定,其中n可以是2、4、6、16或32
V$db_cache_advice 對數(shù)據(jù)緩沖區(qū)的預(yù)測,可以做調(diào)整data buffer的參考
V$bh、x$bh記錄了數(shù)據(jù)塊在data buffer中緩沖的情況,通過這個視圖可以找系統(tǒng)中的熱點(diǎn)塊。通過下面語句找系統(tǒng)中top 10 熱點(diǎn)快所在的熱點(diǎn)對象:
Select /*+ rule*/ owner,object_name from dba_objects
Where data_object_id in
(select obj from
(select obj from x$bh order by tch desc)
Where rownum<11);
PGA:
用來保存于用戶進(jìn)程相關(guān)的內(nèi)存段。
從9i開始使用PGA自動管理,pga_aggregate_target參數(shù)指定session一共使用的最大PGA內(nèi)存的上限。Workarea_size_policy參數(shù)用于開關(guān)PGA內(nèi)存自動管理功能,auto/manual
在OLTP環(huán)境中,自動PGA管理只要設(shè)置到一定的值,如2G左右就能滿足系統(tǒng)的要求。
自動內(nèi)存管理:
從9i開始,sga_max_size參數(shù)設(shè)置SGA的內(nèi)存大小,不能動態(tài)修改
從10g開始,指定了sga_target參數(shù)后,所有的SGA組件如:shared pool、 data buffer、 large pool都不用手工指定了,Oracle會自動管理。這一特性就是自動共享內(nèi)存管理ASMM。如果設(shè)置了sga_target=0,就自動關(guān)閉自動共享內(nèi)存管理功能。Sga_target大小不能超過sga_max_size的大小。
手動管理SGA:
Alter system set sga_target=2000m;
Alter system set db_cache_size=1000m;
Alter system set shared_pool=200m;
Alter system set sga_target=0---------關(guān)閉自動共享內(nèi)存管理ASMM
11G以后sga+pga整個內(nèi)存可以自動管理AMM,相關(guān)參數(shù)memory_max_target memory_target.設(shè)置好這兩個參數(shù)后就不用關(guān)心SGA和PGA了
11g手動內(nèi)存管理:
Alter system set memory_target=3000m;
Alter system set sga_target=2000m;
Alter system set pga_aggregate_target=1000m;
Alter system set memory_target=0;---------關(guān)閉自動內(nèi)存管理AMM
SGA+PGA最好不要超過總內(nèi)存的70%
補(bǔ)充:總原則:OS 使用內(nèi)存+SGA+并發(fā)執(zhí)行進(jìn)程數(shù)*(sort_area_size+hash_ara_size+2M) < 0.7*總內(nèi)存
簡單說就是:SGA+PGA+OS使用內(nèi)存<總物理RAM
關(guān)于SGA、PGA與系統(tǒng)內(nèi)存三者間的關(guān)聯(lián),目前有一個相對通用的計算規(guī)則可供參考:
對于OLTP數(shù)據(jù)庫,SGA=系統(tǒng)內(nèi)存*70%*80%,PGA=SGA*(10%~20%)。SGA=系統(tǒng)內(nèi)存*0.56 PGA=系統(tǒng)內(nèi)存*(0.05~0.1)
對于OLAP數(shù)據(jù)庫,SGA=系統(tǒng)內(nèi)存*80%*60%,PGA=SGA*(45%~65%)。SGA=系統(tǒng)內(nèi)存*0.48 PGA=系統(tǒng)內(nèi)存*(0.22~0.31)
(對于32bit平臺,默認(rèn)情況下SGA最大可用內(nèi)存有1.7GB的限制)
實(shí)例配置時需要考慮的因素
一:物理內(nèi)存多大
二:操作系統(tǒng)估計需要使用多少內(nèi)存
三:數(shù)據(jù)庫是使用文件系統(tǒng)還是裸設(shè)備
四:有多少并發(fā)連接
五:應(yīng)用是OLTP 類型還是OLAP 類型
感謝各位的閱讀!關(guān)于“怎么配置oracle數(shù)據(jù)庫服務(wù)器的內(nèi)存”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!