初始化參數之memory_target
一、引言:
Oracle 9i引入pga_aggregate_target,可以自動對PGA進行調整;
Oracle 10g引入sga_target,可以自動對SGA進行調整;
Oracle 11g則對這兩部分進行綜合,引入memory_target,可以自動調整所有的內存,這就是新引入的自動內存管理特性。
二、本文說明:
操作系統:rhel 5.4 x32
數據庫:oracle 11g r2
三、memory_target的介紹:
3.1、下面通過示例瞭解一下memory_target的設置與PGA和SGA關係:
複製代碼
1 SQL> show parameter memory_target;
2
3 NAME TYPE VALUE
4 ------------------------------------ ----------- ------------------------------
5 memory_target big integer 316M
6 SQL> show sga;
7
8 Total System Global Area 330600448 bytes
9 Fixed Size 1336344 bytes
10 Variable Size 247466984 bytes
11 Database Buffers 75497472 bytes
12 Redo Buffers 6299648 bytes
13 SQL> alter system set memory_target=200m scope=spfile;
14
15 System altered.
16
17 SQL> alter system set sga_target=0 scope=spfile;
18
19 System altered.
20
21 SQL> alter system set pga_aggregate_target=0 scope=spfile;
22
23 System altered.
24
25 SQL> shutdown immediate;
26 Database closed.
27 Database dismounted.
28 ORACLE instance shut down.
29 SQL> startup
30 ORACLE instance started.
31
32 Total System Global Area 209235968 bytes
33 Fixed Size 1335528 bytes
34 Variable Size 201330456 bytes
35 Database Buffers 4194304 bytes
36 Redo Buffers 2375680 bytes
37 Database mounted.
38 Database opened.
複製代碼
設置memory_target參數後,實際上Oracle會自動設置並調整一下兩個參數來分配SGA和PGA的內存,這和Oracle 10g自動設置sga_target後分配db_cache_size和shared_pool_size的機制是一樣的。
複製代碼
1 SQL> col ksppinm for a20;
2 SQL> col ksppstvl for a20;
3 SQL> select a.ksppinm name,b.ksppstvl value
4 2 from x$ksppi a,x$ksppcv b
5 3 where a.indx = b.indx
6 4 and (a.ksppinm like '%sga_target%'
7 5 or a.ksppinm like '%pga_aggregate_target%');
8
9 NAME VALUE
10 ----------------------- -------------------
11 sga_target 0
12 __sga_target 142606336
13 pga_aggregate_target 0
14 __pga_aggregate_target 67108864
複製代碼
3.2、討論一下11g中memory_target設置和不設置對SGA/PGA的影響:
3.2.1、如果memory_target設置爲非0值
(下面有四種情況來對SGA和PGA的大小進行分配)
3.2.1.1、sga_target和pga_aggregate_target已經設置大小
如果Oracle中已經設置了參數sga_target和pga_aggregate_target,則這兩個參數將各自被分配爲最小值爲他們的目標值。
memory_target = sga_target + pga_aggregate_target,大小和memory_max_size一致。
3.2.1.2、sga_target設置大小,pga_aggregate_target沒有設置大小
那麼pga_aggregate_target初始化值=memory_target-sga_target
3.2.1.3、sga_target沒有設置大小,pga_aggregate_target設置大小
那麼sga_target初始化值=memory_target-pga_aggregate_target
3.2.1.4、sga_target和pga_aggregate_target都沒有設置大小
Oracle 11g中對這種sga_target和pag_aggregate_target都沒有設定大小的情況下,Oracle將對這兩個值沒有最小值和默認值。Oracle將根據數據庫運行狀況進行分配大小。但在數據庫啓動是會有一個固定比例來分配:
sga_target = memory_target*60%
pga_aggregate_target = memory_target*40%
3.2.2、如果memory_target沒有設置或 = 0(在11g中默認爲0)
11g中默認爲0則初始狀態下取消了memory_target的作用,完全和10g在內存管理上一致,完全向下兼容。(也有三種情況來對SGA和PGA的大小進行分配)
3.2.2.1、sga_target設置值,則自動調節SGA中的shared pool,buffer cache,redo log buffer,java pool,larger pool等內存空間的大小。PGA則依賴pga_aggregate_target的大小。sga和pga不能自動增長和自動縮小。
3.2.2.2、sga_target和pga_aggregate_target都沒有設置
SGA中的各組件大小都要明確設定,不能自動調整各組件大小。PGA不能自動增長和收縮。
3.2.2.3、memory_max_target設置而memory_target = 0這種情況先和10g一樣,不做說明。
三、ORA-00845
最後談一下ORA-00845的由來和解決方案:
如果memory_max_target/memory_target設置過大,可能導致instance無法啓動,報ORA-00845錯誤。
複製代碼
1 [oracle@yft bin]$ oerr ora 00845
2 00845, 00000, "MEMORY_TARGET not supported on this system"
3 // *Cause: The MEMORY_TARGET parameter was not supported on this operating system or /dev/shm was not sized
4 // *Action: Refer to documentation for a list of supported operating systems. Or, size /dev/shm to be at leacle instance running on the system.
5
6 SQL> alter system set memory_max_target=400m scope=spfile;
7
8 System altered.
9
10 SQL> shutdown immediate;
11 Database closed.
12 Database dismounted.
13 ORACLE instance shut down.
14 SQL> startup
15 ORA-00845: MEMORY_TARGET not supported on this system
複製代碼
這個錯誤有點誤導,實際上這並不是說該平臺版本上不支持AMM特性,只是設置的memory_max_target超過了系統中設置的share memory(/dev/shm)而已。
[oracle@yft bin]$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 395M 0 395M 0% /dev/shm
在Oracle 11g for linux中似乎是用了一種新的機制來管理共享內存段,而不是傳統的sys /dev/shm了。在alert.ora中可以找到更準確的錯誤描述:
1 Mon Feb 25 12:13:21 2013
2 Starting ORACLE instance (normal)
3 WARNING: You are trying to use the MEMORY_TARGET feature. This feature requires the /dev/shm file system to be mounted for at least 419430400 bytes. /dev/shm is either not mounted or is mounted with available space less than this size. Please fix this so that MEMORY_TARGET can work as expected. Current available is 413466624 and used is 0 bytes. Ensure that the mount point is /dev/shm for this directory.
4 memory_target needs larger /dev/shm
解決的辦法之一是增加tmpfs文件系統的容量:
修改/etc/fstab中tmpfs對應的行;將原來的tmpfs /dev/shm tmpfs defaults 0 0 改成tmpfs /dev/shm tmpfs default,size=1024M 0 0,這樣tmpfs增大爲1G,重新mount /dev/shm使之生效。
複製代碼
1 [root@yft ~]# vi /etc/fstab
2 tmpfs /dev/shm tmpfs defaults,size=420m 0 0
3
4 [root@yft ~]# mount -o remount /dev/shm
5 [root@yft ~]# df -h
6 Filesystem Size Used Avail Use% Mounted on
7 tmpfs 420M 0 420M 0% /dev/shm
8
9 SQL> startup
10 ORACLE instance started.
11
12 Total System Global Area 418484224 bytes
13 Fixed Size 1336932 bytes
14 Variable Size 406849948 bytes
15 Database Buffers 4194304 bytes
16 Redo Buffers 6103040 bytes
17 Database mounted.
18 Database opened.
複製代碼
分類: Performance Tuning I
初始化參數之memory_target
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
linux 內核參數優化
Aslfe
2019-02-23 13:05:53
linux find命令
yuanchunxu
2019-02-23 00:32:41
BREW/BREWMP手機硬件參數差異性淺析
曹洪偉
2019-02-23 00:26:49
FAT32文件系統一此關鍵參數
ribut9225
2019-02-23 00:19:23
C++的重載 缺省參數和命名空間
龍躍十二
2019-02-23 00:03:56
一個關於filter-policy的參數
我非***
2019-02-22 23:46:03
Linux RPM 命令參數使用詳解
achuan
2019-02-22 23:41:53
MySQL登錄數據庫 h參數
lxc2002
2019-02-22 23:35:06
java 可變長度參數
小不點z
2019-02-22 23:12:39
rsync的參數files-from用法及注意事項
ydw1118
2019-02-22 23:03:12
看看ORACLE的系統參數,還有一點沒弄好
ayvatan
2019-02-22 22:55:25
linux crontab 詳解及特殊用法
horizon49
2019-02-22 22:36:44
js傳遞參數給函數 參數的改變問題
yxls123123
2019-02-22 22:22:09
nginx配置文件詳解
lymrg
2019-02-22 22:17:43