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

[经验分享] Oracle内存管理(之六)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-28 09:13:21 | 显示全部楼层 |阅读模式
【深入解析--eygle】学习笔记

1.4.5 Oracle10g自动共享内存管理在Oracle10g之前,你可能面对过这样的情况,你的数据库在白天需要处理大量的OLTP任务,这些任务需要大量的Buffer Cache内存,而在夜间系统可能需要运行大量的并行批处理任务,这些任务又需要大量的Large Pool内存,为了让这样一个系统在有限的资源下高效率运行,可能你需要在各类峰值业务来临之前对数据库进行不断的调整

那么在Oracle10g的自动共享内存管理(Automatic Shared Memory Management-ASMM)下,这些动作不再需要人工介入,当运行OLTP任务时,Buffer Cache会获取大部分内存以达到良好的I/O性能。当系统需要运行DSS批处理任务时,内存会自动转移给Large Pool,以便并行查询等可以获得更多的内存,更快的执行。

Oracle10g使用了一个新的初始化参数SGA_TARGET,通过指定这个参数,让Oracle自动管理SGA中以下大多数的内存分配。SGA_TARGET是个动态参数,但是该参数不能超过SGA_MAX_SIZE参数的设置

11:47:40 sys@felix SQL>show parameter sga

NAME                                TYPE                   VALUE
---------------------------------------------------------- ------------------------------
lock_sga                             boolean                FALSE
pre_page_sga                         boolean                FALSE
sga_max_size                         big integer            400M
sga_target                           big integer            0
13:21:25 sys@felix SQL>

如果试图修改SGA_TARGET超越SGA_MAX_SIZE的限制,系统会给出错误信息:

SQL> alter system set sga_target=500M;
alter system set sga_target=500M
*
ERROR at line 1:
ORA-02097: parameter cannot be modified becausespecified value is invalid
ORA-00823:Specified value of sga_target greater than sga_max_size


并非所有SGA组件都可以自动调整,可以自动分配的内存包括  Buffer Cache、Shared Pool、Java Pool、  Large Pool

启用自动共享内存管理,我们可以估算一个 SGA 的总大小,然后设置SGA_TARGET 参数为非零值, Oaracle将启用自动共享内存管理。自动共享内存管理需要STATISTICS_LEVEL参数设置为TYPICAL 或者 ALL.

Oracle服务器根据系统运行的情况自动调整这些内存的大小,并记录在SPFILE中,数据库实例重新启动时,不会丢失之前的调整结果。

但是注意以下相关初始化参数还是需要手工配置的:  非标准BLOCK_SIZE的Cache、Keep/Recycle Buffer Cache、Redo Log Buffer、Streem Pool

如果不想使用自动共享内存管理的新特性,Oracle也允许使用手工管理,只需要简单的将SGA_TARGET参数设置为0,Oracle就会回到手工管理的模式,当前的各内存组件值会被计入spfile,做为手工管理的初始值使用.
随着自动共享内存管理新特性的引入,许多相关参数的使用也发生了改变。当我们从开始就设置了SGA_MAX_SIZE参数,启用了自动共享内存管理之后,相关内存参数值会处于未设置状态:


13:35:01 sys@felix
SQL>select name, value
  fromv$parameter
where namein ('large_pool_size',
               'java_pool_size',
               'shared_pool_size',
               'streams_pool_size',
               'db_cache_size');
NAME                                    VALUE
------------------------------------------------------------
shared_pool_size                         0
large_pool_size                          0
java_pool_size                           0
streams_pool_size                        0
db_cache_size                            0
13:35:01 sys@felix SQL>
真正决定各组件大小的,是由一组新引入的参数决定:
SELECT x.ksppinm NAME, y.ksppstvl VALUE,x.ksppdesc describ
  FROMSYS.x$ksppi x, SYS.x$ksppcv y
WHEREx.inst_id = USERENV('Instance')
   ANDy.inst_id = USERENV('Instance')
   ANDx.indx = y.indx
   ANDx.ksppinm like '%pool_size%' ;
13:37:18 sys@felix SQL>/
NAME                                     VALUE                DESCRIB
------------------------------------------------------------ --------------------------------------------------
_NUMA_pool_size                          Not specified        aggregate size in bytes of NUMA pool
__shared_pool_size                       171966464            Actual size in bytes of shared pool
shared_pool_size                         0                    size in bytes of sharedpool
__large_pool_size                        4194304              Actual size in bytes of largepool
large_pool_size                          0                    size in bytes of large pool
__java_pool_size                         4194304              Actual size in bytes of java pool
java_pool_size                           0                    size in bytes of java pool
__streams_pool_size                     8388608              Actual size in bytes of streams pool
streams_pool_size                        0                    size in bytes of thestreams pool
_io_shared_pool_size                     4194304              Size of I/O buffer pool from SGA
_backup_io_pool_size                     1048576              memory to reserve from the largepool
__shared_io_pool_size                   0                    Actual size of shared IOpool
_shared_io_pool_size                     0                    Size of shared IO pool
global_context_pool_size                                      GlobalApplication Context Pool Size in Bytes
olap_page_pool_size                      0                    size of the olap page poolin bytes
_trace_pool_size                                              trace pool size in bytes
16 rows selected.
13:37:18 sys@felix SQL>


这些由两个下划线开头的参数决定了当前SGA的分配,也是动态内存管理调整的参数。这些参数的更改会被记录到spfile文件当中,在下一次数据库启动时仍然有效
这是Oracle10g在参数上的一些变化,通过动态视图v$sga_dynamic_components,可以看到各动态组件调整的时间和调整类型等信息


select COMPONENT,
      CURRENT_SIZE,
      MIN_SIZE,
      LAST_OPER_TYPE,
      LAST_OPER_MODE,
      to_char(LAST_OPER_TIME, 'yyyy-mm-dd hh24:mi:ss') LOT
  fromv$sga_dynamic_components
whereLAST_OPER_TIME is not null;
SouthEast.jpg


1.4.6 Oracle11g自动内存管理在Oracle11g中,Oracle将内存管理的自动化更进了一步,引入了自动内存管理(AutomaticMemory Management-AMM)的 新 特 性,现 在Oracle将SGA和PGA都纳入了自动管理的范畴。

在Oracle10g中,Oracle对SGA引入了自动管理,相关的参数为SGA_TARGET和SGA_MAX_SIZE;在Oracle9i中,Oracle已经引入了自动的PGA管理,相关的初始化参数为pga_aggregate_target。


Oracle11g引入了一个新的参数MEMORY_TARGET。现在只要设置了这个参数,可以不需要设置SGA_TARGET和PGA_AGGREATE_TARGET两个参数,使用自动内存管理,Oracle数据库将自行决定SGA以及PGA的分配和使用,这极大的简化了DBA对于内存的调整和管理工作。


13:49:44 sys@felix SQL>show  parameter memory_target

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

13:49:54 sys@felix SQL>show parametermemory_max_

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

13:51:47 sys@felix SQL>show parameter pga

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

此时PGA和SGA参数可以无需设置:
13:52:14 sys@felix SQL>show parameter sga

NAME                                 TYPE                   VALUE
---------------------------------------------------------- ---------------------
lock_sga                             boolean                FALSE
pre_page_sga                         boolean                FALSE
sga_max_size                         big integer            400M
sga_target                           big integer            0
13:52:22 sys@felix SQL>
SouthEast.jpg

当MEMORY_TARGET参数设置超过了系统允许的限制后,会出现ORA-00845错误:

SYS@felix>alter system setmemory_max_target=2048M scope=spfile;
System altered.
SYS@felix>alter system set memory_target=2048Mscope=spfile;
System altered.
SYS@felix>startup force;
ORA-00845: MEMORY_TARGET not supported on this system

这个错误经常使人误解,实际上系统并非不支持MEMORY_TARGET,而是不支持当前的参数设置。检查告警日志文件,在Linux上可以看到如下的?示信息:


Starting ORACLE instance(normal)
WARNING: You are tryingto use the MEMORY_TARGET feature. This feature requires the /dev/shm filesystem to be mounted for at least 2063597568 bytes. /dev/shm is either notmounted or is mounted with available space less than this size. Please fix thisso that MEMORY_TARGET can work as expected. Current available is 1073741824 andused is 0 bytes. memory_target needs larger /dev/shm
这是因为在Linux的VLM(Very Large  Memory)支持中,使用了shmfs/tmpfs选项(另外一种实现方式是使用(ramfs),如果/dev/shm不足够,则会出现如上错误。
检查一下/dev/shm设置:
[iyunv@felix kernel]# df  -k /dev/shm
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                   510436    261884   248552  52% /dev/shm
[iyunv@felix kernel]#
重新设置和加载一下/dev/shm:
[iyunv@felix kernel]# umount /dev/shm
[iyunv@felix /]# mount -t tmpfs shmfs -o size=3192M/dev/shm
[iyunv@felix /]# df -k /dev/shm
Filesystem 1K-blocks Used Available Use% Mountedon
shmfs 3268608 0 3268608 0% /dev/shm
[iyunv@felix /]# ls -l /dev/shm
total 0
设置完成之后,数据库就可以正常启动。
检查一下现在的shm内存使用:
[oracle@felix admin]$ df -k /dev/shm
Filesystem 1K-blocks Used Available Use% Mountedon
shmfs 3268608 1244436 2024172 39% /dev/shm


运维网声明 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-22744-1-1.html 上篇帖子: Oracle内存管理(之五) 下篇帖子: Oracle内存管理(之七) Oracle
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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