oracle数据库的内存设置是影响数据库性能的核心配置之一,合理分配内存资源可以让数据库更高效地处理查询、写入等操作,减少磁盘IO带来的性能损耗。不同的业务场景和硬件配置需要匹配不同的内存设置方案,用户可以根据实际需求选择自动管理或者手动调整的方式完成配置。

oracle内存的核心组成
oracle的内存结构主要分为系统全局区(SGA)和程序全局区(PGA)两大部分,理解这两个部分的作用才能做好内存设置。
SGA的作用与组成
SGA是oracle实例的共享内存区域,所有连接到数据库的会话都可以访问这部分内存,主要包含以下几个核心组件:
- 数据库缓冲区缓存:用于缓存从磁盘读取的数据块,减少磁盘IO次数
- 共享池:缓存SQL语句、执行计划、数据字典信息等共享数据
- 重做日志缓冲区:缓存事务产生的重做日志数据,再批量写入重做日志文件
- 大池:用于备份恢复、并行查询等操作的额外内存分配
- Java池:如果数据库使用Java相关功能,会在这里分配内存
PGA的作用与组成
PGA是每个服务器进程私有的内存区域,只能被对应的进程访问,主要包含排序区、会话信息、游标状态等内容,用于处理单个会话的排序、哈希连接等操作。
自动内存管理方式设置
oracle提供了自动内存管理(AMM)功能,只需要设置一个总内存参数,数据库会自动在SGA和PGA之间分配内存,同时自动调整SGA内部各个组件的大小,适合大多数常规场景使用。
设置步骤
首先登录到oracle数据库,使用sysdba权限连接:
-- 登录数据库 sqlplus / as sysdba -- 查看当前内存相关参数 show parameter memory show parameter sga show parameter pga
如果要启用自动内存管理,只需要设置memory_target参数即可,这个参数表示oracle实例可以使用的最大内存总量,同时需要设置memory_max_target作为内存上限,这个参数需要重启数据库才能生效。
-- 设置内存上限,需要重启生效 alter system set memory_max_target=4G scope=spfile; -- 设置当前内存目标,动态生效 alter system set memory_target=4G scope=both; -- 重启数据库使memory_max_target生效 shutdown immediate; startup;
设置完成后可以再次查看参数确认配置是否生效:
-- 确认参数配置 show parameter memory_target show parameter memory_max_target
手动内存管理方式设置
如果业务场景对内存分配有特殊要求,也可以选择手动管理内存,此时需要分别设置SGA和PGA的大小,同时可以手动调整SGA内部各个组件的参数。
基础参数设置
手动管理时需要先关闭自动内存管理相关参数,再分别设置SGA和PGA的总大小:
-- 关闭自动内存管理 alter system set memory_target=0 scope=both; alter system set memory_max_target=0 scope=spfile; -- 设置SGA总大小,scope=both表示动态生效且写入参数文件 alter system set sga_target=3G scope=both; -- 设置SGA最大上限,重启生效 alter system set sga_max_size=3G scope=spfile; -- 设置PGA总大小 alter system set pga_aggregate_target=1G scope=both; -- 重启数据库使sga_max_size生效 shutdown immediate; startup;
SGA内部组件手动调整
如果需要手动调整SGA内部组件的大小,可以设置对应的参数,比如调整共享池和数据缓冲区的大小:
-- 设置共享池大小 alter system set shared_pool_size=1G scope=both; -- 设置数据库缓冲区缓存大小 alter system set db_cache_size=1.5G scope=both; -- 设置重做日志缓冲区大小 alter system set log_buffer=16M scope=spfile;
注意部分SGA组件的参数修改需要重启数据库才能生效,修改前可以先查看参数的可修改属性。
内存设置的注意事项
- 设置的内存总量不能超过服务器物理内存的70%到80%,需要预留部分内存给操作系统和其他进程使用,避免服务器出现内存交换影响性能
- 如果业务中有大量排序、哈希连接操作,可以适当调大PGA的大小,减少临时表空间的使用
- 修改内存参数前建议先备份当前的参数文件,避免配置错误导致数据库无法启动
- 生产环境修改参数前最好在测试环境验证,确认参数调整不会影响业务正常运行
- 如果启用了自动内存管理,不要同时手动设置SGA或者PGA内部组件的参数,避免和自动管理机制冲突
常见问题排查
如果设置内存后出现数据库无法启动的情况,可以检查参数文件中的配置是否正确,比如内存设置超过了服务器实际物理内存,或者参数语法错误。此时可以启动数据库到nomount状态,修改错误参数后再正常启动:
-- 启动到nomount状态 startup nomount; -- 修改错误参数 alter system set memory_target=2G scope=spfile; -- 关闭再正常启动 shutdown immediate; startup;
如果数据库运行过程中出现内存不足的情况,可以通过动态性能视图查看内存使用情况,判断是否需要调整内存参数:
-- 查看SGA使用情况 select * from v$sga_dynamic_components; -- 查看PGA使用情况 select * from v$pgastat;