Oracle作为内存密集型数据库,需优化Linux内核参数以支持其内存需求:
总共享内存(字节)/页大小(如8G内存、4K页大小,shmall=2097152)。大页内存可减少页表管理开销,提升Oracle内存访问效率:
大页数量 = (SGA大小 + PGA大小) / 大页尺寸(Linux默认大页尺寸为2M,如SGA+PGA=6G,则需3072个大页)。/etc/sysctl.conf文件,添加vm.nr_hugepages=3072。sysctl -p使配置生效。grep HugePages_ /proc/meminfo,确认HugePages_Free大于0。SGA(系统全局区)是Oracle实例共享的内存池,包含共享池、缓冲池、重做日志缓冲等组件,其管理方式分为手动和自动两种。
使用以下SQL命令查看SGA各组件大小及总配置:
SHOW PARAMETER sga_target;
SHOW PARAMETER sga_max_size;
SHOW SGA;
sga_target表示SGA目标大小(动态调整),sga_max_size表示SGA允许的最大大小。
db_cache_size、shared_pool_size),灵活性高但对管理员要求高。sga_target参数自动分配SGA各组件内存,Oracle根据负载动态调整(如共享池使用率高时,自动从缓冲池分配内存)。ALTER SYSTEM SET sga_target=4G SCOPE=SPFILE;
ALTER SYSTEM SET sga_max_size=4G SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
SHOW PARAMETER sga_target;
SHOW PARAMETER sga_max_size;
Oracle 10g引入ASMM,通过sga_target参数自动管理SGA各组件(共享池、缓冲池等),无需单独设置各组件大小。若需启用ASMM:
MEMORY_TARGET=0(禁用自动内存管理)。sga_target>0(如ALTER SYSTEM SET sga_target=4G SCOPE=SPFILE)。PGA(程序全局区)是Oracle服务器进程的私有内存,包含排序区、游标状态区、会话信息区等,其管理方式分为手动和自动两种。
使用以下SQL命令查看PGA相关参数及使用情况:
SHOW PARAMETER pga_aggregate_target;
SHOW PARAMETER workarea_size_policy;
SELECT * FROM V$PGASTAT;
pga_aggregate_target表示PGA总大小(动态调整),workarea_size_policy表示PGA管理模式(AUTO/MANUAL)。
sort_area_size、hash_area_size),每个连接使用相同内存,灵活性低。pga_aggregate_target参数设置PGA总大小,Oracle根据负载动态分配各进程PGA内存(如排序操作需更多内存时,自动分配)。ALTER SYSTEM SET pga_aggregate_target=1G SCOPE=SPFILE;
ALTER SYSTEM SET workarea_size_policy=AUTO SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
V$SGASTAT视图查看SGA各组件内存使用详情:SELECT * FROM V$SGASTAT ORDER BY BYTES DESC;
V$SGAUSAGE视图查看SGA各组件使用率:SELECT * FROM V$SGAUSAGE;
V$PGASTAT视图查看PGA总使用量、工作区使用情况:SELECT * FROM V$PGASTAT;
V$PROCESS视图查看单个进程PGA使用量:SELECT PID, PROGRAM, PGA_USED_MEM, PGA_ALLOC_MEM, PGA_FREEABLE_MEM
FROM V$PROCESS ORDER BY PGA_USED_MEM DESC;