内存图解:

自动管理:11g:AMM   10g:ASMM

SGA(system global area):由所有服务进程和后台进程共享

PGA(program global area): 由每个服务进程和后台进程专有;每个进程都有一个PGA

SQL> show parameter sga;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 4816M
sga_target big integer 4816M

这里我们查看到两个重要参数:sga_max_size、sga_target

  解释:sga_max_size:是9i以来就存在的,不可动态修改,sga_target 是当前分配的最大sga,可动态修改(不能超过sga_max_size),如果在实例启动时sga_max_size<sga_target或sga_max_size没设定,则启动后sga_max_size的值会等于sga_target的值;

  PGA_AGGREGATE_TARGET-此参数用来指定所有session总计可以使用最大PGA内存。这个参数可以被动态的更改,取值范围从10M -- (4096G-1 )bytes。

修改SGA内存大小

SQL> alter system set sga_max_size=xxxM; 或:alter system set sga_max_size=xxxM  scope=spfile; 
SQL> alter system set sga_target=xxxM; 或:alter system set sga_target=xxxM  scope=spfile; 

修改PGA大小

SQL> alter system set pga_aggregate_target = 1M;

System altered.

SQL> show parameter pga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 1M

另外有重要的内存参数:

memory_target,是11g的新特性,在设置了这个参数后,自动内存调整启用:

PGA_AGGREGATE_TARGET-此参数用来指定所有session总计可以使用最大PGA内存。

如何来设置SGA和PGA的大小???

在Oracle11g数据库中,使用自动内存管理特性不再需要设定参数PGA_AGGREGATE_TARGET和SGA_TARGET,因为这两个参数都已经被修改成自动调优的,除非想指定PGA和SGA的最小值才需要设定这两个参数。在Oracle11g数据库中,则需要设置一个叫做MEMORY_TARGET的初始化参数,这个参数是指整个Oracle实例所能使用的内存大小,包括PGA和SGA的整体大小,在MEMORY_TARGET的内存大小之内,PGA和SGA所用的内存可以根据当前负载情况自动相互转换。如果当初始设定的MEMORY_TARGET的内存不够当前数据库使用的时候,Oracle11g还提供了另外一个初始化参数MEMORY_MAX_TARGET,当原始设定的内存不够使用的时候,可以手工来动态 调节MEMORY_TARGET的大小,但是不允许超过MEMORY_MAX_TARGET的值。

查看当前数据库内存设定情况

SQL> show parameter memory

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
memory_max_target big integer 0
memory_target big integer 0
shared_memory_address integer 0

 

固,得到以下结论:

1.memory_max_target及memory_target参数的配置,则会启用全自动内存管理功能

2.memory_target = sga_target + max(pga_aggregate_target+maximum pga allocated)

3.memory_target分配范围必须要在参数memory_max_target之内

4.memory_max_target参数分配原则,一要考虑数据库负载的持续变化发展以及物理内存的空间是否充足

5.sga_target及pga_aggregate_target若配置为0,则全自动内存管理,SGA及PGA组件分配完全由ORACLE根据业务负载分配,没有最小值的限制,若2参数为非0,则SGA及PGA分配不能少于指定的值

6.建议在生产环境采用第5步后者的分配方式,以防内存分配抖动大量出现,引发严重的性能问题

7.数据库启动可以采用SPFILE或者PFILE,二者调整参数稍有不同,一定要注意二者的区别

8.对于RAC数据库,若采用ALTER SYSTEM方式调整开启全自动内存管理方式,且是一个实例一个实例调整,一定要添加选项sid='sid值',否则会报错"调整完当前节点,再调整其它节点 "

配置案例:

  需求oracle11g,想由原来的 SGA、PGA手动管理改为SGA、PGA全自动内存管理,我们来设置memory_max_size和memory_target

  规划:理论上来讲,memory_target=sga_taget + max(pga_aggregate_target + maximum PGA allocated)如果你物理内存充足,可用空间充足,可以把memory_target在上述计算的基础再增大一点

  查询现网参数:

SQL> show parameter sga_target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target big integer 4816M
SQL> show parameter pga NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 1604M
SQL> select value from v$pgastat where name='maximum PGA allocated'; VALUE
----------
SQL> select // mb from dual; MB
----------
401.745117

memory_target=4816+(1604+401)=4816+1604=6420M

接下来计算:memory_max_size:

  此参数配置有几个原则:
        1.此参数控制memory_target可以分配的最大值
        2.分配此参数值一定要考虑业务发展的需要,可以把此参数值在memory_target计算的基础上加大一些,   所以,配置memory_max_target=7000G

  现在全自动内存管理的2个参数的值已经计算完毕,开始在数据库层面进行具体的调整,这里根据是否采用SPFILE或者PFILE,动作稍稍有所区别

  具体配置:

  如果数据库启动用spfile:

修改:
SQL>alter system set memory_max_target=7000m scope=spfile sid='*';
如果是rac环境,必须指定sid
然后重生效:
SQL>shutdown immediate
SQL>startup

  动态调整memory_target及sga_target及pga_aggregate_target几个参数的值

 ---6420m为第4步计算的值

 --- 对于当前操作的RAC数据库实例,一定要添加 sid='',否则会报ORA-: parameter cannot be modified in memory on another instance

startup nomount
alter system set memory_target=6420m ;
alter system set sga_target=;
alter system set pga_aggregate_target=;
alter database mount;
注意:如果你配置sga_target及pga_aggregate_target为0,则完全由ORACLE动态根据数据库负载无限制调整sga及pga的大小(这种方式到时内存分配抖动过大,会引发严重的性能问题);
但是,如果你配置sga_target及pga_aggregate_target为非0值,则为内存动态调整时,其为最小值,即不能少于这个值(建议在生产环境采用这种方式)

问题解决:

在有些场合,如果你使用自动内存管理给实例分配内存,可能会遇到下列错误,比如linux上:

SQL> startup
ORA-: MEMORY_TARGET not supported on this system
这是因为/dev/shm没有设置正确的值,确保这个值至少等于sga_max_size参数值。
[oracle@node1 dbs]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
14G .4G .2G % /
/dev/sda1 99M 14M 81M % /boot
none .0G 702M .4G % /dev/shm

可以看到该值为2G
可以通过/etc/fstab来更改该值:
默认情况下该文件相关内容如下:
[oracle@node1 dbs]$ cat /etc/fstab |grep shm
none                    /dev/shm                tmpfs   defaults       0 0

可以将该值修改为如下:
none                    /dev/shm                tmpfs   defaults,size=2G        0 0
然后重启系统即可解决问题。

oracle基础——内存管理、优化的更多相关文章

  1. 【Oracle】Oracle自动内存管理AMM

    Oracle自动内存管理AMM AMM(Automatic Memory Management)自动内存管理,分配一整块内存区域,Oracle数据库自动分配管理SGA和PGA的内存.具体通过设置两个参 ...

  2. 【OC语法快览】四、基础内存管理

    Basic Memory Management                                                           基础内存管理 If you're w ...

  3. OC基础 内存管理

    OC基础  内存管理 我们所了解的c语言内存管理,如下: (1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char)); (2)c语言的内存释放:free ...

  4. oracle的内存管理(之中的一个)

    [深入解析oracle-eygle]学习笔记 1.内存管理 ORACLE数据库所使用的内存主要涉及到两个方面:PGA和SGA. 1.1 PGA管理 PGA指的是程序全局区(Program Global ...

  5. C# 内存管理优化畅想----前言

    C#语法简洁.优雅,类库丰富,是我最喜爱的计算机语言,没有“之一”.但是,经过深入学习后发现,C#的内存管理,也就是通常所说的垃圾回收(GC)机制,虽然跟其他支持GC的语言相比,已经很优秀了,但与手动 ...

  6. EasyDarwin开源流媒体服务器内存管理优化

    -本文由EasyDarwin开源团队成员Fantasy贡献 前言 最近在linux上跑EasyDarwin发现一个很奇怪的问题,当有RTSPSession连接上来的时候,发现进程的虚拟内存映射一下就多 ...

  7. OC基础--内存管理中的@property关键字以及其参数

    在上一篇博客中整理的内存管理,管理类的代码量会感觉很大,而且如果对象多的话,感觉到代码有点冗余.下面就介绍Xcode中为我们自动生成内存管理代码的关键字@property 例如:在Person这个类中 ...

  8. oc45--多对象内存管理 优化

    // // main.m // Set方法的内存管理 #import <Foundation/Foundation.h> #import "Person.h" #imp ...

  9. ORACLE 11G内存管理方式

    SGA包含的组件: 组件名 说明 参数 buffer cache 存放从数据文件中读取的数据拷贝,所有用户之间是可以共享的 db_cache_size db_keep_cache_size db_re ...

随机推荐

  1. Hybrid设计--离线更新

    首先server端和前端做一个增量发布系统 ,1.就是把一个增量包发布到一个版本的Native上去,让他做更新.2.后台对这个增量包的到达率或者成功的更新做一个统计.这是比较复杂的. 离线更新的机制: ...

  2. MySQL数据类型--与MySQL零距离接触2-8查看数据表

    SHOW COLUMNS FROM tb_name 写入列之后,需要写入行,也就是记录:INSERT 插入记录:INSERT [INTO]  tbl_name  [(col_name,...)]  V ...

  3. Cocos Creator 获得设备分辨率

    var b = cc.director.getWinSizeInPixels() var bx = b.width var by = b.height

  4. 实时计算DStream下求平均值(reduceByKey or combineByKey)

    对NC市的卡口数据进行分析,大概所有卡口每15秒接入的有效数据在3000条左右,现在产品经理要求对这些数据进行拥堵分析,通过两个卡口之间的车辆行驶时长来判断道路的拥堵情况.具体算法不展开.其中我需要做 ...

  5. InstallShield 读注册表函数 RegDBGetKeyValueEx ()执行失败

    注: rtn = RegDBGetKeyValueEx(szKey, szNumName, nvType, svNumValue, nvSize); 调用失败如果这个函数的几个参数没有初始化的值,调用 ...

  6. laravel架构

    1.Laravel 5.1 中的异常处理器和HTTP异常处理实例教程 http://laravelacademy.org/post/1867.html 2.laravel 集成sentry,sentr ...

  7. STL之Vector容器

    1.Vector容器 1)vector是将元素置于一个动态数组中加以管理的容器. 2)vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). 3)vecto ...

  8. maven工程的common模块jar上传至仓库并被其它模块依赖

    .parent pom和common pom 都需要添加 <distributionManagement> <repository> <id>nexus</i ...

  9. python 将文件描述符包装成文件对象

    有一个对应于操作系统上一个已打开的I/O 通道(比如文件.管道.套接字等)的整型文件描述符,你想将它包装成一个更高层的Python 文件对象. 一个文件描述符和一个打开的普通文件是不一样的.文件描述符 ...

  10. Hive 的排名和跨行 窗口函数及其使用

    一.排序&去重分析 row_number() over(partititon by col1 order by col2) as rn 也可以用 row_number() over(distr ...