自动驾驶领域热点简报(2026-04-26 ~ 2026-05-03)
2026/5/3 23:32:54
Oracle数据库的内存管理直接决定了实例运行稳定性与性能上限,核心围绕程序全局区(PGA)和系统全局区(SGA)的分配、调整与监控展开。
PGA是服务器进程独占的内存区域,分为固定PGA(保留内存,含原子变量与指针)和可变PGA(动态分配,含会话内存、私有SQL区)。其中核心子区域包括:
sort_area_size、hash_area_size等参数独立控制,易导致内存浪费。PGA_AGGREGATE_TARGET(全局PGA内存上限)和WORKAREA_SIZE_POLICY(自动/手动模式开关),数据库动态分配内存。PGA_AGGREGATE_TARGET:动态参数,取值范围10M~4095G,推荐配置公式:(物理内存×80%)×20%(侧重并发会话,PGA占比低)(物理内存×80%)×50%(侧重批量处理,需更多排序/哈希内存)WORKAREA_SIZE_POLICY:设为AUTO启用自动管理,MANUAL退化为手动模式(默认AUTO)。_use_realfree_heap(自动管理核心,设为TRUE时通过mmap()直接释放内存给OS,默认随PGA_AGGREGATE_TARGET自动启用)。MIN(5%×PGA_AGGREGATE_TARGET, 100MB),并行操作上限为30%×PGA_AGGREGATE_TARGET/DOP。PGA_AGGREGATE_TARGET动态调整(如≤500MB时为20%,>2.5GB时固定256MB)。-- 查看当前PGA配置showparameter pga_aggregate_target;showparameter workarea_size_policy;-- 动态调整PGA上限(无需重启实例)altersystemsetpga_aggregate_target=4096M scope=both;通过以下视图获取PGA运行状态,核心目标:optimal执行率≥90%,multipass执行率=0%:
-- 查看PGA整体统计selectname,value/1024/1024MBfromv$pgastat;-- 分析工作区执行效率selectname,value,100*value/(sum(value)over())pctfromv$sysstatwherenamelike'workarea executions%';利用v$pga_target_advice视图获取最优配置建议:
selectpga_target_for_estimate/1024/1024pgamb,estd_pga_cache_hit_percentage hit_pct,estd_overalloc_count overallocfromv$pga_target_adviceorderbypgamb;取estd_overalloc_count=0且hit_pct峰值对应的pgamb作为目标值。
SGA是实例启动时分配的共享内存区域,包含固定区(控制信息、Latch)、Buffer Cache(数据块缓存)、Shared Pool(SQL解析树、执行计划)、Redo Log Buffer(重做日志缓存)等组件,Oracle10g后新增Streams Pool(流特性专用)。
db_block_buffers控制Buffer Cache)。SGA_MAX_SIZE预留虚拟地址,支持在线调整db_cache_size等组件。SGA_TARGET参数统一控制各组件分配,MMAN进程动态调整。MEMORY_TARGET统一管理SGA+PGA,彻底简化配置。SGA_MAX_SIZE:SGA最大上限,需大于等于所有组件内存之和,建议设为物理内存的50%~70%(避免抢占OS内存)。SGA_TARGET(10g+):动态参数,自动分配Buffer Cache、Shared Pool等组件内存,无需单独配置子参数。MEMORY_TARGET(11g+):统一管理SGA+PGA,建议设为物理内存的80%,无需单独配置SGA_TARGET和PGA_AGGREGATE_TARGET。SGA依赖操作系统共享内存段,需调整shmmax参数(单个共享内存段最大值):
# Linux临时修改(重启失效)echo1610612736>/proc/sys/kernel/shmmax# 永久修改(/etc/sysctl.conf)kernel.shmmax=1610612736sysctl -p# 生效建议shmmax≥SGA_MAX_SIZE,避免SGA分散为多个共享内存段。
-- 11g+启用AMMaltersystemsetmemory_max_target=8192M scope=spfile;altersystemsetmemory_target=8192M scope=spfile;-- 10g动态调整Buffer Cachealtersystemsetdb_cache_size=2048M scope=memory;-- 查看SGA组件分配selectcomponent,current_size/1024/1024mbfromv$sga_dynamic_components;针对不同数据访问特性,将Buffer Cache分为三类池,避免高频数据被挤出内存:
-- 配置Keep池(存储高频访问表)altersystemsetdb_keep_cache_size=512M scope=both;-- 配置Recycle池(存储一次性访问数据)altersystemsetdb_recycle_cache_size=256M scope=both;-- 建表时指定缓冲池createtablet(id number)storage(buffer_pool keep);skgpspawn failed、Swap使用率飙升。# 查看系统内存与Swaptop# Linuxprstat -a# Solaris# 查看Oracle共享内存段ipcs -satop(Linux)或prstat(Solaris)。-- 脚本:通过OS PID获取执行SQLselectsql_textfromv$sqltext awhere(a.hash_value,a.address)in(selectdecode(sql_hash_value,0,prev_hash_value,sql_hash_value),decode(sql_hash_value,0,prev_sql_addr,sql_address)fromv$sessionbwhereb.paddr=(selectaddrfromv$process cwherec.spid='&pid'))orderbypiece;服务器物理内存1G,SGA设置600M,启动后频繁出现ORA-12540(TNS内部限制),Swap仅余10M。
altersystemsetsga_max_size=400M scope=spfile;altersystemsetdb_cache_size=200M scope=spfile;startupforce;# 重启实例生效mkdir/swap&&cd/swapddif=/dev/zeroof=swapfile1bs=1Gcount=1mkswapswapfile1&&swaponswapfile1v$pgastat(整体统计)、v$pga_target_advice(优化建议)、v$process_memory(进程级内存分布)。v$sga(整体大小)、v$sgastat(组件详情)、v$sga_dynamic_components(动态调整历史)。通过转储命令获取内存结构详情,用于深度诊断:
-- 转储PGA概要信息(Level 1)altersessionsetevents'immediate trace name heapdump level 1';-- 查找跟踪文件路径selectvalue||'/'||instance_name||'_ora_'||spid||'.trc'fromv$parameterwherename='user_dump_dest',v$instance,v$process;shmmax(单个共享内存段最大值)≥ SGA_MAX_SIZE,避免 SGA 分散为多个内存段;11g+启用AMM时,/dev/shm 空间需≥MEMORY_TARGET。| 参数 | OLTP 配置示例(物理内存 4G) | DSS 配置示例(物理内存 4G) | 说明 |
|---|---|---|---|
| db_block_size | 8192(默认) | 8192(默认) | 数据块大小,需与表空间一致 |
| db_block_buffers | 32768(32768×8K=256M) | 65536(65536×8K=512M) | Buffer Cache 缓冲区数量,计算方式:Buffer Cache 大小 / db_block_size |
| shared_pool_size | 512M | 768M | 共享池大小,存储 SQL 解析树、执行计划 |
| large_pool_size | 64M | 128M | 大池,用于并行操作、RMAN 备份 |
| java_pool_size | 32M | 64M | Java 池,用于 JVM 运行 |
| log_buffer | 16M | 32M | 重做日志缓冲区,减少日志写入磁盘次数 |
| sort_area_size | 65536(64K) | 262144(256K) | 排序区大小,避免过度磁盘排序 |
| hash_area_size | 131072(128K) | 524288(512K) | 哈希连接区大小 |
| open_cursors | 300 | 500 | 每个进程最大打开游标数 |
init.ora文件后重启实例。sort_area_size/hash_area_size,可能导致 PGA 内存耗尽。| 参数 | OLTP 配置示例(物理内存 8G) | DSS 配置示例(物理内存 8G) | 说明 |
|---|---|---|---|
| SGA_MAX_SIZE | 5120M(8G×80%×80%) | 3200M(8G×80%×50%) | SGA 最大上限,预留虚拟地址空间 |
| db_cache_size | 3072M | 1536M | 默认缓冲池大小,动态调整:alter system set db_cache_size=3072M scope=memory |
| shared_pool_size | 1536M | 1024M | 共享池大小,动态调整生效 |
| large_pool_size | 256M | 512M | 大池大小,动态调整生效 |
| java_pool_size | 128M | 256M | Java 池大小,动态调整生效 |
| log_buffer | 32M | 64M | 重做日志缓冲区(静态参数) |
| PGA_AGGREGATE_TARGET | 1024M(8G×80%×20%) | 3200M(8G×80%×50%) | 全局 PGA 总上限,动态调整:alter system set pga_aggregate_target=1024M scope=both |
| WORKAREA_SIZE_POLICY | AUTO | AUTO | 启用自动 PGA 管理(默认),设为 MANUAL 退化为手动模式 |
| db_keep_cache_size | 512M | 256M | Keep 池(存储高频访问表),动态调整 |
| db_recycle_cache_size | 256M | 128M | Recycle 池(存储一次性访问数据),动态调整 |
db_cache_size/shared_pool_size等(需≤SGA_MAX_SIZE)。PGA_AGGREGATE_TARGET限制全局 PGA,数据库动态分配排序/哈希连接内存。| 参数 | OLTP 配置示例(物理内存 16G) | DSS 配置示例(物理内存 16G) | 说明 |
|---|---|---|---|
| SGA_MAX_SIZE | 10240M(16G×80%×80%) | 6400M(16G×80%×50%) | SGA 最大上限,需≥SGA_TARGET |
| SGA_TARGET | 8192M | 5120M | 自动共享内存管理开关,非零即启用,数据库动态分配 Buffer Cache/Shared Pool 等 |
| PGA_AGGREGATE_TARGET | 2048M(16G×80%×20%) | 6400M(16G×80%×50%) | 全局 PGA 总上限 |
| WORKAREA_SIZE_POLICY | AUTO | AUTO | 启用自动 PGA 管理(默认) |
| log_buffer | 64M | 128M | 重做日志缓冲区(静态参数) |
| db_keep_cache_size | 1024M | 512M | Keep 池(需手动配置,不参与自动分配) |
| db_recycle_cache_size | 512M | 256M | Recycle 池(需手动配置,不参与自动分配) |
| streams_pool_size | 128M | 256M | 流池(10g 新增,用于 Streams 功能) |
SGA_TARGET自动调整 Buffer Cache、Shared Pool、Java Pool、Large Pool 大小,无需手动调整子参数。db_cache_size等子参数,Oracle 会将其视为最小值,剩余内存自动分配给其他组件。| 参数 | OLTP 配置示例(物理内存 32G) | DSS 配置示例(物理内存 32G) | 说明 |
|---|---|---|---|
| MEMORY_MAX_TARGET | 20480M(32G×80%) | 20480M(32G×80%) | 数据库总内存最大上限 |
| MEMORY_TARGET | 16384M | 16384M | 自动内存管理开关,非零即启用,统一管理 SGA+PGA |
| SGA_MAX_SIZE | 13107M(16384M×80%) | 8192M(16384M×50%) | SGA 最大占比(可选,Oracle 自动分配) |
| PGA_AGGREGATE_TARGET | 0(自动分配) | 0(自动分配) | 无需手动设置,Oracle 按场景动态分配 |
| log_buffer | 128M | 256M | 重做日志缓冲区(静态参数) |
| db_keep_cache_size | 2048M | 1024M | Keep 池(手动配置,不参与自动分配) |
MEMORY_TARGET统一管理 SGA 和 PGA,彻底简化配置,无需手动拆分两者比例。/dev/shm空间≥MEMORY_TARGET,否则启动报错ORA-00845,配置命令:umount/dev/shmmount-t tmpfs shmfs -osize=20G /dev/shm# 设为MEMORY_MAX_TARGET大小MEMORY_TARGET(≤MEMORY_MAX_TARGET),无需重启实例。RESOURCE_LIMIT和SGA_TARGET/PGA_AGGREGATE_TARGET限制内存使用。MEMORY_TARGET自动管理,兼容手动配置模式,新增隐含参数_memory_management_mode控制管理模式(默认 3=AMM)。| 参数 | OLTP 配置示例(物理内存 64G) | DSS 配置示例(物理内存 64G) | 多租户(CDB+PDB)配置示例 | 说明 |
|---|---|---|---|---|
| MEMORY_MAX_TARGET | 51200M(64G×80%) | 51200M(64G×80%) | 51200M | 数据库总内存上限,建议≤物理内存 80% |
| MEMORY_TARGET | 40960M | 40960M | 40960M | 自动内存管理开关,非零即启用 |
| SGA_MAX_SIZE | 32768M(40960M×80%) | 20480M(40960M×50%) | CDB:32768M;PDB:8192M | CDB 设总 SGA 上限,PDB 按需分配 |
| PGA_AGGREGATE_TARGET | 0(自动分配) | 0(自动分配) | CDB:0;PDB:2048M | PDB 可单独限制 PGA 上限 |
| log_buffer | 256M | 512M | 256M | 重做日志缓冲区,19C 默认值提升,减少日志 I/O |
| db_keep_cache_size | 4096M | 2048M | 4096M | Keep 池(存储高频访问表) |
| db_recycle_cache_size | 1024M | 512M | 1024M | Recycle 池(存储一次性访问数据) |
| streams_pool_size | 256M | 512M | 256M | 流池,兼容 Oracle 10g+ 特性 |
| pdb_resource_limit | TRUE | TRUE | TRUE | 启用 PDB 资源限制(多租户环境) |
| memory_target | - | - | PDB:8192M | PDB 级内存上限(需启用资源计划) |
-- 1. 设置自动内存管理(重启生效)altersystemsetmemory_max_target=51200M scope=spfile;altersystemsetmemory_target=40960M scope=spfile;altersystemsetsga_max_size=32768M scope=spfile;-- 可选,限制SGA最大占比altersystemsetpga_aggregate_target=0scope=spfile;-- 自动分配PGA-- 2. 手动配置缓冲池(如需)altersystemsetdb_keep_cache_size=4096M scope=both;altersystemsetdb_recycle_cache_size=1024M scope=both;-- 3. Linux 配置 /dev/shm(必需)umount/dev/shm mount-t tmpfs shmfs-o size=52G/dev/shm# 略大于MEMORY_MAX_TARGETecho"tmpfs /dev/shm tmpfs defaults,size=52G 0 0">>/etc/fstab# 永久生效-- CDB 级配置altersystemsetmemory_max_target=51200M scope=spfile;altersystemsetmemory_target=40960M scope=spfile;altersystemsetpdb_resource_limit=truescope=both;-- PDB 级内存限制(切换到PDB执行)altersessionsetcontainer=pdb1;altersystemsetsga_target=8192M scope=both;altersystemsetpga_aggregate_target=2048M scope=both;_memory_granule_size=64M(隐含参数),提升内存分配效率。MEMORY_TARGET=0,然后手动配置SGA_TARGET和PGA_AGGREGATE_TARGET,兼容老版本管理模式。V$MEMORY_DYNAMIC_COMPONENTS视图,支持查看 CDB/PDB 级内存分配详情:-- 查看 PDB 内存分配selectcon_id,component,current_size/1024/1024mbfromv$memory_dynamic_componentswherecon_id>0;-- 查看内存参数配置showparameter memory_;showparameter sga_;showparameter pga_;-- 查看 SGA 组件分配selectcomponent,current_size/1024/1024mbfromv$sga_dynamic_components;-- 查看 PGA 使用统计selectname,value/1024/1024mbfromv$pgastat;-- 查看工作区执行效率(目标:optimal≥90%,multipass=0%)selectname,value,100*value/(sum(value)over())pctfromv$sysstatwherenamelike'workarea executions%';| 视图 | 用途 | 查询示例 |
|---|---|---|
| v$pga_target_advice | PGA 最优配置建议 | select pga_target_for_estimate/1024/1024 pgamb, estd_pga_cache_hit_percentage hit_pct from v$pga_target_advice; |
| v$db_cache_advice | Buffer Cache 优化建议 | select size_for_estimate/1024 sfe_mb, estd_physical_reads from v$db_cache_advice; |
| v$shared_pool_advice | 共享池优化建议 | select shared_pool_size_for_estimate/1024 sp_mb, estd_lc_time_saved from v$shared_pool_advice; |
| v$memory_target_advice(11g+) | AMM 优化建议 | select memory_target_for_estimate/1024 mt_mb, estd_db_time_factor from v$memory_target_advice; |
db_cache_size/shared_pool_size,避免冲突。SGA_TARGET需确保 CDB 有足够空闲内存。_pga_max_size、_memory_granule_size等,修改前需参考 Oracle 官方文档,避免触发 Bug。MEMORY_TARGET),简化配置;10g使用ASMM(SGA_TARGET),9i及以下需手动平衡组件参数。v$pgastat、v$sga_stat,确保无内存过载;每月通过v$pga_target_advice、v$db_cache_advice优化配置。