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)
  • 配置方法
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,彻底解决内存瓶颈。

相关推荐
学代码的真由酱1 小时前
MySQL数据库进阶-数据库设计实践-Java
数据库·mysql·数据库设计
遇事不決洛必達1 小时前
【数据库系列】本地映射云服务器Mysql的方法
服务器·数据库·mysql·定时任务
海鸥-w1 小时前
用python (fastapi)做项目第一天创建项目结构,数据建表,ORM配置安装,写第一个接口
数据库·python·fastapi
zfoo-framework2 小时前
通过redis-cli+lua脚本查询redis数据
数据库·redis·lua
牛栓柱2 小时前
【后端实战】用 Supabase + React/TS 零成本构建高并发 Multi-Agent 服务
前端·数据库·人工智能·后端·react.js·前端框架
yyuuuzz2 小时前
谷歌云基础服务的入门认知
linux·运维·服务器·数据库·人工智能·github
超梦dasgg3 小时前
工作中 MySQL 读写分离主从延迟:成因、影响、落地方案、生产实战处理
数据库·mysql
Wonderful U3 小时前
Python+Django实战:打造智能生鲜果蔬进销存管理系统(采购入库、库存预警、销售开单、毛利统计)
数据库·python·django
Demon1_Coder3 小时前
Day4-微服务-Seata默认事务
java·数据库·微服务