在CentOS系统中配置Oracle数据库内存时,需遵循**“操作系统优先、SGA与PGA平衡、工作负载适配”**的原则:
在调整Oracle内存前,需确保CentOS系统内核参数支持Oracle的内存需求,主要修改/etc/sysctl.conf文件:
SGA_MAX_SIZE(建议设为物理内存的80%)。kernel.shmmax = 物理内存大小(字节) # 如16GB物理内存设为17179869184(16*1024*1024*1024)
shmmax(shmall = shmmax / PAGE_SIZE,PAGE_SIZE可通过getconf PAGE_SIZE获取,通常为4096字节)。kernel.shmall = shmmax / 4096 # 如shmmax=17179869184,则shmall=4194304
vm.swappiness = 10
修改后执行sysctl -p使参数生效。
SGA是Oracle实例的核心共享内存区,包含数据库缓冲区缓存(DB_CACHE_SIZE)、共享池(SHARED_POOL_SIZE)、重做日志缓冲区(LOG_BUFFER)、大型池(LARGE_POOL_SIZE)、Java池(JAVA_POOL_SIZE)等组件。Oracle 10g及以上版本推荐使用自动共享内存管理(ASMM),通过SGA_TARGET参数统一分配SGA总大小,Oracle会自动调整各组件比例。
-- 查看SGA总大小及各组件详情
SELECT * FROM V$SGA;
-- 查看SGA相关参数
SHOW PARAMETER SGA_TARGET;
SHOW PARAMETER SGA_MAX_SIZE;
若使用ASMM,只需设置SGA_TARGET(目标SGA大小)和SGA_MAX_SIZE(SGA最大大小),SGA_TARGET不应超过SGA_MAX_SIZE:
-- 设置SGA总大小为8GB(需根据物理内存调整)
ALTER SYSTEM SET SGA_TARGET = 8G SCOPE=SPFILE;
-- 设置SGA最大大小为10GB(预留扩容空间)
ALTER SYSTEM SET SGA_MAX_SIZE = 10G SCOPE=SPFILE;
-- 重启数据库使参数生效
SHUTDOWN IMMEDIATE;
STARTUP;
若需手动控制SGA组件比例(如优化共享池大小),可将SGA_TARGET设为0,单独设置各组件参数:
-- 关闭自动共享内存管理
ALTER SYSTEM SET SGA_TARGET = 0 SCOPE=SPFILE;
-- 手动设置共享池大小(建议占SGA的15%-25%)
ALTER SYSTEM SET SHARED_POOL_SIZE = 2G SCOPE=SPFILE;
-- 手动设置数据库缓冲区缓存大小(建议占SGA的50%-70%)
ALTER SYSTEM SET DB_CACHE_SIZE = 5G SCOPE=SPFILE;
-- 重启数据库
SHUTDOWN IMMEDIATE;
STARTUP;
-- 查看SGA当前使用情况
SELECT * FROM V$SGA_USAGE;
-- 查看SGA组件占比
SELECT COMPONENT, ROUND(SIZE/1024/1024, 2) AS SIZE_MB, ROUND(SIZE/SGA_TOTAL*100, 2) AS PCT
FROM V$SGA_COMPONENT_SUMMARY
ORDER BY SIZE DESC;
PGA是每个服务器进程的私有内存区,用于存储排序、哈希连接、游标状态等信息。Oracle 10g及以上版本推荐使用自动PGA内存管理(APMM),通过PGA_AGGREGATE_TARGET参数设置PGA总大小,Oracle会自动分配各进程的PGA内存。
-- 查看PGA总目标大小
SHOW PARAMETER PGA_AGGREGATE_TARGET;
-- 查看PGA使用统计
SELECT * FROM V$PGASTAT;
根据业务类型设置PGA_AGGREGATE_TARGET(占总内存的20%-50%,OLTP取小值,DSS取大值),并开启自动PGA管理(WORKAREA_SIZE_POLICY=AUTO,默认开启):
-- 设置PGA总目标为2GB(OLTP系统示例)
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 2G SCOPE=SPFILE;
-- 设置PGA总目标为4GB(DSS系统示例)
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 4G SCOPE=SPFILE;
-- 重启数据库使参数生效
SHUTDOWN IMMEDIATE;
STARTUP;
若需手动控制PGA组件(如调整排序区大小),可将WORKAREA_SIZE_POLICY设为MANUAL,并设置SORT_AREA_SIZE等参数:
-- 开启手动PGA管理
ALTER SYSTEM SET WORKAREA_SIZE_POLICY = MANUAL SCOPE=SPFILE;
-- 设置排序区大小为100MB
ALTER SYSTEM SET SORT_AREA_SIZE = 100M SCOPE=SPFILE;
-- 重启数据库
SHUTDOWN IMMEDIATE;
STARTUP;
-- 查看PGA当前使用情况
SELECT * FROM V$PGA_MEMORY_USAGE;
-- 查看PGA命中率(理想值≥90%)
SELECT ROUND((1 - (SUM(DECODE(NAME, 'sorts (memory)', VALUE, 0)) /
NULLIF(SUM(DECODE(NAME, 'sorts (memory)', VALUE, 0) + DECODE(NAME, 'sorts (disk)', VALUE, 0)), 0))) * 100, 2) AS SORT_HIT_RATIO
FROM V$SYSSTAT
WHERE NAME IN ('sorts (memory)', 'sorts (disk)');
top、vmstat等工具监控Oracle进程内存使用情况,若发现内存持续增长,需检查是否有内存泄漏(如未关闭的游标、异常的PL/SQL块)。memlock限制及vm.nr_hugepages参数)。WORKAREA_SIZE_POLICY;Oracle 9i及以下版本需手动管理PGA。