在调整Oracle内存参数前,需先确认系统是否有足够的可用内存,避免因系统内存耗尽导致Oracle无法分配内存。
top命令(按M键按内存使用率排序)或free -h命令,重点关注**可用内存(available)和已用内存(used)**的比例。若可用内存接近0,需先释放系统内存(如终止占用内存高的非关键进程,参考kill -9 <PID>命令)。ipcs -l查看共享内存最大段数(max number of segments)和最大总大小(max total shared memory),若数值过小,需修改/etc/sysctl.conf文件调整:kernel.shmall = 系统总内存页数(如16GB内存=16*1024*1024/4=4194304页)
kernel.shmmax = 单个共享内存段最大大小(如16GB=16*1024*1024*1024=17179869184字节)
kernel.shmmni = 系统共享内存段最大数量(默认4096,一般无需修改)
修改后执行sysctl -p使配置生效。Oracle内存不足多因SGA或PGA设置过大,或未启用自动内存管理(AMM),需根据实例负载调整参数:
-- 以SYSDBA身份连接数据库
ALTER SYSTEM SET MEMORY_MAX_TARGET = 13G SCOPE=SPFILE; -- 最大总内存(需重启生效)
ALTER SYSTEM SET MEMORY_TARGET = 12G SCOPE=SPFILE; -- 当前总内存(动态调整)
ALTER SYSTEM SET SGA_TARGET = 0 SCOPE=SPFILE; -- 关闭SGA单独管理
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0 SCOPE=SPFILE; -- 关闭PGA单独管理
重启数据库使配置生效:SHUTDOWN IMMEDIATE; STARTUP;SGA_TARGET(目标大小)和SGA_MAX_SIZE(最大大小),如ALTER SYSTEM SET SGA_TARGET=8G SCOPE=SPFILE; ALTER SYSTEM SET SGA_MAX_SIZE=8G SCOPE=SPFILE;。PGA_AGGREGATE_TARGET(PGA总大小),如ALTER SYSTEM SET PGA_AGGREGATE_TARGET=2G SCOPE=SPFILE;。即使参数设置合理,仍需优化内存使用,避免浪费:
SHARED_POOL_SIZE为0,并启用MEMORY_TARGET:ALTER SYSTEM SET SHARED_POOL_SIZE=0 SCOPE=SPFILE;
/etc/sysctl.conf中设置:vm.nr_hugepages = 大页数量(如16GB内存=16*1024/2=8192页,每页2MB)
执行sysctl -p生效,并在Oracle初始化参数中设置USE_LARGE_PAGES=TRUE。V$MEMORY_DYNAMIC_COMPONENTS视图监控内存组件变化,通过V$MEMORY_TARGET_ADVICE视图获取内存调整建议:SELECT * FROM V$MEMORY_TARGET_ADVICE ORDER BY MEMORY_SIZE;
通过以上步骤,可有效解决CentOS环境下Oracle数据库内存不足的问题。需根据实例负载和系统资源灵活调整,优先推荐使用AMM简化管理。