重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 372|回复: 0
打印 上一主题 下一主题

[Oracle] Oracle数据库内存自动管理参数优化指南

[复制链接]
跳转到指定楼层
楼主
发表于 2026-1-11 23:21:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Oracle 数据库内存自动管理(AMM)优化指南
1 自动内存管理(AMM)概述
自动内存管理(Automatic Memory Management, AMM)是 Oracle 数据库简化内存配置的重要特性,从 Oracle 11g 开始引入。它允许数据库实例自动在系统全局区(SGA)和程序全局区(PGA)之间分配内存。

1.1 核心参数
MEMORY_TARGET:动态初始化参数,指定 Oracle 实例当前使用的总内存大小 (SGA + PGA)。可以在实例运行时修改,但不能超过 MEMORY_MAX_TARGET 的值。默认值为 0。
MEMORY_MAX_TARGET:静态初始化参数,定义 MEMORY_TARGET 所能设置的上限。修改此参数需要重启数据库实例才能生效。默认值为 0。
1.2 工作原理
启用 AMM 后,Oracle 数据库会根据系统负载的变化,自动在 SGA 和 PGA 之间动态调整内存分配。它使用一个名为 MMAN (Memory Manager) 的后台进程来协调此调整过程。

1.3 受管理的内存组件
启用 AMM 时,以下 SGA 和 PGA 组件将自动设置大小:

SGA_TARGET 和 SGA_MAX_SIZE
DB_CACHE_SIZE
SHARED_POOL_SIZE
LARGE_POOL_SIZE
JAVA_POOL_SIZE
STREAMS_POOL_SIZE
PGA_AGGREGATE_TARGET
注意:重做日志缓冲区(LOG_BUFFER)不受自动内存管理功能控制,仍需手动设置大小。

2 参数计算规则与设置步骤
2.1 计算规则
2.1.1 通用内存分配原则
在专用数据库服务器上,一个常见的起点是将服务器总物理内存的 70% 到 80% 分配给 Oracle 使用。然后,将这 80% 的内存分配给 MEMORY_TARGET。

更具体的 PGA 设置起点可以参考:

OLTP 系统:PGA 约占分配给 Oracle 内存的 20%。
DSS 系统(查询使用大量内存):PGA 约占分配给 Oracle 内存的 50% 到 70%。
2.1.2 从现有配置计算
如果数据库已经从手动管理或自动共享内存管理(ASMM)运行了一段时间,可以通过以下查询来确定一个合理的 MEMORY_TARGET 初始值:

-- 计算 MEMORY_TARGET
SELECT sga.value + GREATEST(pga.value, max_pga.value) AS memory_target
FROM (SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = 'sga_target') sga,
     (SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = 'pga_aggregate_target') pga,
     (SELECT value FROM v$pgastat WHERE name = 'maximum PGA allocated') max_pga;
这个计算方法的逻辑是:MEMORY_TARGET = SGA_TARGET + PGA_AGGREGATE_TARGET 和 "maximum PGA allocated" 中的较大者。

对于从旧版本升级的情况,MEMORY_TARGET 的确定方式有所不同:

从 Oracle 10g 升级:MEMORY_TARGET = SGA_TARGET + PGA_AGGREGATE_TARGET
从 Oracle 9i 升级:MEMORY_TARGET = PGA_AGGREGATE_TARGET + 所有 SGA 组件(如 DB_CACHE_SIZE, SHARED_POOL_SIZE 等)之和
对于全新安装且无历史记录参考,Oracle 建议根据系统资源及限制,将 MEMORY_TARGET 初始设置为 1 至 3 GB,之后根据运行情况调整。
2.1.3 使用内存建议视图
Oracle 提供了 V$MEMORY_TARGET_ADVICE 视图,可预测不同内存大小对数据库性能的影响,帮助优化 MEMORY_TARGET 的设置。

SELECT * FROM V$MEMORY_TARGET_ADVICE ORDER BY MEMORY_SIZE;
查询结果中的 MEMORY_SIZE_FACTOR 为 1 的行显示了当前 MEMORY_TARGET 设置下的数据库时间。可以据此找到即使增加内存也无法进一步降低数据库时间的最小内存值,即为推荐的 MEMORY_TARGET 大小。

2.2 设置步骤示例
假设在一个物理内存为 16GB 的专用数据库服务器上配置 AMM。

确定内存值:

分配给 Oracle 的总内存:16 GB * 80% = 12.8 GB
设置 MEMORY_MAX_TARGET 为 13 GB (为未来调整留出空间)
设置 MEMORY_TARGET 为 12.8 GB
执行设置命令:

-- 以 SYSDBA 身份连接数据库
CONN / AS SYSDBA

-- 设置静态参数 MEMORY_MAX_TARGET (需要重启)
ALTER SYSTEM SET MEMORY_MAX_TARGET = 13G SCOPE=SPFILE;

-- 设置动态参数 MEMORY_TARGET
ALTER SYSTEM SET MEMORY_TARGET = 12.8G SCOPE=SPFILE;

-- 为让 Oracle 完全控制内存管理,将 SGA 和 PGA 目标设置为 0
ALTER SYSTEM SET SGA_TARGET = 0 SCOPE=SPFILE;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0 SCOPE=SPFILE;
重启数据库实例:

SHUTDOWN IMMEDIATE;
STARTUP;
2.3 验证设置
检查参数值:

SHOW PARAMETER TARGET;
输出中应看到 MEMORY_TARGET 和 MEMORY_MAX_TARGET 已设置,而 SGA_TARGET 和 PGA_AGGREGATE_TARGET 为 0。

查看内存组件当前大小:

SELECT component, current_size/(1024*1024) AS current_size_mb
FROM v$memory_dynamic_components
WHERE current_size != 0;
3 不同版本的差异
3.1 Oracle 10g
**自动共享内存管理 (ASMM)**:Oracle 10g 引入了 SGA 的自动管理,通过参数 SGA_TARGET 实现。
PGA 管理:PGA 通过参数 PGA_AGGREGATE_TARGET 进行自动管理,但 SGA 和 PGA 之间不会自动转移内存。
注意:Oracle 10g 没有 MEMORY_TARGET 和 MEMORY_MAX_TARGET 参数。
3.2 Oracle 11g
完整的 AMM:引入了 MEMORY_TARGET 和 MEMORY_MAX_TARGET 参数,支持在 SGA 和 PGA 之间自动重新分配内存。
支持性:AMM 在主流操作系统平台(如 Linux, Windows, Solaris, HP-UX, AIX)上得到支持。
3.3 Oracle 12c 及更高版本 (19c, 21c)
从 Oracle 12c 开始,AMM 的基本机制与 11g 保持一致。主要区别在于多租户架构的支持。

多租户环境:Oracle 12c 引入了多租户系统,允许一个容器数据库(CDB)包含多个可插拔数据库(PDB)。AMM 在 CDB 级别进行设置,内存会在所有 PDB 之间动态管理。
内存列式存储:12c 引入了内存选件(In-Memory Option),这是独立于 AMM 的特性。
Autonomous Database:19c 增强了自治数据库特性,但这主要是在云环境中的应用。
版本差异总结:

版本        内存管理特性        说明
Oracle 10g        ASMM + 自动 PGA 管理        SGA 和 PGA 分开管理,无 AMM
Oracle 11g        AMM 引入        支持 SGA 和 PGA 间自动内存分配
Oracle 12c/19c/21c        AMM 增强        支持多租户环境,内存列式存储等新特性
4 内存管理策略选择
Oracle 提供了多种内存管理策略,可以根据控制精度要求选择:

管理方式        控制级别        关键参数        说明
自动内存管理 (AMM)        全局自动        MEMORY_TARGET, MEMORY_MAX_TARGET        Oracle 自动分配 SGA 和 PGA。
自动共享内存管理 (ASMM)        SGA 自动        SGA_TARGET, SGA_MAX_SIZE        Oracle 自动调整 SGA 内部组件。
手动内存管理        完全手动        各 SGA 组件参数,PGA_AGGREGATE_TARGET        DBA 完全控制各部分内存大小。
切换示例:

从 AMM 切换到 ASMM:

-- 设置 MEMORY_TARGET 为 0
ALTER SYSTEM SET MEMORY_TARGET = 0;
-- 设置 SGA_TARGET 为非零值
ALTER SYSTEM SET SGA_TARGET = 8G;
-- 重启实例
SHUTDOWN IMMEDIATE;
STARTUP;
从手动内存管理切换到 ASMM:

-- 设置 SGA_TARGET
ALTER SYSTEM SET SGA_TARGET = 1G;
-- 将 SGA 各组件大小设置为 0,以便自动调整
ALTER SYSTEM SET SHARED_POOL_SIZE = 0;
ALTER SYSTEM SET DB_CACHE_SIZE = 0;
ALTER SYSTEM SET JAVA_POOL_SIZE = 0;
ALTER SYSTEM SET LARGE_POOL_SIZE = 0;
ALTER SYSTEM SET STREAMS_POOL_SIZE = 0;
5 监控与优化建议
5.1 监控视图
**V$MEMORY_DYNAMIC_COMPONENTS**:显示当前所有动态调整的内存组件的大小。
**V$MEMORY_TARGET_ADVICE**:提供关于 MEMORY_TARGET 的优化建议,预测不同内存大小对数据库性能的影响。
**V$SGAINFO**:查看 SGA 的概要信息。
**V$PGASTAT**:查看 PGA 的统计信息。
5.2 优化建议
**使用内存顾问 (Memory Advisor)**:通过 Oracle Enterprise Manager (EM) 或查询 V$MEMORY_TARGET_ADVICE 视图来获取内存大小调整建议。
设置最小值:即使使用 AMM,也可以为 SGA_TARGET 和 PGA_AGGREGATE_TARGET 设置非零值,作为自动调整的下限。
考虑工作负载类型:
OLTP 系统:通常需要更大的 SGA (Buffer Cache)。
DSS/OLAP 系统:通常需要更大的 PGA 以支持内存密集型查询操作。
注意 Linux 系统:在 Linux 上启用 AMM 时,Oracle 会使用 /dev/shm 共享内存文件系统。请确保 /dev/shm 的大小至少与 MEMORY_MAX_TARGET 相等。
6 重要注意事项
LOG_BUFFER:重做日志缓冲区的大小不受 AMM 控制,需要手动设置。
MEMORY_TARGET 是动态参数,可以在线修改,但不能超过 MEMORY_MAX_TARGET。
MEMORY_MAX_TARGET 是静态参数,修改后需重启实例生效。
在文本初始化参数文件中,如果省略 MEMORY_MAX_TARGET 但设置了 MEMORY_TARGET,则数据库自动将 MEMORY_MAX_TARGET 设置为 MEMORY_TARGET 的值。
如果仅设置了 MEMORY_MAX_TARGET 而未设置 MEMORY_TARGET,则 MEMORY_TARGET 默认为 0,需要手动设置。
内存颗粒(Granule)大小:在 Oracle 11g 的 Linux/Unix 环境中,如果 SGA 小于等于 1GB,内存颗粒大小为 4MB;如果 SGA 大于 1GB,内存颗粒大小为 16MB。SGA 组件的大小是颗粒大小的倍数。
在生产环境中调整内存参数前,务必在测试环境进行验证。
调整内存参数后,应密切监控数据库性能指标。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-17 20:57 , Processed in 0.226337 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表