Oracle 内存优化是通过合理分配和管理数据库内存资源,最大限度减少磁盘 IO 操作,从而提升数据库整体性能的核心技术。内存速度比磁盘快 1000 倍以上,因此让尽可能多的热点数据和代码留在内存中是 Oracle 性能优化的第一原则。
1、内存优化基础
1.1、什么是 Oracle 内存优化
Oracle 内存优化是一个系统性工程,它通过调整内存管理模式、分配 SGA/PGA 大小、优化内存组件使用和操作系统内存配置,实现以下三个核心目标:
- 提高缓存命中率:让更多的数据和 SQL 执行计划留在内存中,减少磁盘 IO
- 避免内存交换:确保 Oracle 内存完全驻留在物理内存中,不被操作系统交换到磁盘
- 合理分配资源:在 SGA 和 PGA 之间、各个内存组件之间平衡资源分配,避免出现内存瓶颈
1.2、Oracle 内存整体架构
Oracle 数据库的内存主要分为两大区域:
1.2.1、系统全局区 (SGA):所有进程共享的内存区域
- 数据库缓冲池 (Database Buffer Cache):缓存数据块
- 共享池 (Shared Pool):缓存SQL执行计划和数据字典
- 重做日志缓冲区 (Redo Log Buffer):缓存重做日志
- 大池 (Large Pool):用于RMAN备份、并行查询等
- Java池 (Java Pool):用于Java程序执行
1.2.2、程序全局区 (PGA):每个服务器进程私有的内存区域
- 排序区 (Sort Area):用于ORDER BY、GROUP BY等排序操作
- 哈希连接区 (Hash Area):用于哈希连接操作
- 位图合并区 (Bitmap Merge Area):用于位图索引操作
- 会话内存 (Session Memory):存储会话信息和游标状态
1.3、内存优化的核心原则
- 内存优先原则:优先将内存分配给数据库,至少保留 20-25% 的物理内存给操作系统
- 避免交换原则:绝对不能让 Oracle 内存被交换到磁盘,否则性能会下降 100 倍以上
- 自动管理优先原则:优先使用 Oracle 自动内存管理功能,减少人工干预
- 按需分配原则:根据业务负载特点分配内存,OLTP 系统侧重 SGA,OLAP 系统侧重 PGA
2、内存管理模式
2.1、自动内存管理 (AMM)
- 原理 :只需要设置一个总内存参数
MEMORY_TARGET,Oracle 自动在 SGA 和 PGA 之间动态分配内存 - 优点:配置简单,适合负载变化较大的系统
- 缺点:与 Linux 大页 (HugePages) 不兼容,不适合大内存系统 (>16GB)
- 适用场景:Windows 系统、测试环境、小型数据库 (<8GB)
- 配置方法:
sql
-- 设置总内存为16GB,最大为20GB
ALTER SYSTEM SET MEMORY_TARGET=16G SCOPE=BOTH;
ALTER SYSTEM SET MEMORY_MAX_TARGET=20G SCOPE=SPFILE;
2.2、自动共享内存管理 (ASMM)
- 原理:分别设置 SGA 和 PGA 的总大小,Oracle 自动在 SGA 内部组件之间动态分配内存
- 优点:稳定可靠,支持大页,适合生产环境
- 缺点:需要手动分配 SGA 和 PGA 的比例
- 适用场景:Linux 系统、生产环境、中大型数据库 (>8GB)
- 配置方法:
sql
-- 禁用AMM
ALTER SYSTEM SET MEMORY_TARGET=0 SCOPE=SPFILE;
-- 设置SGA总大小为12GB,最大为16GB
ALTER SYSTEM SET SGA_TARGET=12G SCOPE=BOTH;
ALTER SYSTEM SET SGA_MAX_SIZE=16G SCOPE=SPFILE;
-- 设置PGA总大小为4GB,最大为8GB
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=4G SCOPE=BOTH;
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=8G SCOPE=SPFILE;
2.3、手动内存管理
- 原理:手动设置每个内存组件的大小,Oracle 不进行自动调整
- 优点:控制最精细,适合对数据库负载非常了解的 DBA
- 缺点:维护成本高,容易出现内存分配不合理的问题
- 适用场景:特殊负载的数据库、需要极致性能优化的系统
- 配置方法:
sql
-- 禁用ASMM
ALTER SYSTEM SET SGA_TARGET=0 SCOPE=SPFILE;
-- 手动设置各个组件大小
ALTER SYSTEM SET DB_CACHE_SIZE=8G SCOPE=BOTH;
ALTER SYSTEM SET SHARED_POOL_SIZE=2G SCOPE=BOTH;
ALTER SYSTEM SET LARGE_POOL_SIZE=512M SCOPE=BOTH;
ALTER SYSTEM SET LOG_BUFFER=64M SCOPE=SPFILE;
实例:内存分配不足导致系统全面卡顿
**S(Situation - 情境):**某公司 ERP 系统突然全面卡顿,订单录入响应时间从 1 秒升至 25 秒。服务器配置 32GB 物理内存,但 Oracle 仅分配了 8GB,剩余内存被 3 个无关应用占用,操作系统交换空间使用率达 85%。
**T(Task - 任务):**1 小时内恢复系统正常运行,不中断生产线业务。
A(Action - 行动):
1、立即停止 3 个非核心应用,释放 16GB 内存
2、临时调整 Oracle SGA 从 8GB 增至 20GB,PGA 从 2GB 增至 4GB
3、刷新共享池和缓冲池,清除无效缓存
4、配置操作系统内存锁定,防止 Oracle 内存被交换
**R(Result - 结果):**15 分钟内系统响应时间恢复至 1.2 秒,并交换空间使用率降至 0%;后续完成内存扩容至 64GB,彻底解决内存瓶颈。