-- 计算 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_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;
重启数据库实例:
-- 设置 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 组件的大小是颗粒大小的倍数。
在生产环境中调整内存参数前,务必在测试环境进行验证。
调整内存参数后,应密切监控数据库性能指标。