简介:围绕 Oracle SGA 参数调整后实例无法正常启动这一常见故障,这份 docx 文档给出了应急处理与恢复思路,面向需要处理内存参数配置失误的数据库管理员、运维人员和备考面试者。包内仅含 1 个 docx 文件,压缩包约 14KB,体积轻便,内容集中,适合放在本地作为日常运维与故障排查的速查材料。目前已有 328 人学习下载。文档结合 Linux 环境下的实际处理场景,梳理了借助 PFILE 应急启动、由 PFILE 重建 SPFILE、修改错误 SGA 参数以及备份并回滚 SPFILE 文件等几条恢复路径,并对 PFILE 与 SPFILE 的关系作必要说明,补充调整前备份、调整后验证实例启动与性能等注意事项。读者可据此理解 SGA 配置失误后的排查顺序,掌握从异常定位到恢复启动的基本思路,减少因参数改动导致业务中断时的试错成本,适合初中级数据库从业者查漏补缺。
1. 一次 SGA 调整后起不来:先认清 pfile 和 spfile 的关系
值班时最常见的画面是:改完sga_target或sga_max_size,执行startup后实例没起来,SQL*Plus 只留下一行报错。oracle改sga异常 并不神秘,多数时候不是数据坏了,而是实例启动时读到的参数文件不对:spfile 是二进制,改错后不容易直接看;pfile 是文本,能打开、能 diff、能指定路径启动。
这份处理办法把三套动作拆开:先用 pfile 把实例拉起来,再从 pfile 回写 spfile;不想重建就修 pfile 里的 SGA 参数;最后用 dbs 目录备份做回滚。适合需要在一线快速恢复、又不想把问题越改越大的 DBA 和运维。
2. 先让库起来:用 pfile 应急启动并回写 spfile
SGA 参数改错后,最先要做的不是继续猜参数,而是让实例进入可操作状态。Oracle 启动时默认读 spfile,pfile 只是文本参数文件;startup pfile='...'把启动入口从二进制 spfile 切到文本 pfile,这样能绕过 spfile 里的错误参数。原文给出的路径是oracle_install/admin/SID/pfile/init.ora.8282011115435,现场一般对应$ORACLE_BASE/admin/$ORACLE_SID/pfile/下的 init.ora 副本。先确认文件存在、属主和权限,再用 pfile 启动。注意:pfile 启动成功只说明参数文件能读,不能说明参数合理,后面还要回写并验证。
2.1 定位 pfile:从 $ORACLE_HOME/dbs 和 admin/SID/pfile 两条线找
pfile 常见位置有两类:一类是$ORACLE_HOME/dbs/init$ORACLE_SID.ora,另一类是$ORACLE_BASE/admin/$ORACLE_SID/pfile/下带时间戳的 init.ora。原文给的是第二类。现场操作时先别急着执行startup pfile,先把文件路径、属主、权限确认清楚,否则报错会把你带到“参数值”这个错误方向。
# 以 oracle 用户执行,先确认当前实例和 ORACLE_HOME echo $ORACLE_SID echo $ORACLE_HOME # 常见 pfile 位置一:$ORACLE_HOME/dbs/init$ORACLE_SID.ora ls -l $ORACLE_HOME/dbs/init$ORACLE_SID.ora # 常见 pfile 位置二:$ORACLE_BASE/admin/$ORACLE_SID/pfile/ ls -lt $ORACLE_BASE/admin/$ORACLE_SID/pfile/ | head -20 # 检查目标 pfile 是否可读,文件名按现场替换 ls -l $ORACLE_BASE/admin/$ORACLE_SID/pfile/init.ora.8282011115435这段命令先确认环境变量,避免在错误实例上操作;ls -lt按时间排序,方便找最近一份 init.ora;最后一条检查目标文件是否存在以及 oracle 用户是否可读。参数上,$ORACLE_SID必须与要恢复的实例一致;如果使用多实例环境,先ps -ef | grep pmon对照,不要凭记忆猜。路径里有空格或字符串写错,后续startup pfile会直接报找不到文件。
常见做法是先把目标 pfile 复制到$ORACLE_HOME/dbs下并改成简单名字,减少路径出错。例如复制成带时间戳的initSID.ora.bak,不要直接覆盖现有initSID.ora。这样做的目的不是“多此一举”,而是让 SQL*Plus 里的路径短、可核对,出问题时也能一眼看出用的是哪份文件。
# 复制一份应急 pfile,保留原文件不动 cp -p $ORACLE_BASE/admin/$ORACLE_SID/pfile/init.ora.8282011115435 \ $ORACLE_HOME/dbs/init$ORACLE_SID.ora.emergency.$(date +%Y%m%d%H%M)cp -p保留权限和时间戳;目标文件名带emergency和时间戳,避免和默认 pfile 混淆。参数上,$ORACLE_HOME/dbs必须是当前实例实际使用的 Home,不要在有多个 Home 的机器上复制到另一个目录。复制完用ls -l再确认属主是 oracle,权限至少让 oracle 用户可读。
2.2 startup pfile 的完整命令与输出判读
确认 pfile 可读后,以 sysdba 登录执行startup pfile。原文的启动输出里,实例启动后 SGA 显示612368384 bytes,数据库装载并打开。这个输出要分三段看:实例启动、数据库装载、数据库打开。只到第一段说明参数文件能读但控制文件或内存分配还有问题;到第二段说明控制文件能读,数据文件或 redo 可能还有问题;到第三段才算真正打开。
-- 以 sysdba 登录,pfile 路径写成实际绝对路径 SQL> connect / as sysdba SQL> startup pfile='/oracle_install/admin/SID/pfile/init.ora.8282011115435';这条命令的关键在pfile=后面的绝对路径。SQL*Plus 单引号里不会自动展开$ORACLE_BASE,不要把环境变量原样写进去;要么手工展开,要么先把文件复制到固定路径。参数上,startup pfile会忽略默认 spfile,改用指定文本文件启动;如果 pfile 里还写了spfile参数,现场要核对,避免又绕回错误的二进制文件。
启动成功后先别急着回写,先查当前实例用的是哪个参数文件、SGA 实际值是多少。原文在 pfile 启动后显示了 SGA 总值 612M,而后面startup mount后显示 415M,这不是“参数没生效”,而是 pfile 和 spfile 本来就是两套参数。回写前必须确认你要固化的是哪一套。
SQL> show parameter spfile; SQL> show parameter sga; SQL> show parameter sga_max_size; SQL> show parameter sga_target;show parameter spfile用来判断当前实例是从 spfile 还是 pfile 启动;pfile 启动时该值可能为空,这正好说明绕开了 spfile。show parameter sga看sga_max_size、sga_target的实际值,和 pfile 文本里的值对照。我一般会在这里把输出记下来,再决定是否回写。这里有个容易翻车的点:pfile 启动后 SGA 显示 612M,而原 spfile 是 415M,不要因为数字不同就反复改参数,先看 pfile 里写的是什么。
提示:pfile 启动成功后,先做一次
show parameter记录,再执行回写。没有记录就回写,后面很难判断是 pfile 的问题还是 spfile 的问题。
2.3 create spfile from pfile 的顺序:先回写再重启验证
原文的顺序是:create spfile from pfile=...,shutdown immediate,startup mount,再show parameters spfile/sga。这个顺序的核心是“先用 pfile 让实例活着,再把 pfile 固化成 spfile,最后用 spfile 重启验证”。但回写前要备份现有 spfile,因为create spfile from pfile默认会写$ORACLE_HOME/dbs/spfile$ORACLE_SID.ora,已有文件会被覆盖。
# 回写前备份默认 spfile,避免 create spfile 直接覆盖后没有后悔药 cp -p $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora \ $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora.bak.$(date +%Y%m%d%H%M)cp -p保留权限和属主;备份文件名带时间戳,避免多次操作互相覆盖。参数上,$ORACLE_HOME/dbs/spfile$ORACLE_SID.ora是默认 spfile 路径,现场如果使用 ASM 或自定义路径,按show parameter spfile的结果替换。备份文件不要放在同一目录后忘记清理,至少保留到变更验证通过。
-- 从 pfile 回写 spfile,默认写到 $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora SQL> create spfile from pfile='/oracle_install/admin/SID/pfile/init.ora.8282011115435'; SQL> shutdown immediate; SQL> startup mount; SQL> show parameter spfile; SQL> show parameter sga; SQL> alter database open;create spfile from pfile执行时需要 SYSDBA 权限;默认目标路径由实例决定,常见是$ORACLE_HOME/dbs/spfile$ORACLE_SID.ora。如果不想覆盖默认文件,可以显式指定目标路径,先生成新文件,验证后再替换。shutdown immediate后startup mount是为了先验证 spfile 能读、SGA 参数能分配,再打开数据库;如果 mount 阶段就报错,先别 open,回到 pfile 继续查。show parameter spfile显示路径后,要确认它指向刚生成的文件;show parameter sga显示的值应与 pfile 中一致。这里不要用startup force图省事,force 会跳过一些状态判断,现场容易把问题搅在一起。
2.4 参数核对:sga_max_size、sga_target、spfile 路径
回写后最容易忽略的是参数之间的关系。sga_max_size是 SGA 上限,sga_target是自动管理目标,memory_target是总内存目标。sga_target不能大于sga_max_size;memory_target非零时,sga_target通常不应再手工设置。Linux 上还要看/dev/shm,共享内存不够,参数写得再漂亮也起不来。
| 参数 | 作用 | 核对点 |
|---|---|---|
sga_max_size | SGA 上限 | 不小于sga_target,不超过系统内存和共享内存限制 |
sga_target | 自动管理目标 | 与sga_max_size保持合理关系 |
memory_target | 总内存目标 | 与sga_target不要同时手工设置 |
spfile | 当前参数文件 | 路径指向刚生成或恢复的文件 |
SQL> show parameter sga_max_size; SQL> show parameter sga_target; SQL> show parameter memory_target; SQL> show parameter spfile; SQL> select name, value, display_value 2 from v$parameter 3 where name in ('sga_max_size','sga_target','memory_target','spfile');show parameter够用,v$parameter方便把值
本文还有配套的精品资源,点击获取