【Oracle】内存管理实战指南:ASMM vs AMM 配置全解析

💬 "Oracle内存怎么调?ASMM和AMM有啥区别?"

------ 别再盲目设置 SGA=80% 了!今天我来当你的"Oracle内存管家",

带你科学分配内存,既不让数据库"饿着",也不让操作系统"窒息"!

今天我们来聊聊 Oracle 数据库的内存调优

这是一份来自一线运维的实战手册 ,覆盖 Linux/Windows + Oracle 11g/19c,专治"内存配置焦虑症"。


🎯 痛点引入:内存配置的"三大误区"

你是否遇到:

  • 🌀 误区1:听说"SGA=物理内存80%",就照搬?
  • 🐢 误区2:调完参数,数据库反而更慢了?
  • 🔁 误区3:服务器卡死,发现是操作系统没内存了?

别急,今天我们用科学方法,避开这些坑。


🧩 核心原理:Oracle内存的"双胞胎兄弟"

Oracle 内存管理有两大模式:

  1. AMM(Automatic Memory Management)全自动,Oracle统一管理SGA+PGA
  2. ASMM(Automatic Shared Memory Management)半自动,SGA自动,PGA手动

💡 类比:

  • AMM 像"全包式管家":你只给总预算(memory_target),他全权分配吃饭(SGA)和零花(PGA)。
  • ASMM 像"财务顾问":你定好饭钱(sga_target)和零花钱(pga_aggregate_target),他帮你优化。

🔍 决策指南:AMM 还是 ASMM?

操作系统 推荐模式 原因
Linux ASMM 更稳定,控制精细,避免大页(HugePages)冲突
Windows AMM Oracle官方推荐,集成度高,管理简单

📌 版本兼容性

  • Oracle 11g:AMM/ASMM 均支持
  • Oracle 19c :AMM 在某些平台已弃用强烈推荐 ASMM

🔧 实战配置:从备份到生效

📌 黄金法则:调参前,先备份!

✅ 第一步:备份参数文件(救命稻草!)

复制代码
Sql深色版本
-- 创建PFILE备份(文本文件,可读)
CREATE PFILE='/backup/initORCL.ora'FROM SPFILE;

💡 为什么备份?

如果参数设错导致数据库无法启动,可以用PFILE启动,再修正。


✅ 第二步:内存计算公式(16GB服务器示例)

假设服务器总内存:16GB (16384MB)

项目 计算 建议值
操作系统预留 至少 2GB 2048MB
Oracle可用 16384 - 2048 14336MB
ASMM (Linux)
sga_max_size 14336 × 70% 10035MB (~9.8G)
pga_aggregate_target 14336 × 30% 4300MB
AMM (Windows)
memory_max_target 14336MB 14336MB
memory_target 同上 14336MB

⚠️ 注意:

  • sga_max_size上限sga_target目标值,通常设相同。
  • pga_aggregate_target 是估算值,实际PGA可能略高。

✅ 第三步:配置 ASMM(Linux 推荐)

1. 清理旧的AMM参数(如果存在)

sql 复制代码
ALTER SYSTEM RESET memory_max_target SCOPE=SPFILE;
ALTER SYSTEM RESET memory_target SCOPE=SPFILE;

2. 设置 sga_max_size(静态参数 → 需重启)

sql 复制代码
ALTER SYSTEM SET sga_max_size=10035M SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;

3. 动态设置 sga_targetpga_aggregate_target

sql 复制代码
ALTER SYSTEM SET sga_target=10035M SCOPE=BOTH;
ALTER SYSTEM SET pga_aggregate_target=4300MSCOPE=BOTH;

4. 验证配置

sql 复制代码
SHOW PARAMETER sga;
SHOW PARAMETER pga;
SHOWPARAMETER memory;

预期输出

  • memory_target = 0
  • sga_target ≈ 10035M
  • pga_aggregate_target ≈ 4300M

✅ 第四步:配置 AMM(Windows 推荐)

1. 清理旧的ASMM参数

sql 复制代码
ALTER SYSTEM RESET sga_max_size SCOPE=SPFILE;
ALTER SYSTEM RESET sga_target SCOPE=SPFILE;
ALTER SYSTEM RESET pga_aggregate_target SCOPE=SPFILE;

2. 设置 memory_max_target(静态参数 → 需重启)

sql 复制代码
ALTER SYSTEM SET memory_max_target=14336M SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;

3. 动态设置 memory_target

sql 复制代码
ALTER SYSTEM SET memory_target=14336M SCOPE=BOTH;

4. 验证配置

sql 复制代码
SHOW PARAMETER memory;
SHOW PARAMETER sga;
SHOW PARAMETER pga;

预期输出

  • sga_target = 0
  • memory_target = 14336M

🔍 诊断/分析:如何验证内存健康?

1. 检查内存分配现状

sql 复制代码
-- 查看当前SGA组件大小
SELECT * FROM v$sga;

-- 查看PGA使用情况
SELECT * FROM v$pgastat;

-- 查看内存参数最终值
SELECT name,value FROM v$parameter WHERE name IN ('memory_target', 'sga_target', 'pga_aggregate_target');

2. 监控PGA使用率(防"内存溢出")

sql 复制代码
SELECT
    name,
value,
    unit
FROM v$pgastat
WHERE name IN ('total PGA allocated', 'total PGA inuse', 'over allocation count');

📌 关键指标

  • over allocation count > 0 → PGA严重不足,可能触发磁盘排序
  • total PGA inuse / pga_aggregate_target > 90% → 预警

最佳实践:内存调优"三不原则"

  1. 不贪多

    永远为操作系统预留至少 2GB,否则OS会疯狂Swap,拖垮整个系统。

  2. 不盲调

    先用 v$pgastatv$sga 分析现有使用情况,再决定是否调整。

  3. 不混用

    AMM 和 ASMM 参数不能共存 !确保非用的模式参数被 RESET


📣 总结:Oracle内存配置"速查表"

项目 Linux (ASMM) Windows (AMM)
核心参数 sga_target, pga_aggregate_target memory_target
最大内存 sga_max_size memory_max_target
静态参数 sga_max_size memory_max_target
动态参数 sga_target, pga_aggregate_target memory_target
推荐比例 SGA:PGA ≈ 7:3 memory_target = 可用内存
关键命令 RESET memory_* RESET sga_*, pga_*

💡 进阶提示

  • 大页(HugePages):在Linux上为ASMM启用HugePages,可显著降低CPU开销。
  • 19c 注意 :AMM 在 Exadata 和部分平台已弃用,新环境一律用 ASMM