Oracle 内存优化

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)
  • 配置方法
-- 设置总内存为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)
  • 配置方法
-- 禁用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
  • 缺点:维护成本高,容易出现内存分配不合理的问题
  • 适用场景:特殊负载的数据库、需要极致性能优化的系统
  • 配置方法
-- 禁用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,彻底解决内存瓶颈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值