💬 "Oracle内存怎么调?ASMM和AMM有啥区别?"
------ 别再盲目设置
SGA=80%
了!今天我来当你的"Oracle内存管家",带你科学分配内存,既不让数据库"饿着",也不让操作系统"窒息"!
今天我们来聊聊 Oracle 数据库的内存调优。
这是一份来自一线运维的实战手册 ,覆盖 Linux/Windows + Oracle 11g/19c,专治"内存配置焦虑症"。
🎯 痛点引入:内存配置的"三大误区"
你是否遇到:
- 🌀 误区1:听说"SGA=物理内存80%",就照搬?
- 🐢 误区2:调完参数,数据库反而更慢了?
- 🔁 误区3:服务器卡死,发现是操作系统没内存了?
别急,今天我们用科学方法,避开这些坑。
🧩 核心原理:Oracle内存的"双胞胎兄弟"
Oracle 内存管理有两大模式:
- AMM(Automatic Memory Management) :全自动,Oracle统一管理SGA+PGA
- 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_target
和 pga_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
= 0sga_target
≈ 10035Mpga_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
= 0memory_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% → 预警
✅ 最佳实践:内存调优"三不原则"
-
不贪多:
永远为操作系统预留至少 2GB,否则OS会疯狂Swap,拖垮整个系统。
-
不盲调:
先用
v$pgastat
、v$sga
分析现有使用情况,再决定是否调整。 -
不混用:
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。