Oracle 的 PGA_AGGREGATE_LIMIT 参数
Oracle 的 PGA_AGGREGATE_LIMIT 参数
基本概念
PGA_AGGREGATE_LIMIT
是 Oracle 数据库 12c 引入的一个重要内存管理参数,用于限制所有服务器进程使用的 PGA(Program Global Area)内存总量。
参数作用
- 硬性限制:设置 PGA 内存使用的绝对上限
- 安全防护:防止 PGA 内存无限制增长导致系统内存耗尽
- 资源控制:确保系统有足够内存供操作系统和其他应用使用
默认值
- Oracle 12.1 及更高版本:
- 如果设置了
MEMORY_TARGET
或MEMORY_MAX_TARGET
,则默认值为MEMORY_MAX_TARGET
的 200% - 否则默认值为 2GB 或 120% 的
PGA_AGGREGATE_TARGET
(取两者中较大者),但不超过物理内存的 60%
- 如果设置了
设置方法
-- 查看当前值
SELECT name, value, display_value
FROM v$parameter
WHERE name = 'pga_aggregate_limit';-- 动态修改
ALTER SYSTEM SET pga_aggregate_limit = 8G SCOPE=BOTH;
工作原理
当 PGA 使用量接近限制时:
- Oracle 首先尝试通过终止使用最多 PGA 的非关键会话(如作业队列进程)来减少内存使用
- 如果仍超过限制,会终止使用最多 PGA 的会话(包括用户会话)
- 在警报日志中记录相关事件
监控 PGA 使用
-- 查看 PGA 总体使用情况
SELECT * FROM v$pgastat;-- 查看各进程 PGA 使用
SELECT program, pga_used_mem, pga_alloc_mem, pga_max_mem
FROM v$process
ORDER BY pga_used_mem DESC;-- 监控 PGA 限制接近情况
SELECT name, value
FROM v$pgastat
WHERE name IN ('total PGA allocated', 'total PGA inuse', 'over allocation count', 'cache hit percentage');
最佳实践建议
- 生产环境设置:建议显式设置此参数,通常为
PGA_AGGREGATE_TARGET
的 150-200% - 监控警报:设置警报监控
PGA_AGGREGATE_LIMIT
接近情况 - 调整依据:
- 观察
v$pgastat
中的 “over allocation count” 值 - 监控 “total PGA allocated” 与限制值的比率
- 观察
- 特殊场景:
- 内存密集型操作(如大型排序、哈希连接)较多的系统应设置更高限制
- OLTP 系统可以设置相对较低的限制
PGA_AGGREGATE_LIMIT
提供了比 PGA_AGGREGATE_TARGET
更强的控制,确保 PGA 内存使用不会失控。
更多内容请查看官方文档:
https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/PGA_AGGREGATE_LIMIT.html