简介:Oracle数据库运维中,因调整SGA参数导致实例无法启动是常见故障之一,这类问题通常源于spfile中SGA_MAX_SIZE、SGA_TARGET等内存值设置错误,或超出物理内存限制。这份资源面向DBA、运维工程师及Oracle初学者,以Linux环境下一个完整的应急启动过程为案例,先解释了SGA(System Global Area)、spfile与pfile三者之间的关系与调用顺序,再按优先级给出三种可落地的处理办法:一是利用pfile应急启动数据库,并用create spfile from pfile重建spfile;二是直接修改pfile中SGA_MAX_SIZE等错误参数后重新启动;三是在调整SGA前备份spfileSID.ora,以便故障时快速回滚。文档中附有具体SQL命令、启动日志、参数校验输出以及根因分析思路,能帮助读者在遇到类似内存配置问题时快速定位并恢复数据库。资源共1个docx文件,压缩包仅14KB,内容精炼、重点突出,便于本地查阅和应急参考;目前已有326人学习,适合需要维护Oracle内存参数或处理启动故障的运维人员借鉴。
1. 改成 SGA 参数后数据库再也起不来:DBA 最不想碰到的启动故障之一
改动 SGA 参数之后数据库再也起不来,这句话在 Oracle 运维里几乎每周都会出现一次。你只是按网上教程把sga_max_size、sga_target调大,shutdown immediate再startup,结果实例要么刚启动就报ORA-27102、ORA-00824,要么数据库打开到一半直接回滚。
麻烦的是,错误日志看起来很玄学:参数值没超过物理内存,操作系统负载也正常,但库就是起不来,反复重启只会浪费时间。更气人的是,这类故障往往不是数据文件损坏,也不是权限问题,纯粹是参数文件里一组自相矛盾的内存配置在作怪。
下面就把这条血泪经验拆开讲:为什么改 SGA 会触发启动失败、怎么用一份旧 pfile 把库应急拉起来、以及以后再调内存参数时怎么避免翻车。适合正在被一个起不来的库卡住的开发者或 DBA——按文中步骤操作,大概率能在十几分钟内让数据库恢复可用。
2. 为什么改个 SGA 就能把库改到起不来:内存参数背后的启动链路
2.1 实例启动的第一步,就是拿参数去分配 SGA
Oracle 实例的启动分为 NOMOUNT、MOUNT、OPEN 三个阶段。第一阶段 NOMOUNT 只做一件事:读取参数文件里与内存相关的配置,为实例分配 SGA(System Global Area),并启动后台进程。SGA 里最重要的几块是 Database Buffers(数据缓冲区)、Shared Pool(共享池)、Redo Buffers(重做日志缓冲区),它们的大小由sga_max_size、sga_target、db_cache_size、shared_pool_size、log_buffer这些参数共同决定。
也就是说,SGA 的分配发生在整条启动链路的最前面。只要参数文件里的内存值有问题,数据库连 NOMOUNT 都过不去,后面的 MOUNT、OPEN 根本没机会执行。这就是为什么"改 SGA 导致启动异常"的报错几乎都集中在startup命令发出的前几秒——实例连"自己"都还没建立起来,更谈不上打开数据库。
如果看到的现象是:执行startup后立刻弹ORA-27102、ORA-00824、ORA-00845这类错误,或者在告警日志里发现shmget/shmctl/mmap失败之类的记录,那基本可以断定问题出在参数文件,而不是数据文件或控制文件。这是后续所有处理方法的共同前提:先判断故障域,再去动参数,别一上来就怀疑数据文件损坏,那会把人带进死胡同。
2.2 SPFILE 像个黑匣子:改错的参数也会被原样写进去
从 9i 开始,Oracle 默认使用 SPFILE(服务器参数文件,位于$ORACLE_HOME/dbs/spfile<SID>.ora)。SPFILE 的特点是参数以二进制保存、带生命周期(SCOPE=SPFILE/MEMORY/BOTH)、由实例统一管理。但这也意味着它是个黑匣子:你用ALTER SYSTEM SET sga_target=2G SCOPE=SPFILE写进去一条错误配置时,Oracle 不会因为"这个值明显不合理"就拒绝,不少内存参数的校验要等下一次实例启动、真正尝试分配内存时才会暴露。
更隐蔽的是,SPFILE 里往往残留着大量历史参数。很多人调 SGA 只盯着sga_target和sga_max_size,却没注意db_cache_size、shared_pool_size、log_buffer这些组件参数是不是也留在文件里。当 SGA 各部分的取值互相矛盾——比如各组件之和超过sga_max_size,或者sga_target超过了sga_max_size——实例在启动时找不到一个自洽的内存布局,会直接失败。时报什么错取决于具体冲突类型,常见的有四类:
ORA-00824:SGA_TARGET 指定值超过 sga_max_size,目标值越过了硬上限。ORA-00838:MEMORY_TARGET 指定值过小,装不下 SGA 各组件的总和。ORA-27102:共享内存分配失败,通常是超过了 Linux 内核参数 shmmax 的限制。ORA-00845:MEMORY_TARGET 无法分配,/dev/shm 空间不足。
注意,"自洽"这个问题在 pfile 时代反而不容易出现——文本文件里每个参数写得清清楚楚,DBA 一眼能看出矛盾。SPFILE 把参数藏起来了,也就把错误藏起来了。所以许多有经验的 DBA 在调 SGA 前都会先执行create pfile from spfile留一份可读的文本配置,目的就是给黑匣子留一扇窗。
2.3 启动失败先要分清:是参数组合错,还是操作系统限额
改 SGA 导致启动失败的根因,其实分成两大类,排查方向完全不同。
第一类是 Oracle 自身参数组合错误。比如sga_target大于sga_max_size,或者非自动管理模式下各组件参数之和超出sga_max_size。这类错误的特点是:报错信息是ORA-00824、ORA-00838这类带参数名的错误,把参数改回合理值后实例立刻能起。
第二类是操作系统层面给的内存限额不够。Linux 下最常见的场景是把sga_max_size调得比/proc/sys/kernel/shmmax还大,Oracle 用共享内存段(shmget)创建 SGA 时失败,报ORA-27102: out of memory;或者用了 11g 起的自动内存管理(memory_target),但/dev/shm这个 tmpfs 分区比memory_target还小,报ORA-00845。这类错误的特点是:无论怎么改 pfile,只要目标内存值超过系统限额就起不来,必须先调内核参数或换内存管理方式。
区分这两类有一个很实用的办法:用一份"已知能起来"的 pfile 应急启动。如果小配置能起来、大配置起不来,就是操作系统限额;如果一份自洽的旧配置能起来,而当前 spfile 起不来,就是参数组合问题。下面方法一用的正是这个思路,先把库拉起来、再判断到底是哪一类。
| 报错代码 | 故障域 | 原因方向 | 对策方向 |
|---|---|---|---|
| ORA-00824 / ORA-00838 | Oracle 参数 | sga_target 超 sga_max_size,或组件之和越界 | 用 pfile 起库,校正参数后重建 spfile |
| ORA-27102 | 操作系统 | shmmax / 大页不足 | 调内核参数或用大页,再起库 |
| ORA-00845 | 操作系统 | /dev/shm 小于 memory_target | 扩容 /dev/shm,或改用 ASMM |
2.4 带时间戳的 init.ora 文件,就是救命的后悔药
在 Linux 上遇到这种故障,先去两个地方翻文件:$ORACLE_BASE/admin/<SID>/pfile/目录下的init.ora.<时间戳>文件,以及$ORACLE_HOME/dbs/下的init<SID>.ora。
init.ora.8282011115435这种带时间戳的命名,就是之前某次操作留下的 pfile 快照:要么是调参前手动create pfile from spfile做的备份,要么是创建实例时留下的初始模板。文件名的数字段就是快照时间——这里对应 8 月 28 日 11 点 54 分 35 秒。
这份文件价值在于:它记录的是"上一次还能正常启动时"的内存参数。只要不是把内核限额也一起改小了,用这份 pfile 启动,几乎必然能绕过 spfile 里写坏的那组参数。所以看到"数据库启动异常"的报错,第一反应不应该是去改一堆参数碰运气,而是先去 pfile 目录里找这份自洽配置。找不到再考虑重建,找到了就等于拿到了后悔药。
3. 方法一:用旧 PFILE 应急启动并重建 SPFILE(首选方案)
3.1 先在 Linux 上定位 pfile 文件的真实位置
方法一的核心就一句话:绕过写坏的 spfile,用一份自洽的 pfile 把实例拉起来,再用这份 pfile 重新生成 spfile。第一步是找到这份 pfile。在 Linux 环境下,Oracle 的 pfile 一般存放在$ORACLE_BASE/admin/$ORACLE_SID/pfile/目录,其中$ORACLE_BASE是安装软件的根目录(对应资料里写的oracle_install),$ORACLE_SID是实例名(比如 orcl)。用以下命令确认文件位置和内容:
# 确认当前环境变量,SID 必须和出问题的实例一致 echo $ORACLE_SID $ORACLE_HOME $ORACLE_BASE # 列出 pfile 目录下的文件,按时间倒序,最新的一般最接近可用状态 ls -lt $ORACLE_BASE/admin/$ORACLE_SID/pfile/ # 检查 pfile 里的内存参数是否自洽,只看关键行 grep -E "sga_max_size|sga_target|memory_target|db_cache_size|shared_pool_size|log_buffer" \ $ORACLE_BASE/admin/$ORACLE_SID/pfile/init.ora.8282011115435这段命令里,ls -lt按修改时间倒序列出 pfile 备份,时间戳越新的init.ora.xxx越可能是"改坏之前"的最近一份配置;grep的作用是验证这份 pfile 里写的sga_max_size、sga_target是否满足"target 不大于 max_size"这个基本约束。实际操作时别跳过 grep——如果 grep 出来的值本身就矛盾(比如sga_target=2G而sga_max_size=1G),这份 pfile 也不能直接用于启动,得先跳到方法二把值改对。
提示:$ORACLE_BASE 与 $ORACLE_HOME 是两个不同路径,pfile 备份通常在 $ORACLE_BASE/admin/ /pfile,而 spfile 在 $ORACLE_HOME/dbs 下。找错目录是新手最常踩的坑。
3.2 执行 startup pfile:让实例绕过 SPFILE
确认 pfile 内容没问题后,用 SQL*Plus 以 sysdba 身份连接,执行应急启动命令:
-- 以 sysdba 登录(本地操作系统认证或密码认证均可) sqlplus / as sysdba -- 用指定的 pfile 启动实例,绕过默认的 spfile startup pfile='/u01/app/oracle/admin/orcl/pfile/init.ora.8282011115435';startup pfile后面必须跟绝对路径,路径里的admin/orcl要替换成实际目录。这条命令的作用是告诉实例"不要去找spfile<$SID>.ora,直接用这份文本参数文件初始化 SGA"。如果一切正常,你会看到与资料里一致的输出:先是"ORACLE 例程已经启动",然后打印Total System Global Area的大小,并依次列出 Fixed Size、Variable Size、Database Buffers、Redo Buffers 四个部分——它们的总和就是 SGA。看到"数据库已经打开",说明实例已经从故障中恢复,可以对外服务了。
如果这一步也起不来,大概率不是 spfile 的问题,而是选定的 pfile 本身就超出操作系统限额(ORA-27102)或者/dev/shm不够(ORA-00845)。这时先别急着换 pfile,按后面 5.2 和 5.3 的排查把系统限额确认了再说,否则换几份 pfile 结果都一样。
3.3 create spfile from pfile:把修复结果固化下来
pfile 启动成功只是应急,如果实例下次还是去读写坏的 spfile,故障必然复现。接下来的关键一步,是用当前这份"证明有效"的 pfile 重新生成 spfile:
-- 用刚才成功启动的 pfile 重建 spfile create spfile from pfile='/u01/app/oracle/admin/orcl/pfile/init.ora.8282011115435'; -- 重建后先关闭实例,让后续启动从新 spfile 走完整链路 shutdown immediate;create spfile from pfile是 Oracle 提供的参数文件互转命令,默认会在$ORACLE_HOME/dbs/下生成spfile$ORACLE_SID.ora。它的意义在于:spfile 里的每一项参数都来自刚才这份"能启动"的 pfile,从源头上去掉了之前写坏的那组值。执行后屏幕会提示"文件已创建",此时旧 spfile 已被覆盖——如果你还想留后悔药,创建前可以先把旧spfile$ORACLE_SID.ora复制一份到别的目录,这就是方法三干的事。
shutdown immediate用于把实例干净地停下来,让后续startup从新生成的 spfile 重新走启动链路。注意shutdown immediate会回滚未提交事务并断开会话,生产库操作前最好先确认没有重要的长事务在跑,必要时先和业务方打个招呼。
3.4 用 show parameter 验证实例确实吃的是 SPFILE
重建 spfile 后,再次启动并验证,这一步不能省。很多人重建完直接startup,没确认实例到底读的是 pfile 还是 spfile,结果调了几个小时参数,重启一次又打回原形:
-- 正常启动,不指定 pfile,Oracle 会优先找 spfile$SID.ora startup mount; -- 确认当前实例使用的参数文件类型 show parameters spfile; -- 确认 SGA 相关参数的实际生效值 show parameter sga;startup mount会触发两次内存相关校验:一次是 NOMOUNT 阶段分配 SGA,一次是读取控制文件装载数据库;输出里同样会打印Total System Global Area。如果实例真的在用 spfile,show parameters spfile的结果里 spfile 这一行会有值——资料里显示的是**DATABASE\SPFILEORCL.ORA这种平台相关写法,Windows 上带注册表路径,Linux 上通常是文件路径,重点看值里包含 SPFILE 字样;如果这一行是空值,说明实例还在读 pfile,需要检查 dbs 目录下 spfile 文件是否真的生成了。
show parameter sga能看到两组关键参数:sga_max_size和sga_target。资料里的输出显示这两个值都是 396M,说明 ASMM 自动共享内存管理处于正常状态——sga_target有值且不超过sga_max_size,后续你再调sga_target都不需要重启。验证通过后,数据库已经回到"用 spfile 正常管理"的状态,方法一就完成了。
4. 方法二和方法三:改配置文件与备份恢复两条退路
4.1 方法二:直接编辑 pfile,把错误的 SGA 参数改回来
方法二适合你已经明确知道是哪几个参数写错的情况。思路是:先把 pfile 里的错误内存参数改成正确值,再用这份"修正版 pfile"启动并重建 spfile。操作分三步。
第一步,复制一份 pfile 再改,不要把原文件直接改坏。第二步用 vi 或 sed 修改关键参数(sga_max_size、sga_target、db_cache_size、shared_pool_size、log_buffer等),改动的原则是:sga_target必须小于等于sga_max_size;如果sga_target没配(值为 0 或注释掉),那db_cache_size、shared_pool_size、log_buffer等组件值之和不能超过sga_max_size。第三步用修正后的 pfile 启动,验证后重建 spfile。
# 1. 先备份原 pfile,再复制一份用于修改 cp $ORACLE_BASE/admin/$ORACLE_SID/pfile/init.ora.8282011115435 \ $ORACLE_BASE/admin/$ORACLE_SID/pfile/init.ora.8282011115435.bak # 2. 用 vi 打开副本,把 sga_target 调整到不超过 sga_max_size 的值 vi $ORACLE_BASE/admin/$ORACLE_SID/pfile/init.ora.8282011115435.bak-- 3. 用修正版 pfile 启动,并重建 spfile startup pfile='/u01/app/oracle/admin/orcl/pfile/init.ora.8282011115435.bak'; create spfile from pfile='/u01/app/oracle/admin/orcl/pfile/init.ora.8282011115435.bak'; shutdown immediate; startup;这里有个细节值得说明:create spfile from pfile生成的是"当前这份 pfile 的完整快照"。如果你只改了sga_target忘了同步sga_max_size,生成出来的 spfile 依然带着错误组合,下次启动还是会失败。所以方法二的关键不是"会改参数",而是"改完要自查参数自洽"——我一般会在改完后把文件里所有sga、memory开头的行逐行 grep 出来,在心里过一遍大小关系再执行启动。多花这一分钟,能省下一次重启验证的时间。
4.2 方法三:调参之前备份 spfile,出问题一把还原
方法三是治理层面最值得养成的习惯:动手之前先把 spfile 备份好,出了任何问题都能回滚。资料里特别强调"做修改前先将oracle_install/product/dbs目录下的所有文件备份",这里的product/dbs就是$ORACLE_HOME/dbs。这个目录里躺着spfile$ORACLE_SID.ora、init$ORACLE_SID.ora、orapw$ORACLE_SID(口令文件)、lk$ORACLE_SID(锁文件)等对启动至关重要的文件,其中起决定作用的就是spfile$ORACLE_SID.ora。
# 改参数前执行:把 dbs 目录整体备份到独立目录 mkdir -p /home/oracle/backup/dbs_$(date +%Y%m%d) cp -rp $ORACLE_HOME/dbs/* /home/oracle/backup/dbs_$(date +%Y%m%d)/ # 出问题后执行:把备份的 spfile 还原回 dbs 目录 cp /home/oracle/backup/dbs_20250108/spfile$ORACLE_SID.ora $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora-- 还原后正常启动 sqlplus / as sysdba startup;cp -rp保留了文件权限和时间戳,这是重点:spfile 文件属主必须是 oracle、权限通常是 0644,用普通cp覆盖后如果变成 root 属主,Oracle 会直接拒绝读取。备份路径用$(date +%Y%m%d)生成日期目录,是为了让每次备份互不覆盖——万一最近这次备份也带着问题,还能往前翻更早的版本。
方法三的本质是给"改 SGA"这种操作上保险:不管你把参数调成什么样,只要 spfile 原件还在,最坏结果就是还原后重新来过。它与方法一并不冲突,实际运维中我通常把方法三当习惯,把方法一当应急手段:每次调参前先备份 dbs,出问题先用 pfile 应急拉起实例保住业务,再从容研究 spfile 里到底写坏了什么。
4.3 三种方法怎么选:一张对比表说清楚边界
| 方法 | 前置条件 | 适用场景 | 注意事项 |
|---|---|---|---|
| 方法一:pfile 起库 + 重建 spfile | 有一份能自洽启动的 pfile | spfile 参数组合写坏,旧配置仍有效 | 重建前先确认 pfile 内容自洽,否则带病生成 |
| 方法二:改 pfile 再启动 | 明确知道哪个参数值不对 | 改动明确,比如 target 超 max_size | 改完必须自查参数间大小关系,别改一半 |
| 方法三:备份还原 spfile | 调参前做过 dbs 备份 | 任何想快速回滚的场景 | 还原后属主、权限要正确;备份要放在 dbs 之外 |
选型逻辑很简单:追求最快拉起业务,用方法一;你清楚是哪个参数错,用方法二;你只想回到改参前的状态,用方法三。三个方法都解决"让库先起来"的问题,但都不解决"你本来想把 SGA 调成多大"的业务问题——库起来之后,还要按正确步骤重新调一次 SGA,顺序见 5.1。
5. 避坑与常见问题:改 SGA 前后最容易翻车的五个场景
5.1 sga_target 大于 sga_max_size,实例带病启动
现象:改完参数重启,startup直接报ORA-00824(SGA_TARGET 过大)或ORA-00838(MEMORY_TARGET 过小),实例起不来。 原因:sga_target是 ASMM 的"目标值",sga_max_size是"硬上限",Oracle 规定目标值不能高于上限。很多人调参时只改sga_target忘了同步sga_max_size,或者两个参数在两次 ALTER 里分别改,中间某次 shutdown 恰好落在这对矛盾值上。 解决:用 pfile 应急启动后,按正确顺序改:先ALTER SYSTEM SET sga_max_size=... SCOPE=SPFILE,再ALTER SYSTEM SET sga_target=... SCOPE=BOTH,最后重启验证。顺序反了,第二次 ALTER 可能直接报ORA-02097之类的参数越界错误。
5.2 内存值没超物理内存,却报 ORA-27102 out of memory
现象:startup报ORA-27102: out of memory,操作系统物理内存明明还有富余。 原因:Oracle 在 Linux 上用共享内存段创建 SGA,单个段大小受/proc/sys/kernel/shmmax限制。很多服务器默认shmmax只有 32MB 或 64MB,你把sga_max_size调到几百 MB,shmget直接失败,报错信息里的"out of memory"指的不是物理内存,而是共享内存限额。 解决:用sysctl调大shmmax(并同步调kernel.shmall),然后sysctl -p生效;或者不依赖内核共享内存,改用大页(hugepages)方式承载 SGA。应急期间可以先临时降低sga_max_size起库,保住业务后再慢慢调内核参数,不用在生产窗口里硬扛。
# 查看当前共享内存上限,确认 SGA 是否超限 cat /proc/sys/kernel/shmmax ipcs -lm | grep -i "max seg" # 临时调大(重启失效),或写入 /etc/sysctl.conf 永久生效 sysctl -w kernel.shmmax=10737418245.3 报了 ORA-00845,其实是 /dev/shm 不够
现象:startup报ORA-00845: MEMORY_TARGET not supported on this system,表面看和 SGA 参数无关,但确实是调内存参数引发的。 原因:11g 起引入自动内存管理(AMM),用memory_target统一管理 SGA 和 PGA,Oracle 会把内存映射到/dev/shm(tmpfs)。/dev/shm默认往往只有物理内存的一半甚至更小,memory_target设得比它大就起不来。 解决:扩容/dev/shm,比如mount -o remount,size=2G /dev/shm,并写入/etc/fstab让重启后依然生效;或者放弃 AMM,改用sga_target+pga_aggregate_target的 ASMM 方式管理。要警惕的是,很多人把memory_target和sga_target混着改,两个管理体系叠加最容易出这种怪报错——先想清楚你到底在用哪套内存管理,再动手。
5.4 ALTER SYSTEM 改成功了,重启后参数又变回原值
现象:alter system set sga_target=2G执行成功,show parameter sga也显示 2G,但实例一重启又回到旧值。 原因:ALTER SYSTEM默认 SCOPE=BOTH,但静态参数(比如sga_max_size)只支持 SCOPE=SPFILE,动态参数(比如sga_target)才支持 BOTH;还有一些版本、一些场景下默认行为会有偏差,导致修改只落在了当前内存里,没有持久化到 spfile。 解决:改 SGA 这类参数,养成显式写 SCOPE 的习惯。改sga_max_size写SCOPE=SPFILE,改sga_target写SCOPE=BOTH,改完用show parameter确认,再重启验证一次。别嫌麻烦,这一步省掉,下次翻车的就是你。
-- 静态参数:只能写 spfile,重启生效 ALTER SYSTEM SET sga_max_size=2G SCOPE=SPFILE; -- 动态参数:同时写内存和 spfile,立即生效并持久化 ALTER SYSTEM SET sga_target=2G SCOPE=BOTH;5.5 startup pfile 报 ORA-01078 / LRM-00109,文件根本没被读到
现象:startup pfile='...'后报ORA-01078: failure in processing system parameters,或者LRM-00109: could not open parameter file。 原因:路径写错、文件名拼错、oracle 用户没有读权限、或者文件放在 oracle 无法访问的目录下。这是 pfile 应急启动里最常见的低级错误,属于"还没到参数校验就被挡在门外"。 解决:先用ls -l确认文件存在且权限是 oracle 可读,再用cat确认文件内容确实是参数文本,最后在启动命令里写绝对路径。注意 pfile 文件名必须以init开头,文件内容必须是parameter=value格式逐行排列。先保证文件能打开,再谈参数对不对——这个顺序别搞反。
6. 快速定位:改完 SGA 起不来,按这三步往下查
6.1 第一步:看报错发生在启动的哪个阶段
拿到启动失败的现场,先别看参数,看错误发生在哪一秒。实例启动分 NOMOUNT(分配 SGA)、MOUNT(读控制文件)、OPEN(读数据文件)三个阶段,SGA 相关错误一定发生在第一阶段。特征是startup命令发出后立刻报错、Total System Global Area还没打印出来。如果 SGA 大小已经打印、库卡在装载或打开阶段,那是控制文件或数据文件的问题,与 SGA 无关,别在这篇文章里找答案,直接去看告警日志里的文件路径信息。
6.2 第二步:确认实例读的是 pfile 还是 spfile
在 dbs 目录下执行ls -l $ORACLE_HOME/dbs/spfile*,看有没有spfile$SID.ora。有,且你没指定 pfile,那实例读的就是它——问题九成在 spfile 的参数组合;没有,实例才读init$SID.ora或默认init.ora。连入实例后,show parameters spfile这一行有值就代表当前用的是 spfile。这个确认动作决定了该用方法一还是方法二:spfile 出问题走方法一,pfile 本身参数错走方法二。
6.3 第三步:对照三个硬约束做参数体检
把目标参数和系统限额对齐,两条命令五秒钟查完:
# 看系统共享内存上限与 /dev/shm 大小 ipcs -lm df -h /dev/shm-- 看参数文件里的内存配置是否自洽 SELECT name, value FROM v$parameter WHERE name IN ('sga_max_size','sga_target','memory_target','memory_max_target');对照三个约束判断:一是sga_target ≤ sga_max_size;二是sga_max_size加 PGA(pga_aggregate_target)不超过物理内存的可用余量;三是sga_max_size不超过内核shmmax(用大页或 AMM 的场景,分别对应大页总量和/dev/shm大小)。三条都满足还起不来,再回头怀疑组件参数(db_cache_size、shared_pool_size之和)是否越界。
从那以后,我每次动 SGA 之前都强制走一遍固定流程:先备份 dbs 目录、再create pfile from spfile留文本快照、最后把目标参数写成一张"sga_max_size/sga_target/ 系统余量"的对照表才动手。备份五分钟,排查两小时——这笔账算过太多次了。希望这篇笔记能帮你少踩一次这个坑。
本文还有配套的精品资源,点击获取