设为首页 收藏本站
查看: 607|回复: 0

[经验分享] oracle服务器内存设置

[复制链接]

尚未签到

发表于 2018-9-23 13:36:46 | 显示全部楼层 |阅读模式
  一、oracle内存结构
  内存结构=SGA(系统全局区)+PGA(程序全局区)
  (一)、SGA
  SGA是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写
  设置SGA时,理论上SGA可占OS系统物理内存的1/2——1/3
  原则:SGA+PGA+OS使用内存  只是根据 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:     10239992      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:
  10239992
  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>

    • 默认系统就会加载/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使用内存  Copyright (c) 1982, 2009, Oracle.  All rights reserved.

        Connected to an>  SQL> startup
        ORA-00845: MEMORY_TARGET not supported on this system
        SQL> exit
        Disconnected
        #------------------2.已KB单位查看RAM是889572KB,Swap为10239992KB
        [root@h1 ~]# free -k
        total       used       free     shared    buffers     cached
        Mem:        889572     793308      96264          0      15880     524032
        -/+ buffers/cache:     253396     636176
        Swap:     10239992      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  SQL> startup
        ORACLE instance started.
        Total System Global Area  501059584 bytes

        Fixed>
        Variable>  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>>
        System>
        SQL>>
        System>  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:>  Copyright (c) 1982, 2009, Oracle.  All rights reserved.

        Connected to an>  SQL> startup pfile=$ORACLE_HOME/dbs/inittest.ora mount
        ORACLE instance started.
        Total System Global Area  501059584 bytes

        Fixed>
        Variable>  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>
        Variable>  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>
        Variable>  Database Buffers          163577856 bytes
        Redo Buffers                3915776 bytes
        SQL> select * from v$sga;
        NAME                      VALUE
        -------------------- ----------

        Fixed>
        Variable>  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>



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-600303-1-1.html 上篇帖子: oracle10g EM 问题 下篇帖子: Oracle 存储过程和包的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表