如何配置oracle資料庫伺服器的記憶體
SGA:是用於儲存資料庫資訊的記憶體區,該資訊為資料庫程式所共享。它包含Oracle 伺服器的資料和控制資訊,它是在Oracle伺服器所駐留的計算機的實際記憶體中得以分配,如果實際記憶體不夠再往虛擬記憶體中寫。
PGA:是一塊包含一個服務程式的資料和控制資訊的記憶體區域。它是Oracle在一個服務程式啟動時建立的,是非共享的。一個Oracle程式擁有一個PGA記憶體區。一個PGA也只能被擁有它的那個服務程式所訪問,只有這個程式中的Oracle程式碼才能讀寫它。因此,PGA中的結構是不需要Latch保護的。
我們重點就是設定SGA,理論上SGA可佔OS系統實體記憶體的1/2——1/3
ORACLE給的建議是: OLTP系統 PGA=(Total Memory)*80%*20%。DSS系統PGA=(Total Memory)*80%*50%。
ORACLE建議一個資料庫伺服器,分80%的記憶體給資料庫,20%的記憶體給作業系統,那怎麼給一個資料庫伺服器配記憶體呢?
SQL> select * from v$pgastat;
NAME VALUE UNIT
---------------------------------------------------------------- ---------- ------------
aggregate PGA target parameter 104857600 bytes
-----這個值等於引數PGA_AGGREGATE_TARGET的值,如果此值為0,表示禁用了PGA自動管理。
aggregate PGA auto target 75220992 bytes
-----表示PGA還能提供多少記憶體給自動執行模式,通常這個值接近pga_aggregate_target-total pga inuse.
global memory bound 20971520 bytes
-----工作區執行的最大值,如果這個值小於1M,馬上增加PGA大小
total PGA inuse 30167040 bytes
-----當前分配PGA的總大小,這個值有可能大於PGA,如果PGA設定太小.這個值接近select sum(pga_used_mem) from v$process.
total PGA allocated 52124672 bytes
-----工作區花費的總大小
maximum PGA allocated 67066880 bytes
total freeable PGA memory 0 bytes --沒有了空閒的PGA
process count 23 --當前有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設定太小,導致PGA有時大於PGA_AGGREGATE_TARGET的值,此處為0,說明PGA沒有擴充套件大於TARGET的值,如果此值出現過,那麼增加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; ----當前一個process消耗最大的記憶體
M
----------
9.12815189
SQL> select min(pga_used_mem)/1024/1024 M from v$process where pga_used_mem>0; ---process消耗最少記憶體
M
----------
0.19186878
SQL> select max(pga_used_mem)/1024/1024 M from v$process ; ----process曾經消耗的最大記憶體
M
----------
9.12815189
SQL> select sum(pga_used_mem)/1024/1024 from v$process; ----當前process一共消耗的PGA
SUM(PGA_USED_MEM)/1024/1024
---------------------------
28.8192501068115
如何設定PGA呢?我們可以在壓力測試階段,模擬一下系統的執行,然後執行
select (select sum(pga_used_mem)/1024/1024 from v$process) /(select count(*) from v$process) from dual;得到一個process大約佔用了多少的記憶體,然後估算系統一共會有多少連線,比如一共有500個連線,
那麼Sessions=1.1*process +5=500,那麼processes=450,再乘以一個process需要消耗的記憶體,就能大約估算出PGA需要設定多大。
最好將PGA設定的值比計算出的值大一點,PGA值設定好後,就可以根據系統的性質,如果系統為OLTOP,那麼總的記憶體可以設定為PGA/0.16,最後也能估算出SGA的大小,建議還是多配點記憶體,反正便宜。
下面摘抄eygle的關於一個process能夠分配的最大記憶體(序列操作)的規則:
10gR1之前,對於序列操作(非並行)一個process能夠分配的最大的記憶體為min(5%pga_aggregate_target,100m)
10gR2之後,對於序列操作(非並行)一個process能夠分配的最大記憶體有如下規則:
如果pga_aggregate_target<=500m,那麼最大的記憶體為20%*pga_aggregate_target.
如果500m
如果1000m如果pga_aggregate_target>2.5G,那麼最大記憶體為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能夠分配的最大記憶體為20M,因為我的PGA=100M,符合上面的規則。
隱含引數_smm_max_size表示一個process能夠分配最大的memory.
買了piner的《oracle高可用環境》一書,正好趁這段時間學習一下。
把看到的東西總結一下發表於此,今天先發第一章關於SGA與PGA的內容。
以後會陸續將總結在此發表,與大家共享。
SGA與PGA的結構如下圖:
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:包括了資料庫與例項的控制資訊、狀態資訊、字典資訊等,啟動時就被固定在SGA中,不會改變。
Variable Size:包括了shard pool、large pool、java pool、stream pool、遊標區和其他結構
Database Buffers:資料庫中資料塊緩衝的地方,是SGA中最大的地方,決定資料庫效能
Redo Buffers:提供REDO緩衝的地方,在OLAP中不需要太大
V$sgastat記錄了SGA的一些統計資訊
V$sga_dynamic_components儲存SGA中可以手動調整的區域的一些調整記錄
Shard pool:
Shard_pool_size決定其大小,10g以後自動管理
Shard_pool中資料字典和控制區結構使用者無法直接控制,與使用者有關的只有sql緩衝區(library cache)。
將經常訪問的過程或包用DBMS_SHARED_POOL.KEEP儲存過程將該包pin在共享池中。
手工清除共享池的內容:alter system flush shard_pool;
共享池相關的幾個常用的檢視:
V$sqlarea 記錄了所有sql的統計資訊,包括執行次數、物理讀、邏輯讀、耗費時間等
V$sqltext_with_newline 完全顯示sql語句,通過hash_value來標示語句,piece排序
V$sql_plan儲存了sql的執行計劃,通過工具檢視
V$shared_pool_advice對共享池的預測,可以做調整SGA的參考
Data buffer:
在OLTP系統中要求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中獲得的資料庫叫cache hit,把從磁碟獲得的腳cache miss
資料緩衝區中的資料塊通過髒列表(dirty list)和LRU列表(LRU list)來管理。
Data buffer可細分為:default pool、keep pool、recycle pool對應的引數為db_cache_size、 db_keep_cache_size 、db_recycle_size分別表示緩衝區大小
從9i開始oracle支援不同塊大小的表空間,相應的可以為不同塊大小的表空間指定不同塊大小的資料緩衝區,不同塊大小的資料緩衝區可以用相應的db_nk_cache_size來指定,其中n可以是2、4、6、16或32
V$db_cache_advice 對資料緩衝區的預測,可以做調整data buffer的參考
V$bh、x$bh記錄了資料塊在data buffer中緩衝的情況,通過這個檢視可以找系統中的熱點塊。通過下面語句找系統中top 10 熱點快所在的熱點物件:
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:
用來儲存於使用者程式相關的記憶體段。
從9i開始使用PGA自動管理,pga_aggregate_target引數指定session一共使用的最大PGA記憶體的上限。Workarea_size_policy引數用於開關PGA記憶體自動管理功能,auto/manual
在OLTP環境中,自動PGA管理只要設定到一定的值,如2G左右就能滿足系統的要求。
自動記憶體管理:
從9i開始,sga_max_size引數設定SGA的記憶體大小,不能動態修改
從10g開始,指定了sga_target引數後,所有的SGA元件如:shared pool、 data buffer、 large pool都不用手工指定了,Oracle會自動管理。這一特性就是自動共享記憶體管理ASMM。如果設定了sga_target=0,就自動關閉自動共享記憶體管理功能。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---------關閉自動共享記憶體管理ASMM
11G以後sga+pga整個記憶體可以自動管理AMM,相關引數memory_max_target memory_target.設定好這兩個引數後就不用關心SGA和PGA了
11g手動記憶體管理:
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;---------關閉自動記憶體管理AMM
SGA+PGA最好不要超過總記憶體的70%
補充:總原則:OS 使用記憶體+SGA+併發執行程式數*(sort_area_size+hash_ara_size+2M) < 0.7*總記憶體
簡單說就是:SGA+PGA+OS使用記憶體<總物理RAM
關於SGA、PGA與系統記憶體三者間的關聯,目前有一個相對通用的計算規則可供參考:
對於OLTP資料庫,SGA=系統記憶體*70%*80%,PGA=SGA*(10%~20%)。SGA=系統記憶體*0.56 PGA=系統記憶體*(0.05~0.1)
對於OLAP資料庫,SGA=系統記憶體*80%*60%,PGA=SGA*(45%~65%)。SGA=系統記憶體*0.48 PGA=系統記憶體*(0.22~0.31)
(對於32bit平臺,預設情況下SGA最大可用記憶體有1.7GB的限制)
例項配置時需要考慮的因素
一:實體記憶體多大
二:作業系統估計需要使用多少記憶體
三:資料庫是使用檔案系統還是裸裝置
四:有多少併發連線
五:應用是OLTP 型別還是OLAP 型別
相關文章
- 【大頁記憶體】Oracle資料庫配置大頁記憶體記憶體Oracle資料庫
- Oracle - 資料庫的記憶體結構Oracle資料庫記憶體
- Oracle - 資料庫的記憶體調整Oracle資料庫記憶體
- 記憶體資料庫如何發揮記憶體優勢?記憶體資料庫
- 記憶體資料庫記憶體資料庫
- oracle資料庫記憶體分配(sga和pga)Oracle資料庫記憶體
- AIX 下oracle 資料庫記憶體優化AIOracle資料庫記憶體優化
- 如何驗證/啟用記憶體資料庫配置? (文件 ID 2178918.1)記憶體資料庫
- Mongodb記憶體資料庫MongoDB記憶體資料庫
- 將altibase記憶體庫的表匯出到oracle資料庫記憶體Oracle資料庫
- 從Oracle資料庫故障到AIX記憶體管理Oracle資料庫AI記憶體
- Oracle資料庫記憶體監控及意義Oracle資料庫記憶體
- 【記憶體資料庫】TimesTen記憶體資料庫
- Oracle資料庫高效能秘密之資料快取記憶體Oracle資料庫快取記憶體
- Oracle 之 配置HugePages記憶體Oracle記憶體
- 合理配置TimesTen記憶體資料庫Hash索引的PAGES引數記憶體資料庫索引
- 使用記憶體資料庫可以最佳化伺服器效能記憶體資料庫伺服器
- Oracle PGA記憶體的配置和使用Oracle記憶體
- Python記憶體資料庫/引擎Python記憶體資料庫
- 構建個人記憶體資料庫記憶體資料庫
- Oracle資料庫高效能祕密之資料快取記憶體Oracle資料庫快取記憶體
- 如何檢視MySQL資料庫佔多大記憶體,佔用太多記憶體怎麼辦?MySql資料庫記憶體
- 磁碟資料庫與記憶體資料庫的特點比較資料庫記憶體
- Aerospike 分散式記憶體資料庫 筆記ROS分散式記憶體資料庫筆記
- 什麼是伺服器記憶體?如何選擇伺服器記憶體?伺服器記憶體
- 成為MySQL DBA後,再看ORACLE資料庫(五、記憶體管理)MySqlOracle資料庫記憶體
- 瀚高資料庫記憶體結構資料庫記憶體
- 記憶體資料庫發展歷程記憶體資料庫
- 記憶體資料庫快取介紹記憶體資料庫快取
- 主要測試記憶體和資料庫記憶體資料庫
- 記憶體資料庫TimesTen介紹記憶體資料庫
- Oracle資料庫記憶體引數調優技術的個人總結Oracle資料庫記憶體
- JVM虛擬機器和Oracle資料庫記憶體管理的學習JVM虛擬機Oracle資料庫記憶體
- 解讀SQL 記憶體資料庫的細節SQL記憶體資料庫
- 資料庫伺服器記憶體資源消耗100%問題處理案例資料庫伺服器記憶體
- Oracle資料庫配置Oracle資料庫
- Oracle資料庫記憶體引數調優技術的個人總結 (2)Oracle資料庫記憶體
- Oracle資料庫記憶體引數調優技術的個人總結 (1)Oracle資料庫記憶體