Oracle数据库的内存管理主要分为三种模式,需根据业务需求选择:
memory_target和memory_max_target参数自动分配SGA(系统全局区)与PGA(程序全局区)的内存,无需单独设置各组件大小。sga_target(SGA总大小)和pga_aggregate_target(PGA总大小),SGA内的缓冲区缓存、共享池等组件可自动调整,PGA仍需手动配置。db_cache_size数据库缓存、shared_pool_size共享池)和PGA的各个组件(如sort_area_size排序区),适用于对内存分配有精细需求的场景。连接Oracle数据库(使用sqlplus / as sysdba),执行以下命令查看当前内存参数:
-- 查看内存目标参数
SHOW PARAMETER TARGET;
-- 查看SGA组件详情
SELECT * FROM V$SGAINFO;
-- 查看PGA组件详情
SELECT * FROM V$PGA_AGGREGATE_TARGET_ADVICE;
若要启用AMM,需修改SPFILE(永久参数):
-- 设置内存总目标(建议为物理内存的50%-70%,需预留系统内存)
ALTER SYSTEM SET MEMORY_TARGET = 16G SCOPE=SPFILE;
-- 设置内存最大目标(避免内存过度分配)
ALTER SYSTEM SET MEMORY_MAX_TARGET = 32G SCOPE=SPFILE;
-- 关闭SGA/PGA单独设置(设为0)
ALTER SYSTEM SET SGA_TARGET = 0 SCOPE=SPFILE;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0 SCOPE=SPFILE;
若要启用ASMM(而非完全AMM),则设置sga_target和pga_aggregate_target(不为0):
ALTER SYSTEM SET SGA_TARGET = 8G SCOPE=SPFILE;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 2G SCOPE=SPFILE;
修改参数后,需重启数据库使更改生效:
SHUTDOWN IMMEDIATE;
STARTUP;
为提升Oracle内存使用效率,需调整Ubuntu系统内核参数:
编辑sysctl.conf文件:
sudo vim /etc/sysctl.conf
添加或修改以下参数(根据物理内存调整):
# 共享内存段最大大小(建议大于memory_max_target)
kernel.shmmax = 34359738368 # 32GB
# 共享内存总页数(每页4KB,需与shmmax匹配)
kernel.shmall = 8388608 # 32GB/4KB
# 大页数量(可选,用于减少内存碎片)
vm.nr_hugepages = 1024
# 减少系统使用交换空间的倾向(0-100,建议10以下)
vm.swappiness = 10
应用内核参数:
sudo sysctl -p
关闭不必要的服务: 释放系统内存,减少与Oracle的资源竞争:
sudo systemctl stop unneeded_service # 如apache2、mysql等非必需服务
sudo systemctl disable unneeded_service
SGA与PGA比例:
大页内存(HugePages):
启用大页可提高内存访问效率,减少内存碎片。需在/etc/sysctl.conf中设置vm.nr_hugepages(如1024对应4GB大页内存),并在Oracle中启用大页(通过sqlnet.ora或listener.ora配置)。
监控与调整:
-- 查看内存动态组件变化
SELECT * FROM V$MEMORY_DYNAMIC_COMPONENTS;
-- 查看内存调整操作记录
SELECT * FROM V$MEMORY_RESIZE_OPS;
memory_target或sga_target参数,避免内存浪费或不足。