一、oracle内存结构

内存结构=SGA(系统全局区)+PGA(程序全局区)
(一)、SGA

SGA是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写
设置SGA时,理论上SGA可占OS系统物理内存的1/2——1/3
原则:SGA+PGA+OS使用内存<总物理RAM
SGA=((db_block_buffers*blocksize)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB

1、SGA系统全局区.(包括以下五个区)
A、数据缓冲区:(db_block_buffers)存储由磁盘数据文件读入的数据。
大小: db_block_buffers*db_block_size 
        设置数据缓冲区为:Db_cache_size
        原则:SGA中主要设置对象,一般为可用内存40%。
B、共享池:(shared_pool_size):数据字典,sql缓冲,pl/sql语法分析.加大可提速度。
        则:SGA中主要设置对象,一般为可用内存10%
C、日志缓冲区:(log_buffer)存储数据库的修改信息.
        原则:128K ---- 1M 之间,不应该太大
D 、JAVA池(Java_pool_size)主要用于JAVA语言的开发.
        原则:若不使用java,原则上不能小于20M,给30M通常就够了
E、 大池(Large_pool_size)  如果不设置MTS,主要用于数据库备份恢复管理器RMAN。
        原则:若不使用MTS,5---- 10M 之间,不应该太大
SGA=. db_block_buffers*db_block_size+ shared_pool_size+ log_buffer+Java_pool+size+large_pool_size
      原则: 达到可用内存的55-58%就可以了.

 

(二)、PGA程序全局区
PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收.
A、Sort_area_size 用于排序所占内存
B、Hash_area_size 用于散列联接,位图索引
这两个参数在非MTS下都是属于PGA ,不属于SGA,是为每个session单独分配的,在我们的服务器上除了OS + SGA,一定要考虑这两部分
原则:OS 使用内存+SGA+并发执行进程数*(sort_area_size+hash_ara_size+2M) < 0.7*总内存
实例配置
一:物理内存多大
二:操作系统估计需要使用多少内存
三:数据库是使用文件系统还是裸设备
四:有多少并发连接
五:应用是OLTP 类型还是OLAP 类型
 

 

二、oracle memory_target参数

Oracle9i引入pga_aggregate_target,可以自动对PGA进行调整;
Oracle10引入sga_target,可以自动对SGA进行调整。
Oracle11g则对这两部分进行综合,引入memory_target,可以自动调整所有的内存,这就是新引入的自动内存管理特性。

 

设置memory_target参数后,实际上Oracle会自动设置并调整以下两个参数来分配SGA和PGA的内存,

这和Oracle10g自动设置sga_target后分配db_cache_size和shared_pool_size的机制是一样的
 

(1)MEMORY_TARGET参数对SGA和PGA的影响

Oracle11g 中新增 MEMORY_MAX_TARGET 参数,memory_max_target 是设定 Oracle 能占 OS 多大的内存空间,

一个是 Oracle SGA 区最大能占多大内存空间。

SGA_MAX_SIZE参数是动态分配 Shared Pool Size、Database Buffer Cache、Large Pool、Java Pool、Redo Log Buffer 大小的,

只是根据 Oracle 运行状况来重新分配 SGA 各内存块的大小。 PGA 需要单独设定 .

 

11g MEMORY_MAX_TARGET 参数包含两部分内存,一个 System global area (SGA), 另一个 system global area(PGA)。

很显然在 11g 中可已经将 PGA 和 SGA 一起动态管理了。

下面来看看在11g 中Memory_target 设置和不设置对SGA/PGA 的影响:

 

A :如果 Memory_target 设置为非 0 值

(下面有四种情况来对 SGA 和 PGA 的大小进行分配)

1 : sga_target 和 pga_aggregate_target 已经设置大小

如果 Oracle 中已经设置了参数 sga_target 和 pga_aggregate_target ,则这两个参数将各自被分配为 最小值最为它们的目标值。

Memory_Target =SGA_TARGET+PGA_AGGREGATE_TARGET ,大小和 memory_max_size 一致。

2 : sga_target 设置大小, pga_aggregate_target 没有设置大小

那么 pga_aggregate_target 初始化值 =memory_target-sga_target 

3 : sga_target 没有设置大小, pga_aggregate_target 设置大小

那么 sga_target 初始化值 =memory_target-pga_aggregate_target

4 : sga_target 和 pga_aggregate_target 都没有设置大小 Oracle 11g

中对这种 sga_target 和 pga_aggregate_target 都没有设定大小的情况下, Oracle 将对这两个值没有最小值和默认值。 Oracle 将根据数据库 运行状况进行分配大小。 但在数据库启动是会有一个固定比例来分配:

sga_target =memory_target *60%

pga_aggregate_target=memory_target *40%

 

B :如果 Memory_target 没有设置或 =0 (在 11g 中默认为 0 )

11g中默认为 0 则初始状态下取消了 Memory_target 的作用,完全和 10g 在内存管理上一致,完全向下兼容。

(也有三种情况来对 SGA 和 PGA 的大小进行分配)

1 : SGA_TARGET 设置值,则自动调节 SGA 中的 shared pool,buffer cache,redo log buffer,java pool,larger pool

等内存空间的大小。 PGA 则依赖 pga_aggregate_target 的大小。 sga 和 pga 不能自动增长和自动缩小。

2 : SGA_target 和 PGA_AGGREGATE_TARGET 都没有设置

SGA 中的各组件大小都要明确设定,不能自动调整各组建大小。 PGA 不能自动增长和收缩。

3 : MEMORY_MAX_TARGET 设置 而 MEMORY_TARGET =0 这种情况先和 10g 一样,不做说明

在11g 中可以使用下面看各组件的值

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 1024M

memory_target big integer 1024M

pga_aggregate_target big integer 0

sga_target big integer 0

如果需要监视 Memory_target 的状况则可以使用下面三个动态试图:

V$MEMORY_DYNAMIC_COMPONENTS

V$MEMORY_RESIZE_OPS

v$memory_target_advice

使用下面 Command 来调节大小:

SQL>ALTER SYSTEM SET MEMORY_MAX_TARGET = 1024M SCOPE = SPFILE;

SQL>ALTER SYSTEM SET MEMORY_TARGET = 1024M SCOPE = SPFILE;

SQL>ALTER SYSTEM SET SGA_TARGET =0 SCOPE = SPFILE;

SQL>ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0 SCOPE = SPFILE ;

 

三、Linux上的free命令详解

 

[root@h1 ~]# free
                  total           used           free       shared     buffers                 cached
Mem:        889572     781744     107828          0       8588                    523620
-/+ buffers/cache:     249536     640036
Swap:     1023×××      85576   10154416

 

解释一下Linux上free命令的输出。

   

0

1

2

3

4

5

   

total

used

free

shared

buffers

cached

0

Mem:

889572

781744

107828

0

8588

523620

1

-/+ buffers/cache:

249536

640036

       

2

Swap:

1023×××

85576

10154416

     

下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。

这样可以把free的输出看成一个二维数组FO(Free Output)。

free的输出一共有四行,第四行为交换区的信息,分别是交换的总量(total),使用量(used)和有多少空闲的交换区(free)。

(1)第一行的输出时从操作系统(OS)来看的:

  • 889572KB(缺省时free的单位为KB)物理内存,即FO[0][0];
  • 在这些物理内存中有781744KB(即FO[0][1])被使用了;
  • 还用107828KB(即FO[0][2])是可用的;

    这里得到第一个等式:

  • FO[0][0] = FO[0][1] + FO[0][2]

    FO[0][3]表示被几个进程共享的内存的,现在已经deprecated,其值总是0(当然在一些系统上也可能不是0,主要取决于free命令是怎么实现的)。

    FO[0][4]表示被OS buffer住的内存。FO[0][5]表示被OS cache的内存。在有些时候buffer和cache这两个词经常混用:

  • A buffer is something that has yet to be "written" to disk.
  • A cache is something that has been "read" from the disk and stored for later use.

    也就是说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。

     

    (2)free输出的第二行是从一个应用程序的角度看系统内存的使用情况。

  • 对于FO[1][0],即-buffers/cache,表示一个应用程序认为系统被用掉多少内存;
  • 对于FO[1][1],即+buffers/cache,表示一个应用程序认为系统还有多少内存;

    因为被系统cache和buffer占用的内存可以被快速回收,所以通常FO[1][1]比FO[1][0]会大很多。

    这里还用两个等式:

    FO[1][0] = FO[0][1] - FO[0][4] - FO[0][5]

    FO[1][1] = FO[0][2] +FO[0][4] +FO[0][5]

     

    free命令的所有输出值都是从/proc/meminfo中读出的。

     

    四、linux下/dev/shm tmpfs文件系统

    tmpfs是一种虚拟内存文件系统正如这个定义它最大的特点就是它的存储空间在VM里面。

    VM(virtual memory),VM是由linux内核里面的vm子系统管理的。

    Linux虚拟内存管理机制

    linux下面VM的大小由RM(Real Memory)和swap组成,RM的大小就是物理内存的大小,而Swap的大小是由你自己决定的。Swap是通过硬盘虚拟出来的内存空间,因此它的读写速度相对RM(Real Memory)要慢许多。当一个进程申请一定数量的内存时,如内核的vm子系统发现没有足够的RM时,就会把RM里面的一些不常用的数据交换到Swap里面,如果需要重新使用这些数据再把它们从Swap交换到RM里面。 如果你有足够大的物理内存,根本不需要划分Swap分区。
    通过上面的说明,VM由RM+Swap两部分组成,因此tmpfs最大的存储空间可达(The size of RM + The size of Swap)。 但是对于tmpfs本身而言,它并不知道自己使用的空间是RM还是Swap,这一切都是由内核的vm子系统管理的。

     

    • 默认系统就会加载/dev/shm ,它就是所谓的tmpfs。不同于ramdisk(虚拟磁盘),tmpfs不但可以像虚拟磁盘一样使用您的 RAM,而且可以使用您的交换分区来存储;
    • 传统的虚拟磁盘是个块设备,并需要一个 mkfs 之类的命令才能真正地使用它,tmpfs 是一个文件系统,而不是块设备,您只是安装它,它就可以使用了。

    tmpfs有以下优势:
    1.动态文件系统的大小。

    2.tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。

    3.tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。

     

    通常使用/dev/shm作共享内存(shm_open,shm_unlink)。 /dev/shm是个临时文档系统(tmpfs),能够

    从/etc/fstab中mount。因此,支持标准的参数例如"size",能够用来增加或减少在/dev/shm上的tmpfs大小.(默认的,他的大小是系统RAM的一半

     

    五、oracle11g数据库出现ORA-00845 MEMORY_TARGET not supported on this system 错误

    究其原因就是Linux系统的shm的大小比SGA设置的小造成的,举例来说,SGA设置4G,而shm可能只有1G

    01、调整sga的大小,这个明显不是我们所希望的
    02、调整shm的大小,这样相对简单,具体操作如下
     

     

    修补方法:

    • 修改tmpfs大小至少是系统RAM的一半,至多是RAM+Swap大小
    • 修改tmpfs大小超过SGA_TARGET或tmpfs超过MEMORY_TARGET*0.6
    • SGA_TARGET+PGA_AGGREGATE_TARGET+OS使用内存<总物理RAM
    •  

    例如1:Oracle11g RAM由4G降低为1G,数据库启动报错ORA-00845 MEMORY_TARGET not supported on this system

    ,修改tmpfs使数据库启动

    #------------------1.oracle用户启动数据库错误

    [oracle@h1 ~]$ echo $ORACLE_SID
    bitc
    [oracle@h1 ~]$ sqlplus "/as SYSDBA"

    SQL*Plus: Release 11.2.0.1.0 Production on Thu Jan 3 16:06:15 2013

    Copyright (c) 1982, 2009, Oracle.  All rights reserved.

    Connected to an idle instance.

    SQL> startup
    ORA-00845: MEMORY_TARGET not supported on this system
     

    SQL> exit
    Disconnected

     

    #------------------2.已KB单位查看RAM是889572KB,Swap为1023×××KB

    [root@h1 ~]# free -k
                 total       used       free     shared    buffers     cached
    Mem:        889572     793308      96264          0      15880     524032
    -/+ buffers/cache:     253396     636176
    Swap:     1023×××      84432   10155560


    #------------------3.已KB单位查看tmpfs是

    [root@h1 ~]# df -k /dev/shm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    tmpfs                   961900    638400    323500  67% /dev/shm

     

    #------------------4.修改tmpfs大小(修改tmpfs大小至少是系统RAM的一半,至多是RAM+Swap大小)

    #------------------

    [root@h1 ~]# vi /etc/fstab

    tmpfs                   /dev/shm                tmpfs   defaults,size=5G        0 0

    #--------tmpfs至少是444786KB,至多是11129564KB

    #--------444786/0.6<=MEMORY_TARGET<=11129564/0.6,即724MB<=MEMORY_TARGET<=17G

    #----------修改tmpfs

    tmpfs                   /dev/shm                tmpfs   defaults,size=1G        0 0

     

    #------------------5./etc/fstab生效

    #------------------(1)Kill关于/dev/shm相关进程

    [root@h1 ~]# fuser -km /dev/shm

    #------------------(2)重载 /dev/shm

    [root@h1 ~]# umount /dev/shm
    [root@h1 ~]# mount  /dev/shm
    [root@h1 ~]# df -k /dev/shm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    tmpfs                  1048576         0   1048576   0% /dev/shm

     

    #------------------6.修改数据库实例BITC的初始pfile

    #------------------(修改memory_target大小至少是tmpfs/0.6,小于RAM大小)

    #--------444786/0.6<=MEMORY_TARGET<=11129564/0.6,即724MB<=MEMORY_TARGET<1G

    [oracle@h1 ~]$ cd /app/oracle/product/11.2.0/dbhome_2/dbs
    [oracle@h1 dbs]$ ls
    hc_bitc.dat initbitc.ora lkBITC orapwtest spfileorcl.ora.bak
    hc_DBUA0.dat init.ora lkORCL snapcf_bitc.f spfiletest.ora
    hc_orcl.dat initorcl.ora lkTEST spfilebitc.ora
    hc_test.dat inittest.ora orapwbitc spfileorcl.ora
     

    [oracle@h1 dbs]$ vi initbitc.ora

    memory_target=600000000

    #--------memory_target=572MB<724MB,memory_target处于允许状态

    #--------数据库可以启动

    [oracle@h1 pfile]$ echo $ORACLE_SID
    bitc

    [oracle@h1 dbs]$ sqlplus "/as SYSDBA"

    SQL*Plus: Release 11.2.0.1.0 Production on Thu Jan 3 18:51:50 2013

    Copyright (c) 1982, 2009, Oracle.  All rights reserved.

    Connected to an idle instance.

    SQL> startup
    ORACLE instance started.

    Total System Global Area  501059584 bytes
    Fixed Size                  2214736 bytes
    Variable Size             373294256 bytes
    Database Buffers          121634816 bytes
    Redo Buffers                3915776 bytes
    Database mounted.
    Database opened.
    SQL> exit
    Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

     

     

    例如2:Oracle11g RAM为1G,memory_target由memory_target加大为1G,

    数据库启动报错ORA-00845: MEMORY_TARGET not supported on this system

    #----------------------------解决方法

    1.修改pfile

    2.数据库使用pfile置于mount状态

    3.重建spfile

    4.重启

    [oracle@h1 dbs]$ export ORACLE_SID=test
    [oracle@h1 dbs]$ sqlplus "/as SYSDBA"

    SQL*Plus: Release 11.2.0.1.0 Production on Thu Jan 3 19:10:22 2013

    Copyright (c) 1982, 2009, Oracle.  All rights reserved.

    Connected to an idle instance.

    SQL> startup
    ORACLE instance started.


    Total System Global Area  501059584 bytes
    Fixed Size                  2214736 bytes
    Variable Size             318768304 bytes
    Database Buffers          176160768 bytes
    Redo Buffers                3915776 bytes
    Database mounted.
    Database opened.
    SQL> SQL> show parameter spfile;

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    spfile                               string      /app/oracle/product/11.2.0/dbh
                                                     ome_2/dbs/spfiletest.ora
    #----ORACLE 的spfile在$ORACLE_HOME/dbs/spfile[$ORACLE_SID].ora

    #----ORACLE 的 pfile在$ORACLE_HOME/dbs/init[$ORACLE_SID].ora

    SQL> show parameter memory_max_target

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    memory_max_target                    big integer 480M
    SQL> show parameter memory_target

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    memory_target                        big integer 480M

    SQL> alter system set memory_max_target=1G scope=spfile;

    System altered.

    SQL> alter system set memory_target=1G scope=spfile;

    System altered.

    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORA-00845: MEMORY_TARGET not supported on this system
    SQL>

    #----------------------------问题解决

    #------------------1.查看或修改pfile

    [oracle@h1 dbs]$ cd $ORACLE_HOME/dbs/
    [oracle@h1 dbs]$ ls
    core_10879    hc_orcl.dat   init.ora      lkBITC  orapwbitc      spfilebitc.ora  spfiletest.ora.bak
    hc_bitc.dat   hc_test.dat   initorcl.ora  lkORCL  orapwtest      spfileorcl.ora
    hc_DBUA0.dat  initbitc.ora  inittest.ora  lkTEST  snapcf_bitc.f  spfiletest.ora

    [oracle@h1 dbs]$ cat inittest.ora |grep memory_target
    memory_target=500612736

    #------------------(修改memory_target大小至少是tmpfs/0.6,小于RAM大小)

     

    #------------------2.数据库使用pfile置于mount状态

    [oracle@h1 dbs]$ sqlplus "/as SYSDBA"

    SQL*Plus: Release 11.2.0.1.0 Production on Thu Jan 3 20:09:10 2013

    Copyright (c) 1982, 2009, Oracle.  All rights reserved.

    Connected to an idle instance.

    SQL> startup pfile=$ORACLE_HOME/dbs/inittest.ora mount
    ORACLE instance started.

    Total System Global Area  501059584 bytes
    Fixed Size                  2214736 bytes
    Variable Size             318768304 bytes
    Database Buffers          176160768 bytes
    Redo Buffers                3915776 bytes
    Database mounted.



    #------------------3.重建spfile

    SQL> create spfile from pfile;

    File created.


    #------------------4.重启数据库

    SQL> shutdown immediate;
    ORA-01109: database not open


    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORACLE instance started.

    Total System Global Area  501059584 bytes
    Fixed Size                  2214736 bytes
    Variable Size             318768304 bytes
    Database Buffers          176160768 bytes
    Redo Buffers                3915776 bytes
    Database mounted.
    Database opened.
    SQL>


     

     

    六、Oracle内存参数

    #------------------1.实例名

    SQL> select instance_name from v$instance;

    INSTANCE_NAME
    ----------------
    test

     

    #------------------2.memory_target及memory_max_target

    SQL> show parameter memory_target;

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    memory_target                        big integer 480M
    SQL> show parameter memory_max_target;

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    memory_max_target                    big integer 480M

     

    #------------------3.SGA
    SQL> show sga

    Total System Global Area  501059584 bytes
    Fixed Size                  2214736 bytes
    Variable Size             331351216 bytes
    Database Buffers          163577856 bytes
    Redo Buffers                3915776 bytes
    SQL> select * from v$sga;

    NAME                      VALUE
    -------------------- ----------
    Fixed Size              2214736
    Variable Size         331351216
    Database Buffers      163577856
    Redo Buffers            3915776

    SQL> show parameter sga

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

     

    #------------------4.PGA
    SQL> show parameter pga

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    pga_aggregate_target                 big integer 0
    SQL>