在调整Oracle内存参数前,需先完成两项基础工作:
free -h查看Linux系统总内存、已用内存及剩余内存;通过top或vmstat监控系统内存使用趋势,确保有足够内存留给Oracle及操作系统(建议保留10%-20%给系统)。Oracle性能高度依赖Linux内核参数配置,需调整以下关键参数(修改/etc/sysctl.conf后执行sysctl -p生效):
kernel.shmmax:单个共享内存段的最大大小,需大于Oracle SGA大小(如SGA设为8GB,则设置为8589934592,即8GB的字节值);kernel.shmall:系统共享内存总页数(1页=4KB),计算公式为SGA大小(字节)/4096(如8GB SGA需设置为2097152);kernel.shmmni:系统共享内存段最大数量,默认4096,一般无需修改。fs.file-max:系统最大文件句柄数,建议设置为65536以上(满足大量并发连接需求);/etc/security/limits.conf,添加oracle soft nofile 65536、oracle hard nofile 65536(替换oracle为实际用户)。net.ipv4.ip_local_port_range:应用程序可用端口范围,建议设置为1024 65000(扩大端口池,避免连接瓶颈);net.core.rmem_default/net.core.wmem_default:网络接收/发送缓冲区默认大小,建议设置为262144(256KB);net.core.rmem_max/net.core.wmem_max:网络接收/发送缓冲区最大大小,建议设置为1048576(1MB)。vm.swappiness:控制系统使用交换分区(Swap)的倾向(0-100),建议设置为10以下(减少Swap使用,避免磁盘I/O拖累性能)。Oracle 10g及以上版本支持三种内存管理模式,需根据场景选择:
MEMORY_TARGET(动态调整的总内存,SGA+PGA)和MEMORY_MAX_TARGET(最大上限,静态参数)统一管理。适用于中小规模数据库或运维资源有限的环境(简化管理),但无法精细控制SGA与PGA比例。SGA_TARGET(SGA动态调整总大小)和PGA_AGGREGATE_TARGET(PGA总目标大小),Oracle自动调整SGA内部组件(共享池、缓冲区缓存等)及PGA的工作区内存。适用于中大型数据库(需平衡SGA与PGA需求),是当前主流推荐模式。SHARED_POOL_SIZE、DB_CACHE_SIZE等)及PGA的*_AREA_SIZE参数(如SORT_AREA_SIZE)。适用于核心生产库(需极致性能调优),但需频繁人工干预,易导致内存浪费。SGA是Oracle实例的共享内存区域,包含数据库缓冲区缓存、共享池、重做日志缓冲区等组件,需根据业务场景调整:
SGA_TARGET:设为SGA总大小(如5GB),Oracle自动分配各组件内存;SGA_MAX_SIZE:设为SGA_TARGET的1.2-1.5倍(如6GB),允许SGA动态扩展;SHARED_POOL_SIZE):存储SQL语句、PL/SQL代码等,建议占SGA的15%-25%(如5GB SGA设为800MB-1250MB)。需监控V$SHARED_POOL_ADVICE视图,避免共享池过小导致硬解析(命中率<95%需扩容);DB_CACHE_SIZE):缓存数据文件块,是SGA中占比最大的组件(如5GB SGA设为3-4GB)。需监控V$BUFFER_POOL_STATISTICS视图,确保缓冲区命中率>90%(可通过ALTER SYSTEM SET DB_CACHE_SIZE=4G SCOPE=BOTH调整);LOG_BUFFER):存储重做日志条目,建议设为1-2MB(默认值通常足够),无需频繁调整。PGA是每个Oracle进程的私有内存区域,用于存储排序、哈希连接等工作区,需根据工作负载类型调整:
PGA_AGGREGATE_TARGET参数控制(如ALTER SYSTEM SET PGA_AGGREGATE_TARGET=1.6G SCOPE=BOTH)。WORKAREA_SIZE_POLICY=AUTO,默认开启),Oracle会根据工作负载自动分配工作区内存;V$PGA_TARGET_ADVICE视图,获取不同PGA_AGGREGATE_TARGET值的性能建议(选择命中率>90%的最小值,避免过度分配);V$SQL_WORKAREA_ACTIVE视图识别长期处于ONEPASS或MULTIPASS模式的SQL(如大排序、哈希连接),重写SQL(增加过滤条件、创建索引)、使用绑定变量减少硬解析,或调整临时表空间(使用SSD存储、增大TEMPFILE大小)。调优后需持续监控内存使用情况,验证效果:
V$SGA_USAGE查看SGA各组件使用率(如缓冲区缓存命中率BUFFER_CACHE_HIT_RATIO);使用V$SGA_DYNAMIC_COMPONENTS查看SGA动态调整情况;V$PGASTAT查看PGA总使用量、工作区内存分配情况;使用V$PGA_TARGET_ADVICE_HISTOGRAM查看PGA目标值的性能分布;vmstat 1 5查看系统内存使用、Swap交换情况(理想状态下Swap使用为0);使用top查看Oracle进程的内存占用(RES列)。