Oracle数据库的内存结构主要分为系统全局区SGA和程序全局区PGA两大部分,合理的内存设置需要结合业务负载、服务器硬件资源等多方面因素综合调整,不同的业务场景对应的参数配置也存在明显差异。

Oracle内存结构核心组成
系统全局区SGA
SGA是一组共享的内存结构,存储了Oracle数据库实例的数据和控制信息,所有服务器进程和后台进程都可以访问这部分内存,核心组件包括:
- 数据库缓冲区缓存:存储从数据文件中读取的数据块,减少磁盘IO次数
- 共享池:缓存SQL语句、执行计划、数据字典信息等共享数据
- 重做日志缓冲区:缓存事务产生的重做日志条目,写入重做日志文件前临时存储
- 大池:用于备份恢复、并行查询等场景的内存分配,避免占用共享池资源
- Java池:为数据库中运行的Java代码提供内存空间
程序全局区PGA
PGA是服务器进程私有的内存区域,每个服务器进程都有自己独立的PGA,其他进程无法访问,主要存储会话相关的私有数据,比如排序操作的内存、会话变量、游标状态等。
核心内存参数说明
SGA相关参数
| 参数名 | 含义 | 配置建议 |
|---|---|---|
| sga_max_size | SGA的最大可用大小,是静态参数,修改后需要重启实例生效 | 建议设置为服务器物理内存的40%-50%,不超过操作系统内存的60% |
| sga_target | SGA的自动管理目标大小,设置为非0值时开启SGA自动内存管理 | 可以设置为和sga_max_size相同的值,让Oracle自动调整SGA内部组件大小 |
| db_cache_size | 数据库缓冲区缓存的最小大小,SGA自动管理时可以不设置 | OLTP系统建议设置为SGA的50%左右,OLAP系统可适当提高 |
| shared_pool_size | 共享池的最小大小,SGA自动管理时可以不设置 | OLTP系统建议设置为SGA的20%-30%,避免共享池过小导致SQL硬解析过多 |
PGA相关参数
| 参数名 | 含义 | 配置建议 |
|---|---|---|
| pga_aggregate_target | PGA的自动管理目标大小,设置为非0值时开启PGA自动内存管理 | 建议设置为服务器物理内存的20%-30%,OLAP系统可适当提高 |
| workarea_size_policy | 工作区内存管理策略,auto表示自动管理,manual表示手动管理 | 建议设置为auto,由Oracle自动分配排序、哈希连接等操作的内存 |
内存设置实操步骤
查看当前内存配置
可以先通过以下SQL查看当前实例的内存参数配置情况:
-- 查看SGA相关参数
SELECT name, value
FROM v$parameter
WHERE name IN ('sga_max_size', 'sga_target', 'db_cache_size', 'shared_pool_size');
-- 查看PGA相关参数
SELECT name, value
FROM v$parameter
WHERE name IN ('pga_aggregate_target', 'workarea_size_policy');
-- 查看SGA和PGA的实际使用情况
SELECT * FROM v$sga;
SELECT * FROM v$pgastat;
修改内存参数
如果是测试环境或者可以重启实例的生产环境,可以先修改sga_max_size,再调整其他参数:
-- 修改SGA最大大小,需要重启实例生效 ALTER SYSTEM SET sga_max_size=4G SCOPE=SPFILE; -- 修改SGA自动管理目标大小 ALTER SYSTEM SET sga_target=4G SCOPE=BOTH; -- 修改PGA自动管理目标大小 ALTER SYSTEM SET pga_aggregate_target=2G SCOPE=BOTH; -- 重启实例使sga_max_size生效 SHUTDOWN IMMEDIATE; STARTUP;
如果是不能重启的生产环境,可以直接调整sga_target和pga_aggregate_target,只要sga_target不超过sga_max_size即可:
-- 动态修改SGA目标大小,不需要重启 ALTER SYSTEM SET sga_target=3G SCOPE=BOTH; -- 动态修改PGA目标大小,不需要重启 ALTER SYSTEM SET pga_aggregate_target=1.5G SCOPE=BOTH;
内存设置验证与问题排查
修改参数后可以通过以下方式验证内存是否生效:
- 查询v$parameter视图确认参数值已经更新
- 查询v$sga和v$pgastat视图查看实际内存使用情况
- 观察数据库的性能指标,比如缓存命中率、SQL解析次数、磁盘IO次数等是否有改善
如果遇到内存设置不合理的问题,比如数据库启动失败提示内存不足,可以检查服务器的物理内存和swap空间是否足够,也可以适当降低sga_max_size和pga_aggregate_target的值。如果数据库运行中出现内存溢出的情况,可以查看alert日志和后台进程日志,定位是SGA还是PGA的内存分配出现问题,再针对性调整对应参数。