这篇文章主要是为了记下看过的Admin Guide中的重点,免得以后忘了,即为了忘却的记忆。所以很多细节方面都被忽略,基本概念也不再赘述。
在11g里内存管理有2中,一种是自动内存管理,一种是手工内存管理。Oracle的内存结构如下:
1.启动自动内存管理:
首先要知道即将管理的目标内存的大小,可以通过以下公式来计算:
memory_target = sga_target + max(pga_aggregate_target, maximum PGA allocated)
其中pga_aggregate_target参数是用来指定所有的 session总共可以使用的最大PGA内存; maximum PGA allocated 是数据库启动后所分配到的最大PGA内存。 pga_aggregate_target只是用户设置的一个目标,而maximum PGA allocated是已经分配的最大值, 但是不明白为什么可以使得maximun PGA allocated会大于pga_aggregate_target。貌似是在pga_aggregate_target达到后如果还允许用户连接,就可以超出这个值。
之后设定MEMORY_TARGET 和 MEMORY_MAX_TARGET,可以用
alter system MEMORY_MAX_TARGET = nM SCOPE = SPFILE
因为MEMORY_MAX_TARGET不是动态的参数,所以要重启另它生效。重启后用下面的命令启动自动内存管理:
ALTER SYSTEM SET MEMORY_TARGET = nM;
ALTER SYSTEM SET SGA_TARGET = 0;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;
2.手动内存管理:
这里又分为自动管理SGA、手动管理SGA、自动管理PGA和手动管理PGA。
1)可以通过以下命令从自动内存管理模式变到 自动管理SGA :
首先把MEMORY_TARGET变为0: ALTER SYSTEM SET MEMORY_TARGET = 0;
之后计算SGA_TARGET的最小值:
SGA_TARGET = SELECT SUM(value) FROM V$SGA - SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY
再设定SGA_MAX_TARGET的值,用下面的命令就可以实现自动管理SGA:
ALTER SYSTEM SET SGA_TARGET = nM;
ALTER SYSTEM SET SHARED_POOL_SIZE = 0;
ALTER SYSTEM SET LARGE_POOL_SIZE = 0;
ALTER SYSTEM SET JAVA_POOL_SIZE = 0;
ALTER SYSTEM SET DB_CACHE_SIZE = 0; (buffer cache size)
ALTER SYSTEM SET STREAMS_POOL_SIZE = 0;
显然在Oracle里把某个参数的值设为零,表示它是自动计算的。
2) 手动管理SGA
要启动手动管理SGA, 要把MEMORY_TARGET设为0. SGA_TARGET设为0,再对SGA中的各个部分设值。
设置Buffer Cache:
单一的block size是通过设定DB_BLOCK_SIZE, 值是2~32k,再通过DB_CACHE_SIZE 参数设定buffer cache size。不同的block size可以通过DB_nk_CACHE_SIZE设定,表示nk的block size 对应的buffer cache size,例如:
DB_BLOCK_SIZE=4096
DB_CACHE_SIZE=1024M
DB_2K_CACHE_SIZE=256M
DB_8K_CACHE_SIZE=512M
上面的命令指标准的block size 是4k, 4k block size的buffer cache size shi 1024M。 2k的是256M, 8k的是512 M。
最后还可以设定多个buffer pool,这个还没搞懂,不写了。
设置Shared Pool(共享池):
通过设置SHARD_POOL_SIZE参数控制大小,从10g开始这个值除了shared pool工作时内存大小,还包括SGA在启动的消耗(即在SGA启动时所需的内存也计算在SHARD_POOL_SIZE里)。共享池包含共享游标,存储过程,状态对象,字典缓存和诸如此类的其他大量数据结构。
JAVA池:它是为数据库中运行的JVM分配的一个固定大小的内存。
大池(Large Pool):共享服务器使用大池作为会话内存,并行执行特性使用大池作为消息缓冲区。
流池(Stream Pool):是Oracle 流的一个专用共享内存池
重做缓冲区(Redo Buffer):当数据需要写到在线重做日志中,在写入磁盘时需要把这些数据在重做缓冲区中临时缓冲,由于内存到内存的传输比内存到磁盘的传输快,所以重做日志缓冲区可以加快数据库的操作。
3) 自动管理PGA
Oracle会默认使用自动管理PGA,关键的一个参数是PGA_AGGREGATE_TARGET, Oracle会尽力保证所有的PGA内存消耗不超过这个值。 还要设置WORKAREA_SIZE_POLICY为AUTO.
4) 手动管理PGA
通过设置*_AREA_SIZE一系列参数,当然PGA_AGGREGATE_TARGET要设零。貌似这种模式比较麻烦,不建议初学者用。
一些重要的View:
V$SGA
V$SGAINFO
V$SGASTAT
V$PAGSTAT