能,但仅限实例当前运行且所有参数均为动态生效或虽静态但未重启;若用pfile启动或部分参数未显式设置,则生成的spfile缺失关键启动参数,重启将失败。
spfile 丢失后,create spfile from memory 能用吗?
能,但仅限实例当前正在运行、且所有参数都是动态生效(或虽静态但未重启)的状态。Oracle 启动后会把 SPFILE 内容加载进内存,后续所有 ALTER SYSTEM SET ... SCOPE=BOTH 操作也同步更新内存和磁盘 SPFILE;但如果只用了 SCOPE=MEMORY 或实例曾用 PFILE 启动过,内存里的值就可能不完整。
-
CREATE SPFILE FROM MEMORY不会还原那些只在原始 SPFILE 里存在、但从未被显式修改过的默认参数(比如db_name、control_files这类启动必需项,它们必须靠 PFILE 显式提供) - 如果实例是用 PFILE 启动的,
CREATE SPFILE FROM MEMORY生成的 SPFILE 会缺失关键静态参数,下次重启直接失败 - 执行前先确认:
SHOW PARAMETER spfile返回非空值,才说明当前确实是 SPFILE 启动的
没有 SPFILE 也没留备份,怎么从 V$SPPARAMETER 拼出可用 PFILE?
V$SPPARAMETER 记录了 SPFILE 中所有参数的实际值(包括被注释掉的),但它不保留顺序、注释、空行,也不区分哪些是 Oracle 自动添加的(如 __db_cache_size)。直接导出它生成的文本不能直接当 PFILE 用。
- 先过滤出真正需要的参数:
SELECT name, value FROM V$SPPARAMETER WHERE isspecified = 'TRUE'—— 只取用户显式设置过的项 - 必须手动补上
db_name、db_domain、control_files、sga_target或memory_target等启动强依赖项(V$SPPARAMETER里可能为空或为默认值,但 PFILE 里不能缺) - 遇到带双下划线的隐含参数(如
__shared_pool_size),一律删掉 —— 它们由 Oracle 自动计算,写进 PFILE 会导致启动报错ORA-00100或忽略 - 示例片段(注意等号前后无空格,路径用单引号):
db_name='ORCL' control_files='/u01/app/oracle/oradata/ORCL/control01.ctl' sga_target=2G processes=300
用 CREATE PFILE FROM SPFILE 失败,提示 ORA-01565 怎么办?
ORA-01565 表示 Oracle 找不到 SPFILE 文件本身,不是权限或路径问题,而是 SPFILE 真的不存在或路径被改过。这时候不能硬试命令,得先定位真实路径。
- 查
V$PARAMETER:SELECT value FROM V$PARAMETER WHERE name = 'spfile'—— 如果返回 NULL,说明实例根本没从 SPFILE 启动 - 检查传统位置:
$ORACLE_HOME/dbs/spfile<sid>.ora</sid>(Linux/Unix)或%ORACLE_HOME%\database\spfile<sid>.ora</sid>(Windows),但注意 SID 大小写和是否用了 ASM(ASM 上的 SPFILE 路径在+DATA/ORCL/PARAMETERFILE/spfile.272.123456789这类格式) - 如果 SPFILE 在 ASM,又没开 ASM 实例,
CREATE PFILE FROM SPFILE必然失败;此时只能连上 ASM 实例,用ASMCMD的cp命令先把 SPFILE 拷贝到文件系统再操作
重建 SPFILE 后,为什么重启还是报 ORA-01078 和 LRM-00109?
ORA-01078 + LRM-00109 组合,基本等于“Oracle 找到了 PFILE/SPFILE,但里面某个参数语法错了,或者值非法”。最常见的是:
-
control_files路径写错,比如多了一个斜杠'/u01//oradata/ORCL/control01.ctl',或者路径不存在且没创建目录 - 数值型参数用了字母,比如
processes=300a(粘贴时带了隐藏字符) - 单引号没闭合,尤其在 Windows 路径里混用反斜杠和单引号时容易漏掉:正确是
'C:\app\oracle\oradata\ORCL\control01.ctl',错误是'C:\app\oracle\oradata\ORCL\control01.ctl - 使用了只在高版本支持的参数(如
enable_pluggable_database=TRUE),但在 11g 实例里启动
重建后的 SPFILE 无法直接编辑,所以务必先用 CREATE PFILE FROM SPFILE 导出一份文本,人工检查后再重创建。这一步跳不过。










