DBCA建库时实际生效的参数是SGA_MAX_SIZE和SGA_TARGET(ASMM模式)或MEMORY_TARGET(AMM模式),其中“最大内存”设SGA_MAX_SIZE,“初始内存”设SGA_TARGET;若未填写“初始内存”,SGA_TARGET沿用默认值(如1.5G),导致启动后SGA远低于预期。

DBCA建库时SGA参数实际生效的是哪几个
DBCA界面里“内存”选项卡中填的数值,最终只影响两个参数:SGA_MAX_SIZE 和 SGA_TARGET(或 MEMORY_TARGET,取决于是否启用AMM)。它不会直接设置 SHARED_POOL_SIZE、DB_CACHE_SIZE 等子组件——那些由Oracle在启动后按策略自动分配。
关键点在于:DBCA填写的“最大内存”值默认写入 SGA_MAX_SIZE,而“初始内存”值写入 SGA_TARGET(ASMM模式)或 MEMORY_TARGET(AMM模式)。如果你只填了最大值没填初始值,SGA_TARGET 就会沿用 Oracle 的默认估算(比如 1.5G),导致启动后 SGA 远低于物理内存预期。
- DBCA勾选“使用自动内存管理(AMM)” → 写入
MEMORY_TARGET和MEMORY_MAX_TARGET - 未勾选AMM但勾选“自动共享内存管理(ASMM)” → 写入
SGA_TARGET和SGA_MAX_SIZE,PGA_AGGREGATE_TARGET单独设置 - 全手动模式 → 所有子组件(
SHARED_POOL_SIZE、DB_CACHE_SIZE等)都需显式指定,DBCA不帮你算
为什么DBCA填了16G,启动后SGA还是1.5G
这是最常被忽略的细节:DBCA界面上的“初始内存”字段是空的,或者你只改了“最大内存”,结果 SGA_TARGET 仍为默认值(Oracle 11g R2 默认约 1.5G)。SGA_TARGET 才是实例启动时真正分配的大小,SGA_MAX_SIZE 只是上限,不参与初始分配。
验证方法很简单:
SQL> SHOW PARAMETER sga_target NAME TYPE VALUE ------------ ----------- ------- sga_target big integer 1536M
如果看到这个输出,说明DBCA根本没把你要的初始值写进去。不是配置没保存,而是你没在界面上填那个输入框。
- DBCA图形界面中,“初始内存”输入框在“内存”页签右下角,字号小、位置偏,容易漏看
- 命令行调用DBCA(
dbca -silent)时,必须显式传参-initParams sga_target=16G,否则不生效 - 即使填了初始值,若该值 > 当前
SGA_MAX_SIZE,DBCA会静默截断并采用默认值,不报错也不提醒
SGA_MAX_SIZE设太大反而会导致启动失败
SGA_MAX_SIZE 不是越大越好。它决定了SGA内存颗粒(granule)大小,而颗粒大小又反向约束所有动态组件的最小调整单位。例如,当 SGA_MAX_SIZE > 8G 且 ≤16G 时,粒度固定为 32MB —— 意味着你后续想把 SHARED_POOL_SIZE 调整为 512MB,实际只能以 32MB 倍数增减(如 480MB 或 512MB 刚好可以,但 496MB 就会被四舍五入)。
更严重的是:如果 SGA_MAX_SIZE 设置超过操作系统能锁定的共享内存限制(kernel.shmall / kernel.shmmax),实例根本无法启动,报错 ORA-27102: out of memory。
- Linux 上务必提前检查:
cat /proc/sys/kernel/shmmax,确保 ≥SGA_MAX_SIZE - 32GB 物理内存服务器,
SGA_MAX_SIZE建议不超过 20G(留出至少 8G 给 OS + PGA + 其他进程) - 一旦
SGA_MAX_SIZE设定,修改它必须重启数据库,且新值不能小于当前已分配的SGA_TARGET
DBCA创建后立刻验证SGA是否按预期加载
不要依赖DBCA最后那个“成功”弹窗。很多问题(比如SPFILE没生成、参数写错位置、AMM与ASMM混用)只在首次连接数据库时暴露。
建库完成后,立即执行:
sqlplus / as sysdba SQL> SHOW PARAMETER spfile SQL> SHOW PARAMETER target
重点核对三件事:
-
spfile是否非空?为空说明DBCA没生成SPFILE,所有参数都在PFILE里,重启即丢失 -
sga_target或memory_target的值是否等于你填的“初始内存” -
sga_max_size或memory_max_target是否等于你填的“最大内存”
如果其中任一值不符,别急着改参数——先查 $ORACLE_HOME/cfgtoollogs/dbca/<dbname>/</dbname> 下的日志,里面会明确记录DBCA实际写入了哪些参数、跳过了哪些(比如因为值非法被忽略)。


















