一:Oracle 11g自动内存管理概述
oracle11g中的新的内存管理特性自动化内存管理(automatic memory management)。在该新特性之下SGA与PGA将会根据需要自动的扩展与收缩。你只需要设置两个内存管理相关的参数memory_target与memory_max_target.
1)memory_target:该参数设置整个oracle数据库实例可以使用的内存量,oralce数据库实例在运行过程中会根据需求自动的调节SGA与PGA的大小。可以使用相应的alter system命令动态的修改memory_target的值。该参数是动态初始化参数。
2)memory_max_target:该参数设置oracle实例可以使用的最大内存量。在调整memory_target的值时必须保持以下的约束关系memory_target<=memory_max_target.该参数是静态初始化参数,修改需要重启才能生效。
在创建数据库的时候,你可以通过设置memory_target,memory_max_target初始化参数来开启自动化内存管理特性。在数据库创建以后也可以通过设置memory_target,memory_max_target初始化参数来开启自动化内存管理,但是不会立即生效,需要重启实例。
使用动态内存管理时,SGA_TARGET和PGA_AGGREGATE_TARGET代表它们各自内存区域的最小设置,要让Oracle完全控制内存管理,这两个参数应该设置为0。
关于设置memory_target的值的原则:如果服务器只有数据库,可以分配全部内存的2/3 到 3/4 给oracle的memory_target ;
查看memory_target 以及SGA_TARGET和PGA_AGGREGATE_TARGET的设置的值,需要注意设置的值不会变化的,如下:
SQL> show parameter target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
db_flashback_retention_target integer 1440
fast_start_io_target integer 0
fast_start_mttr_target integer 0
memory_max_target big integer 62848M
memory_target big integer 62848M
parallel_servers_target integer 512
pga_aggregate_target big integer 4G
sga_target big integer 8G
二:如何Oracle运行的某个时刻的各个内存的分配大小呢?
可以通过create pfile from spfile,查看:
[oracle@JoinSpider dbs]$ cat initora11g.ora
ora11g.__db_cache_size=2281701376
ora11g.__java_pool_size=939524096
ora11g.__large_pool_size=805306368
ora11g.__oracle_base='/files/oracle'#ORACLE_BASE set from environment
ora11g.__pga_aggregate_target=57310969856 ##这是当前实际的分配pga的值,
ora11g.__sga_target=5637144576 ##这是当前实际的分配sga的值
ora11g.__shared_io_pool_size=0
ora11g.__shared_pool_size=3758096384
ora11g.__streams_pool_size=0
*.audit_file_dest='/files/oracle/admin/ora11g/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/files/oracle/oradata/ora11g/control01.ctl','/files/oracle/fast_recovery_area/ora11g/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='ora11g'
*.db_recovery_file_dest='/files/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='/files/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ora11gXDB)'
*.memory_max_target=65899345920
*.memory_target=65899345920
*.open_cursors=300
*.pga_aggregate_target=4294967296 ###这是最小值
*.processes=1500
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=8589934592 ###这是最小值
*.undo_retention=3600
*.undo_tablespace='UNDOTBS1'
三:Oracle11g内存管理如何开启:
1:在数据库创建期间设置自动内存管理:如果是手工建库,那么你只需要设置好如下类似初始化参数即可:
memory_target = 1000m
memory_max_target = 1500m
如果是采用DBCA创建数据库,如果是创建新库并且是高级安装,你能选择自动内存管理选项。如果是选择基本安装,那么默认就是自动内存管理。
2:在数据库创建后:你可以在数据库创建后添加memory_max_target和memory_target.虽然memory_target是一个动态参数,但是当数据库运行时,你不能交换到自动内存管理。必须重启数据库将参数应用到实例启动过程才行。
四:Oracle11g内存管理的相关参数设置的含义和原则:
MEMORY_TARGET 设置为非零值时:
1:如果设置了SGA_TARGET 和 PGA_AGGREGATE_TARGET,则会分别将它们当作 SGA大小和 PGA 大小的最小 值。
2:如果设置了 SGA_TARGET 但未设置PGA_AGGREGATE_TARGET,则仍会自动优化这两个参数。PGA_AGGREGATE_TARGET 将初始化为以下值:(MEMORY_TARGET -SGA_TARGET)。
3: 如果设置了 PGA_AGGREGATE_TARGET 但未设置 SGA_TARGET,则仍会自动优化这两个参数。SGA_TARGET 将初始化为值 min(MEMORY_TARGET -PGA_AGGREGATE_TARGET, SGA_MAX_SIZE(如果用户已设置)),系统将自动优化子组件。
4:如果未设置任何参数,则无需最小值或默认值即可自动优化这两个参数。 有这样一个策略:在初始化过程中,将MEMORY_TARGET的按固定比率分配给SGA 和 PGA。具体如下:
sga_target =memory_target *60%
pga_aggregate_target=memory_target *40%
如果未设置 MEMORY_TARGET,或者将其显式设置为 0(11g 中的默认值为 0)则取消了memory_target的作用,完全和10g在内存管理上一致。:
1.如果设置了 SGA_TARGET,则系统仅自动优化 SGA 的子组件大小。PGA 的自动优化与 是否显式设置 PGA 无关。但是,不会自动优化整个SGA (SGA_TARGET) 和 PGA (PGA_AGGREGATE_TARGET),即 SGA 和PGA 不会自动增长或收缩。
2.如果既未设置SGA_TARGET,又未设置 PGA_AGGREGATE_TARGET,则SGA中的各组件大小都要明确设定,不能自动调整各组件大小。PGA不能自动增长和收缩。
3. 如果仅设置了 MEMORY_MAX_TARGET,则使用文本初始化文件进行手动设置时,MEMORY_TARGET 默认为 0。SGA 和 PGA 的自动优化行为默认情况下与 10g R2 中的相同。
4.如果 SGA_MAX_SIZE 不是用户设置的,则在用户设置了 MEMORY_MAX_TARGET 的情况下,系统会在内部将其设置为 MEMORY_MAX_TARGET(与用户是否设置SGA_TARGET 无关)
五:若将一个非自动化内存管理的11g库系统改成自动化内存管理,该如何确认MEMORY_TARGET的值?
1.在一个系统上启用自动内存管理其实很简单,不需要事先做太多的事情,可以使用下面的计算公式来计算MEMORY_TARGET: MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET,"maximum PGA allocated ");
下面的查询语句向你展示有关的信息,以及如何计算出需要的memory_target值:
1.方法一:使用sql查出SGA_TARGET、PGA_AGGREGATE_TARGET以及maximum PGA allocated的值,之后根据公式MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET,"maximum PGA allocated ");算出结果,,注意函数GREATEST是求两个数值中的最大值:
SELECT name, value/1024/1024
FROM v$parameter
WHERE name IN ('pga_aggregate_target', 'sga_target')
UNION
SELECT 'maximum PGA allocated' AS name, TO_CHAR(value)/1024/1024 AS value
FROM v$pgastat
WHERE name = 'maximum PGA allocated';
方法二:直接一个sql查出memory_target的值,单位为mb;
SELECT ( sga.value + GREATEST(pga.value, max_pga.value))/1024/1024 AS memory_target
FROM
(SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = 'sga_target') sga,
(SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = 'pga_aggregate_target') pga,
(SELECT value FROM v$pgastat WHERE name = 'maximum PGA allocated') max_pga;
我认为MEMORY_TARGET应该等于 实际的sga的值加上PGA 最大分配的值,这是最真实的,但是一般就认为MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET,"maximum PGA allocated ")即可
如果想更真实的确定MEMORY_TARGET的大小,那就要确定实例的sga_target的实际使用的大小,当前设置值减去剩余值。然后再利用前边的计算公式
SQL> select (
(select sum(value) from v$sga) -
(select current_size from v$sga_dynamic_free_memory)
)/1024/1024/1024 "sga_target"
from dual;
2.如果此时实例没有设置memory_target或者说memory_target=0,并且把SGA_TARGET设置为0,即表示禁用10g的新特性——自动共享内存(sga)分配,这样我们需要对各个sga内存组件的值进行单独设置,那么这种情况下该怎么确定memory_target的值来开启Oracle11g的自动内存管理呢?
SQL> select value/1024/1024 as value from v$pgastat where name='maximum PGA allocated';
VALUE
----------
45.7822266
可见pga_aggregate_target=46M,确定oracle实例启动以来PGA的最大容量,可以理解为最大的使用量。
SQL> SELECT ((SELECT SUM(value) FROM V$SGA) -
(SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY) ) "SGA_TARGET"
FROM DUAL;
SGA_TARGET
----------
313626624
可见SGA_target的大小为300M,
1)如果马上就修改memory_target=352M会报
值的范围不合法的提示,
SQL> alter system set memory_target=352M;
alter system set memory_target=352M
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least
400M
因为要满足memory_target>=pga_aggregate_target+sga_target.
但是pga_aggregate_target 的值是100M,而SGA_target的值为300M。
352M<300M+100M所有出错了。
2)修改PGA或者sga的值为0M也会报错的。因为还没有设置memory_target的值,
SQL> alter system set pga_aggregate_target=0;
alter system set pga_aggregate_target=0
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00093: pga_aggregate_target must be between 10M and 4096G-1
如果直接修改pga_aggregate_target的值会报上面的错误。因为我们还没有设置momory_target的值,如果直接是设置PGA的大小为0M的话,那就等于不给PGA分配内存了,所有我们通过上面的一个查询,确定自实例启动以来分配给PGA的最大内存大小46M,先把PGA的值调下来。使
memory_target>=pga_aggregate_target+sga_target.即352M>=50M+300M
SQL> alter system set pga_aggregate_target=50M;
System altered.
SQL> alter system set memory_target=352M;
System altered.
SQL> alter system set pga_aggregate_target=0M;
System altered.
这是我们已经启用oracle的内存自动化管理,并且设置SGA_target与pga_aggregate_target参数的值为0。oracle这时就不会为SGA与PGA分配最小内存大小了。oracle会根据工作负载自动的调整SGA与PGA的大小。
六:Oracle 11g设置内存相关参数原则:
1.如果Oracle11g要开启自动内存管理,需要设置MEMORY_TARGET的值,如果该服务器只跑Oracle,那么可以按着下面的原则设置:
MEMORY_TARGET=物理内存 x 80%
MEMORY_MAX_SIZE=物理内存 x 80%
2.如果不打算开启自动内存管理,也就是MEMORY_TARGET=0:
对于OLTP系统:
SGA_TARGET=(物理内存 x 80%) x 80%
SGA_MAX_SIZE=(物理内存 x 80%) x 80%
PGA_AGGREGATE_TARGET=(物理内存 x 80%) x 20%
对于DSS系统:
SGA_TARGET=(物理内存 x 80%) x 50%
SGA_MAX_SIZE=(物理内存 x 80%) x 50%
PGA_AGGREGATE_TARGET=(物理内存 x 80%) x 50%
小结:
然后至于调优的事情,是需要根据你实际生产系统的,具体和业务和环境有关系,没有明确的建议值。sga和pga大小可以根据实际运行一段时间的系统的awr报告和内存推荐建议来调整,如果11g你开启了自动化内存管理,你会发现,当白天大量的并发事务,会导致sga的值增加,而晚上如果进行统计,物化视图刷新等等需要大量order by,group by 等等,就会导致pga增加;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29654823/viewspace-2155539/,如需转载,请注明出处,否则将追究法律责任。