Oracle提供三种内存管理模式,需根据业务负载特性选择:
全自动托管(AMM,Automatic Memory Management):通过MEMORY_TARGET
参数统一管理SGA与PGA的内存分配,Oracle自动根据工作负载调整两者比例。适用于业务流量波动大、缺乏专业DBA的场景(如互联网应用数据库),配置方式为:
ALTER SYSTEM SET MEMORY_TARGET=<总内存大小> SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET=<总内存大小> SCOPE=SPFILE;
注意:AMM与HugePages冲突,需关闭HugePages。
半自动化调优(ASMM,Automatic Shared Memory Management):SGA由系统动态分配(SGA_TARGET
参数),PGA需手动设置(PGA_AGGREGATE_TARGET
参数),兼顾灵活性与可控性。适用于对SGA性能敏感但PGA负载较稳定的场景(如OLTP系统),配置方式为:
ALTER SYSTEM SET SGA_TARGET=<SGA总大小> SCOPE=SPFILE;
ALTER SYSTEM SET SGA_MAX_SIZE=<SGA总大小> SCOPE=SPFILE;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=<PGA总大小> SCOPE=SPFILE;
需将缓冲区缓存(DB_CACHE_SIZE
)、共享池(SHARED_POOL_SIZE
)等SGA组件大小设为0,让Oracle自主分配。
全手动控制:对SGA与PGA的每个组件(如SHARED_POOL_SIZE
、DB_CACHE_SIZE
、PGA_AGGREGATE_TARGET
)进行精准赋值,适用于工作负载高度可预测的系统(如银行核心交易数据库),但需资深DBA持续监控。
SGA是所有会话共享的内存区域,其优化核心是平衡各组件内存分配,避免热点或浪费:
缓冲区缓存(Database Buffer Cache):缓存高频访问的数据块,减少磁盘I/O。监控命中率(公式:1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS))
),若命中率低于90%,需增大DB_CACHE_SIZE
(如OLTP系统可设为物理内存的20%-30%)。调整命令:
ALTER SYSTEM SET DB_CACHE_SIZE=<大小> SCOPE=SPFILE;
可进一步通过DB_KEEP_CACHE_SIZE
(缓存频繁访问的小表)、DB_RECYCLE_CACHE_SIZE
(缓存全表扫描的大对象)优化缓冲区利用率。
共享池(Shared Pool):缓存解析后的SQL语句与数据字典信息,避免重复编译。监控命中率(LIBRARY_CACHE
命中率应高于90%,Data Dictionary Cache
命中率应高于90%),若命中率低,需增大SHARED_POOL_SIZE
(如OLTP系统可设为物理内存的10%-20%)。优化技巧:使用绑定变量(减少SQL硬解析)、避免频繁DDL操作(如CREATE/ALTER TABLE
)。
大型池(Large Pool):用于共享服务器环境、备份恢复或并行查询,减轻共享池负担。若系统使用共享服务器或频繁执行备份,需增大LARGE_POOL_SIZE
(如设为64M-256M)。
Java池(Java Pool):为Java程序提供内存支持,若使用Java存储过程或应用,需调整JAVA_POOL_SIZE
(如设为32M-128M)。
PGA是每个会话私有的内存区域,主要用于排序、哈希连接等操作,其优化核心是控制工作区大小:
PGA_AGGREGATE_TARGET
参数设置PGA总内存目标(如OLTP系统可设为物理内存的10%-20%,数据仓库可设为20%-30%)。Oracle会自动分配工作区(如排序、哈希连接),目标是让90%以上的工作区运行在“最优大小”(无需额外磁盘I/O),避免“多遍”(多次读取数据)。V$PGASTAT
视图查看关键指标(如“total PGA allocated”(总PGA分配)、“cache hit percentage”(缓存命中率)),若命中率低于90%,需增大PGA_AGGREGATE_TARGET
。HugePages是Linux系统的内存管理特性,可将SGA映射到更大的内存页(通常为2MB或1GB),减少TLB(Translation Lookaside Buffer)缺失,提升内存访问效率。配置步骤:
ceil(SGA_MAX_SIZE / Hugepagesize)
(如SGA_MAX_SIZE为8G,Hugepagesize为2MB,则需4096个HugePages)。/etc/sysctl.conf
文件,设置vm.nr_hugepages=<计算值>
,执行sysctl -p
生效。hugetlb
组:usermod -aG hugetlb oracle
。调整Linux内核参数,提升系统对Oracle内存的支持:
vm.swappiness
:控制内存交换的倾向(0-100),设为0表示尽量避免交换(Oracle倾向于使用物理内存),建议设置为10以下。vm.dirty_background_ratio
:脏页(未写入磁盘的内存页)占系统内存的比例,设为5-10,触发后台写进程(DBWn
)异步写入磁盘。vm.dirty_ratio
:脏页占系统内存的最大比例,设为10-20,超过则阻塞用户进程,强制写入磁盘。shmmax
:单个共享内存段的最大大小,需大于SGA_MAX_SIZE
(如SGA_MAX_SIZE
为8G,则shmmax
设为8G+1M)。shmall
:共享内存总页数,计算公式:shmmax / PAGE_SIZE
(如shmmax
为8G,PAGE_SIZE
为4KB,则shmall
为2097152)。内存优化是持续过程,需通过监控工具识别瓶颈并调整:
V$SYSSTAT
(查看缓冲区命中率)、V$LIBRARYCACHE
(查看共享池命中率)、V$PGASTAT
(查看PGA使用情况)等视图,手动监控内存指标。