Oracle数据库的内存结构分为**系统全局区(SGA)和程序全局区(PGA)**两大核心组件:
大页内存可将内存页大小从默认的4KB扩大至2MB(或更大),减少页表项数量,降低内存管理开销,尤其适合Oracle这类内存密集型应用。
大页数量 = (Oracle SGA大小 + PGA大小) / 大页大小(如SGA=12GB、PGA=4GB,大页大小2MB,则需8000个)。/etc/sysctl.conf文件,添加vm.nr_hugepages=8000;执行sysctl -p使配置生效;修改Oracle用户权限(echo "oracle soft memlock 16384000" >> /etc/security/limits.conf,其中16384000=8000*2MB)。优化Linux内核参数以适配Oracle内存需求,避免因系统限制导致内存分配失败:
kernel.shmmax(单个共享内存段最大值,建议设为SGA大小或更大)、kernel.shmall(共享内存总页数,计算公式为总共享内存(字节)/页大小(4KB))、kernel.shmmni(共享内存段最大数量,默认4096,一般无需修改)。fs.file-max(系统最大文件句柄数,建议设为65536以上,满足Oracle多进程需求)、fs.aio-max-nr(异步I/O请求数量,建议设为65536以上)。net.core.rmem_default/net.core.rmem_max(接收缓冲区大小,建议设为262144以上)、net.core.wmem_default/net.core.wmem_max(发送缓冲区大小,建议设为262144以上)。vm.swappiness(系统使用交换空间的倾向,建议设为10以下,减少内存交换对性能的影响)。AMM是Oracle 11g及以上版本引入的特性,可自动在SGA和PGA之间动态分配内存,简化管理流程。
MEMORY_TARGET(Oracle实例总内存大小,包括SGA+PGA,建议设为物理内存的70%-80%)、MEMORY_MAX_TARGET(MEMORY_TARGET的上限,需重启生效)。ALTER SYSTEM SET MEMORY_MAX_TARGET=13G SCOPE=SPFILE; -- 设置上限
ALTER SYSTEM SET MEMORY_TARGET=12.8G SCOPE=SPFILE; -- 设置当前总内存
ALTER SYSTEM SET SGA_TARGET=0 SCOPE=SPFILE; -- 关闭SGA手动管理
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=0 SCOPE=SPFILE;-- 关闭PGA手动管理
SHUTDOWN IMMEDIATE; STARTUP; -- 重启生效
SHOW PARAMETER TARGET查看参数是否生效,V$MEMORY_DYNAMIC_COMPONENTS查看各内存组件当前大小。若未使用AMM,需手动调整SGA和PGA各组件大小:
DB_CACHE_SIZE(数据缓冲区,建议设为SGA的50%-70%,提升数据缓存命中率)、SHARED_POOL_SIZE(共享池,建议设为SGA的20%-30%,避免过大导致内存碎片)、LOG_BUFFER(重做日志缓冲区,建议设为16M-32M,无需过大)。PGA_AGGREGATE_TARGET(PGA总大小,OLTP系统建议设为Oracle总内存的20%,DSS系统设为50%-70%,适配不同负载需求)。ALTER SYSTEM SET DB_CACHE_SIZE=800M SCOPE=BOTH; -- 调整数据缓冲区
ALTER SYSTEM SET SHARED_POOL_SIZE=300M SCOPE=BOTH; -- 调整共享池
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=500M SCOPE=BOTH;-- 调整PGA
低效SQL是内存消耗的主要来源,需通过以下方式优化:
SELECT * FROM emp WHERE empno=1改为SELECT * FROM emp WHERE empno=:1)。SELECT *(只查询必要列)、合理使用分页(减少单次查询数据量),降低内存中的排序和缓存压力。ALTER SYSTEM FLUSH SHARED_POOL命令清理不再使用的SQL/PL/SQL代码(如长期未执行的存储过程),释放内存。ALTER SYSTEM FLUSH PGA_MEMORY命令清理PGA缓存(如排序区、会话内存),适用于PGA内存紧张的场景。V$SGA(查看SGA总大小及各组件分配)、V$SGASTAT(查看SGA各组件的详细使用情况,如缓冲区命中率)、V$BUFFER_POOL_STATISTICS(查看数据缓冲区的命中率,建议高于90%)。V$PGA(查看PGA总大小及使用情况)、V$PGASTAT(查看PGA内存使用统计,如排序区使用率)、V$PROCESS_MEMORY(查看每个进程的PGA使用情况)。DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT生成,包含内存使用趋势、SQL执行统计等信息,用于长期性能分析。