洞察提升小程序标签管理,实现高效的金融行业数字化转型
641
2022-11-29
Oracle 启动ASMM管理
1.ASMM的作用从Oracle 10g开始,Oracle提供了自动SGA的管理(简称ASMM,Automatic SharedMemory Management)新特性。所谓ASMM,就是指我们不再需要手工设置shared pool、buffer pool等若干内存池的大小,而是为 SGA 设置一个总的大小尺寸即可。Oracle数据库会根据系统负载变化,自动调整各组件的大小,从而使得内存始终能够流向最需要它的地方。
例如,假设某个系统在上午10:00到下午9:00属于OLTP应用,因而可能会用到较多的BUFFER CACHE;而下午9:00到上午10:00属于OLAP系统,可能会用到较大的SHARED POOL和LARGE POOL。如果我们启用了ASMM,数据库就会根据负载的变化而自动对内存大小进行调整,就不需要数据库管理员手工进行调整了。
2.如何使用ASMMOracle 10g提供了一个新的初始化参数:sga_target来启动ASMM,该参数定义了整个SGA的总容量。同时,初始化参数statistics_level必须设置为typical或all才能启动ASMM,否则如果设置为basic,则关闭ASMM。ASMM只能自动调整5个内存池的大小,它们是:shared pool、buffer cache、large pool、java pool 和stream pool。我 们 不 再 需要 设 置 shared_pool_size、db_cache_size large_pool_size、java_pool_size、streams_pool_size这五个初始化参数。而其他的内存池,比如log buffer、keep buffer cache 等仍然需要DBA手工进行调整。
Oracle 10g还提供了另一个初始化参数sga_max_size。sga_target的值不能超过sga_max_size的值,修改 sga_max_size时,必须重启实例才能生效,而 sga_target则可以在线修改,立即生效,无须重启实例。
3.ASMM的原理为了实现ASMM,Oracle新引入了一个名为 MMAN(Memory Manager)的后台进程。 每隔很短的一段时间,MMAN进程就会启动,然后去询问一下 Oracle提供的各个内存组件顾问,比如有 buffer cache顾问,也有 shared pool顾问,由这些顾问根据当前的负载情况,将这 5个可以自动调整的内存池的、建议的大小尺寸,返回给 MMAN。于是,MMAN进程就会根据该返回的值,来设置各个内存池。同时,如果我们使用了 spfile,还会将这些顾问得出的建议值写入spfile 里。这样,下次启动实例时,就可以直接把顾问得出的建议值拿来作为启动内存池的依据了。
如果我们启用了ASMM,同时又手工设置了可以自动调整大小的内存池的尺寸,比如设置了参数shared_pool_size为一个非0值的时候,会怎么样?对于Oracle 10g来说,我们为自动调整大小的内存组件设置了值,则会以我们设置的值作为自动调整的最小值。也就是说,假设sga_target为4GB,而我们将shared_pool_size设置为600MB,则MMAN在进行自动调整时,永远不会将shared pool设置为600MB以下。
4.11g中的ASMM在Oracle11g数据库中,使用自动内存管理特性不再需要设定参数SGA_TARGET和PGA_AGGREGATE_TARGET,因为这两个参数都已经被修改成自动调优的,除非想指定PGA和 SGA 的最小值才需要设定这两个参数。在Oracle11g数据库中,则需要设置一个叫做MEMORY_TARGET的初始化参数,这个参数是指整个Oracle实例所能使用的内存大小,包括PGA和SGA的整体大小,在MEMORY_TARGET的内存大小之内,PGA和 SGA所用的内存可以根据当前负载情况自动相互转换。如果当初始设定的MEMORY_TARGET的内存不够当前数据库使用的时候,Oracle11g还提供了另外一个初始化参数MEMORY_MAX_TARGET,当原始设定的内存不够使用的时候,可以手工来动态调节 MEMORY_TARGET 的大小,但是不允许超过MEMORY_MAX_TARGET 的值。下面这张图简单明了的描述出 了 Oracle11g数据库内存大小的设定参数。
ASMM管理(将AMM切换到ASMM管理,即不启用11G的AMM特性,退化到10G的ASMM特性,当sga_target=0那么其下面的share_pool,buffer_cache就要手动管理,这样适合比较有经验的,如果sga_target不为0,那么其下面的share_pool,buffer_cahe等是自动管理。)
(1)启用ASMM管理,SGA_TARGET下面的各个内存手动管理(适合有经验的DBA)。
SQL> show parameter mem; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------hi_shared_memory_address integer 0memory_max_target big integer 2Gmemory_target big integer 2Gshared_memory_address integer 0 SQL> alter system set memory_max_target=0 scope=spfile; System altered. SQL> alter system set memory_target=0 scope=spfile; System altered. SQL> alter system set sga_target=0 scope=spfile; System altered. SQL> alter system set pga_aggregate_target=400m scope=spfile; System altered. SQL> alter system set sga_max_size=1600m scope=spfile; System altered. SQL> alter system set db_cache_size=800m scope=spfile; System altered. SQL> alter system set shared_pool_size=400m scope=spfile; System altered. SQL> alter system set java_pool_size=100m scope=spfile; System altered. SQL> alter system set large_pool_size=100m scope=spfile; System altered. SQL> alter system set streams_pool_size=100m scope=spfile; System altered. SQL> startup force;ORA-00843: Parameter not taking MEMORY_MAX_TARGET into accountORA-00849: SGA_TARGET 1677721600 cannot be set to more than MEMORY_MAX_TARGET 0. SQL> startup nomount;ORA-00843: Parameter not taking MEMORY_MAX_TARGET into accountORA-00849: SGA_TARGET 1677721600 cannot be set to more than MEMORY_MAX_TARGET 0. 这个问题的原因是Oracle启动过程中对于参数的内部检查。因为MEMORY_MAX_TARGET被“显示”的赋值,与SGA_TARGET赋值相冲突。 解决的方法就是使用参数默认值。创建出pfile之后,将显示赋值为0的MEMORY_TARGET和MEMORY_MAX_TARGET记录行删除掉。再利用pfile启动数据库,重建spfile。 SQL> create pfile from spfile; File created. 修改前pfile里面内容部分内容:*.shared_pool_size=419430400*.memory_max_target=0*.memory_target=0*.sga_max_size=1677721600*.sga_target=0 只需要将pfile的 *.memory_max_target=0 *.memory_target=0两行删除。[oracle@Database2 dbs]$ vi initoradb.ora[oracle@Database2 dbs]$ rm -rf spfileoradb.ora[oracle@Database2 dbs]$ lshc_oradb.dat init.ora initoradba.ora initoradb.ora lkORADB orapworadb snapcf_oradb.f在Oracle用户下到$ORACLE_HOME下面将spfile删除,保留pfile文件,启动实例,实例用的是上面修改的pfile。 [oracle@Database2 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon Jun 25 10:13:26 2018 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL> startup;ORACLE instance started. Total System Global Area 1670221824 bytesFixed Size 2253824 bytesVariable Size 822086656 bytesDatabase Buffers 838860800 bytesRedo Buffers 7020544 bytesDatabase mounted.Database opened. [root@Database2 ~]# ipcs -m ------ Shared Memory Segments --------key shmid owner perms bytes nattch status 0x00000000 0 gdm 600 393216 2 dest 0x00000000 32769 gdm 600 393216 2 dest 0x00000000 65538 gdm 600 393216 2 dest 0x00000000 393219 oracle 640 16777216 26 0x00000000 425988 oracle 640 1660944384 26 0x84bc7544 458757 oracle 640 2097152 26 在11g中,如果使用ASMM,对应的内存共享段是真实的共享段。 SQL> show parameter mem; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------hi_shared_memory_address integer 0memory_max_target big integer 0memory_target big integer 0shared_memory_address integer 0 SQL> show parameter sga; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------lock_sga boolean FALSEpre_page_sga boolean FALSEsga_max_size big integer 1600Msga_target big integer 0 SQL> show parameter pga; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------pga_aggregate_target big integer 400MSQL> show parameter db_cache_size; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------db_cache_size big integer 800MSQL> show parameter shared_pool_size; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------shared_pool_size big integer 400MSQL> show parameter java_pool_size; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------java_pool_size big integer 112MSQL> show parameter large_pool_size; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------large_pool_size big integer 112MSQL> show parameter streams_pool_size; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------streams_pool_size big integer 112M SQL> create spfile from pfile; File created. SQL> create spfile from pfile; File created. SQL> startup force;ORACLE instance started. Total System Global Area 1670221824 bytesFixed Size 2253824 bytesVariable Size 822086656 bytesDatabase Buffers 838860800 bytesRedo Buffers 7020544 bytesDatabase mounted.Database opened. SQL> show parameter spfile; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------spfile string /u01/app/oracle/product/11.2.0 /db_1/dbs/spfileoradb.ora 1. 启用ASMM管理,SGA_TARGET下面的内存使用自动管理,步骤和上面一样,上面的share_pool,buffer_cache是手动管理,下面的是自动管理。 SQL> show parameter mem; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------hi_shared_memory_address integer 0memory_max_target big integer 1Gmemory_target big integer 1Gshared_memory_address integer 0SQL> alter system set memory_max_target=0 scope=spfile; System altered. SQL> alter system set memory_target=0 scope=spfile; System altered. SQL> alter system set pga_aggregate_target=400m scope=spfile; System altered. SQL> alter system set sga_max_size=1600m scope=spfile; System altered. SQL> alter system set sga_target=1600m scope=spfile; System altered. SQL> startup force;ORA-00843: Parameter not taking MEMORY_MAX_TARGET into accountORA-00849: SGA_TARGET 1677721600 cannot be set to more than MEMORY_MAX_TARGET 0.SQL> create pfile from spfile; File created. [oracle@Database2 dbs]$ rm -rf spfileoradb.ora[oracle@Database2 dbs]$ vi initoradb.ora[oracle@Database2 dbs]$ lshc_oradb.dat init.ora initoradba.ora initoradb.ora lkORADB orapworadb snapcf_oradb.f SQL> startup force;ORACLE instance started. Total System Global Area 1670221824 bytesFixed Size 2253824 bytesVariable Size 268438528 bytesDatabase Buffers 1392508928 bytesRedo Buffers 7020544 bytesDatabase mounted.Database opened.SQL> show parameter spfile; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------spfile string SQL> show parameter mem; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------hi_shared_memory_address integer 0memory_max_target big integer 0memory_target big integer 0shared_memory_address integer 0SQL> show parameter sga; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------lock_sga boolean FALSEpre_page_sga boolean FALSEsga_max_size big integer 1600Msga_target big integer 1600MSQL> show parameter pga; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------pga_aggregate_target big integer 400MSQL> show parameter db_cache_size; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------db_cache_size big integer 0SQL> show parameter shared_pool_size; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------shared_pool_size big integer 0SQL> show parameter java_pool_size; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------java_pool_size big integer 0SQL> show parameter large_pool_size; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------large_pool_size big integer 0SQL> show parameter streams_pool_size; NAME TYPE VALUE------------------------------------ -------------------- ------------------------------streams_pool_size big integer 0 总结:在ASMM管理下,必须先将AMM管理关闭,这是第一步,之后要想使用share_pool,buffer_cache要自动管理,sga_target值设置为不为0,如果要手动管理share_pool,buffer_cache那么就要将sga_target的值设置为0。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~