好文档 - 专业文书写作范文服务资料分享网站

05内存管理

天下 分享 时间: 加入收藏 我要投稿 点赞

书名书名书名书名书名书名书名书名书名书名书名书名书名书名

随着自动共享内存管理新特性的引入,许多相关参数的使用也发生了改变。当我们从开始就设置了SGA_MAX_SIZE参数,启用了自动共享内存管理之后,相关内存参数值会处于未设置状态:

SQL> select name,value from v$parameter

2 where name in ('large_pool_size','java_pool_size',

3 '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

而真正决定各组件大小的,是由一组新引入的参数决定:

SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ 2 FROM SYS.x$ksppi x, SYS.x$ksppcv y

3 WHERE x.inst_id = USERENV ('Instance') AND y.inst_id = USERENV ('Instance') 4 AND x.indx = y.indx AND x.ksppinm like '%pool_size%'z; NAME VALUE DESCRIB

------------------------------ --------------- ---------------------------------- _NUMA_pool_size Not specified aggregate size in bytes of NUMA pool

__shared_pool_size 96468992 Actual size in bytes of shared pool shared_pool_size 0 size in bytes of shared pool

__large_pool_size 4194304 Actual size in bytes of large pool 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 0 Actual size in bytes of streams pool

streams_pool_size 0 size in bytes of the streams pool

这些由两个下划线开头的参数决定了当前SGA的分配,也是动态内存管理调整的参数。这些参数的更改会被记录到spfile文件当中,在下一次数据库启动时仍然有效.

我们转储一下spfile文件:

SQL> show parameter spfile

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------ spfile string +ORADG/danaly/spfiledanaly.ora SQL> create pfile from spfile; File created. ·46·

第1章 章名章名章名章名章名

检查其参数设置,可以清晰地看到这些参数及其参数值:

[oracle@danaly dbs]$ more initdanaly.ora danaly.__db_cache_size=830472192 danaly.__java_pool_size=4194304 danaly.__large_pool_size=4194304 danaly.__shared_pool_size=96468992 danaly.__streams_pool_size=0

*.audit_file_dest='/opt/oracle/admin/danaly/adump' *.background_dump_dest='/opt/oracle/admin/danaly/bdump' *.compatible='10.2.0.1.0'

*.control_files='+ORADG/danaly/controlfile/current.256.600173845','+ORADG/danaly/controlfile/current.257.600173845' 。。。。。。。。。。。。。

*.user_dump_dest='/opt/oracle/admin/danaly/udump'

这是Oracle10g在参数上的一些变化,通过动态视图v$sga_dynamic_components,可以看到各动态组件调整的时间和调整类型等信息:

SQL> select COMPONENT,CURRENT_SIZE,MIN_SIZE,LAST_OPER_TYPE,

2 LAST_OPER_MODE,to_char(LAST_OPER_TIME,'yyyy-mm-dd hh24:mi:ss') LOT 3 from v$sga_dynamic_components where LAST_OPER_TIME is not null; COMPONENT CURRENT_SIZE MIN_SIZE LAST_OPER_TYP LAST_OPER LOT

-------------------- ------------ ---------- ------------- --------- ------------------- shared pool 838860800 805306368 GROW DEFERRED 2008-01-29 13:06:23 DEFAULT buffer cache 2315255808 2315255808 SHRINK DEFERRED 2008-01-29 13:06:23

4. Oracle11g自动内存管理

在Oracle11g中,Oracle将内存管理的自动化更进了一步,引入了自动内存管理(Automatic Memory 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对于内存的调整和管理工作。

SQL> show parameter memory_target

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------ memory_target big integer 352M

·47·

书名书名书名书名书名书名书名书名书名书名书名书名书名书名

SQL> show parameter memory_max_

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------ memory_max_target big integer 352M

此时PGA和SGA参数可以无需设置:

SQL> show parameter pga

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------ pga_aggregate_target big integer 0 SQL> show parameter sga_target

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------ sga_target big integer 0

在参数上,自动内存管理和之前的自动SGA调整是类似的,Oracle引入了带有两个下划线开头的参数用于实际控制内存设置,原有参数被设置为0,这些参数在使用SPFILE时,可以动态在参数文件中改写,从而可以使得参数调整可以跨越数据库启动继续有效:

SQL> @GetHidPar

Enter value for par: sga_target

old 6: AND x.ksppinm LIKE '%&par%' new 6: AND x.ksppinm LIKE '%sga_target%'

NAME VALUE DESCRIB

------------------------------ -------------------- -------------------- sga_target 0 Target size of SGA __sga_target 222298112 Actual size of SGA SQL> /

Enter value for par: pga_agg

old 6: AND x.ksppinm LIKE '%&par%' new 6: AND x.ksppinm LIKE '%pga_agg%' NAME VALUE DESCRIB

------------------- --------- ------------------------------------------------------------ pga_aggregate_target 0 Target size for the aggregate PGA memory consumed by the

instance

__pga_aggregate_target 146800640 Current target size for the aggregate PGA memory consumed

随MEMORY_TARGET参数一起引入的还有MEMORY_MAX_TARGET参数,现在ORACLE的内存管理参数下图所示:

·48·

第1章 章名章名章名章名章名

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

SYS@WAPDBS>alter system set memory_max_target=2048M scope=spfile; System altered.

SYS@WAPDBS>alter system set memory_target=2048M scope=spfile; System altered.

SYS@WAPDBS>startup force;

ORA-00845: MEMORY_TARGET not supported on this system

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

Starting ORACLE instance (normal)

WARNING: You are trying to use the MEMORY_TARGET feature. This feature requires the /dev/shm file system to be mounted for at least 2063597568 bytes. /dev/shm is either not mounted or is mounted with available space less than this size. Please fix this so that MEMORY_TARGET can work as expected. Current available is 1073741824 and used is 0 bytes. memory_target needs larger /dev/shm

这是因为在Linux的VLM(Very Large Memory)支持中,使用了shmfs/tmpfs选项(另外一种实现方式是使用(ramfs),如果/dev/shm不足够,则会出现如上错误。

检查一下/dev/shm设置:

[root@test126 /]# df -k /dev/shm

Filesystem 1K-blocks Used Available Use% Mounted on tmpfs 1048576 0 1048576 0% /dev/shm

重新设置和加载一下/dev/shm:

[root@test126 /]# umount /dev/shm

·49·

书名书名书名书名书名书名书名书名书名书名书名书名书名书名

[root@test126 /]# mount -t tmpfs shmfs -o size=3192M /dev/shm [root@test126 /]# df -k /dev/shm

Filesystem 1K-blocks Used Available Use% Mounted on shmfs 3268608 0 3268608 0% /dev/shm [root@test126 /]# ls -l /dev/shm total 0

设置完成之后,数据库可以正常启动:

[oracle@test126 admin]$ sqlplus \

SQL*Plus: Release 11.1.0.6.0 - Production on Tue Sep 18 11:31:53 2007 Copyright (c) 1982, 2007, Oracle. All rights reserved. Connected to an idle instance.

SQL> startup

ORACLE instance started.

Total System Global Area 2058981376 bytes Fixed Size 1300968 bytes Variable Size 939525656 bytes Database Buffers 1107296256 bytes Redo Buffers 10858496 bytes Database mounted. Database opened.

检查一下现在的shm内存使用:

[oracle@test126 admin]$ df -k /dev/shm

Filesystem 1K-blocks Used Available Use% Mounted on shmfs 3268608 1244436 2024172 39% /dev/shm

再看看内存段的使用情况:

[oracle@test126 admin]$ ls -l /dev/shm total 1244436

-rw-r----- 1 oracle dba 16777216 Sep 18 11:31 ora_wapdbs_2457602_0 ………

-rw-r----- 1 oracle dba 16777216 Sep 18 11:31 ora_wapdbs_2752517_30 -rw-r----- 1 oracle dba 16777216 Sep 18 11:32 ora_wapdbs_2752517_4 -rw-r----- 1 oracle dba 16777216 Sep 18 11:32 ora_wapdbs_2752517_5 -rw-r----- 1 oracle dba 16777216 Sep 18 11:32 ora_wapdbs_2752517_6 -rw-r----- 1 oracle dba 16777216 Sep 18 11:32 ora_wapdbs_2752517_7 -rw-r----- 1 oracle dba 16777216 Sep 18 11:32 ora_wapdbs_2752517_8 -rw-r----- 1 oracle dba 16777216 Sep 18 11:32 ora_wapdbs_2752517_9

注意以上输出,Oracle在系统上,以Granule为单位分配了内存映射文件(此时Granule

·50·

05内存管理

书名书名书名书名书名书名书名书名书名书名书名书名书名书名随着自动共享内存管理新特性的引入,许多相关参数的使用也发生了改变。当我们从开始就设置了SGA_MAX_SIZE参数,启用了自动共享内存管理之后,相关内存参数值会处于未设置状态:SQL>selectname,valuefromv$parameter2wherenamein
推荐度:
点击下载文档文档为doc格式
6ymt28v4r86x2111f20r4n7xz5ee5l00bif
领取福利

微信扫码领取福利

微信扫码分享