上一期发布了关于oracle数据库安装后的参数优化文档,此文档只给出了参考指引,没有给出对应的设置规则,接下来几期文档将详细的写写配置规则相关的给大家参考,这里列举依然是常规设置,实际项目中还是需要根据实际情况灵活调整。
本期继续分享内存自动管理参数调优相关部分,自动内存管理(AMM)可以简化管理工作,并提升数据库性能。主要是MEMORY_TARGET
和MEMORY_MAX_TARGET
参数。
注意:所有内存参数的修改都应在测试环境充分验证后再应用于生产环境,避免因内存分配不当导致数据库性能问题或实例无法启动。
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
初始值:
sql
-- 计算 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
的设置。
sql
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
-
执行设置命令:
sql-- 以 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;
-
重启数据库实例:
sqlSHUTDOWN IMMEDIATE; STARTUP;
2.3 验证设置
-
检查参数值:
sqlSHOW PARAMETER TARGET;
输出中应看到
MEMORY_TARGET
和MEMORY_MAX_TARGET
已设置,而SGA_TARGET
和PGA_AGGREGATE_TARGET
为 0。 -
查看内存组件当前大小:
sqlSELECT 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:
sql-- 设置 MEMORY_TARGET 为 0 ALTER SYSTEM SET MEMORY_TARGET = 0; -- 设置 SGA_TARGET 为非零值 ALTER SYSTEM SET SGA_TARGET = 8G; -- 重启实例 SHUTDOWN IMMEDIATE; STARTUP;
-
从手动内存管理切换到 ASMM:
sql-- 设置 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 组件的大小是颗粒大小的倍数。
- 在生产环境中调整内存参数前,务必在测试环境进行验证。
- 调整内存参数后,应密切监控数据库性能指标。
注意:本文档内容主要基于 Oracle 11g 及以后版本。对于 Oracle 10g,请参考 ASMM 相关文档。具体参数和行为可能因 Oracle 数据库版本不同而略有差异,建议以对应版本的官方文档为准。