生产环境必须使用SPFILE,因其为二进制、服务器端、支持动态修改;PFILE为纯文本、客户端、仅静态生效,仅在显式指定或SPFILE损坏时启用。
SPFILE 和 PFILE 到底该用哪个?
Oracle 实例启动时只认一个参数文件,但你得知道:SPFILE 是二进制、服务器端、可动态修改的;PFILE 是纯文本、客户端、只能静态生效。生产环境必须用 SPFILE,否则连 ALTER SYSTEM SET ... SCOPE=BOTH 都会报错 ORA-02095 —— 因为它不支持运行时持久化。
- SPFILE 优先级高于 PFILE:启动时不指定参数文件,Oracle 自动找 $ORACLE_HOME/dbs/spfile
SID.ora
- PFILE 只在显式指定(
STARTUP PFILE='/path/initsid.ora')或 SPFILE 损坏时才起作用
- 修改 SPFILE 后不重启也能生效(部分参数),改 PFILE 必须重启实例
从 SPFILE 生成 PFILE:别直接编辑 SPFILE
SPFILE 不是文本文件,用 vi 打开只会看到乱码,强行编辑大概率导致实例无法启动。需要导出为可读可改的 PFILE:
- 连上数据库(必须是
sysdba 权限)后执行:CREATE PFILE='/tmp/initsid.ora' FROM SPFILE;
- 如果没指定路径,Oracle 默认写到 $ORACLE_HOME/dbs/init
SID.ora,容易覆盖旧配置
- 导出后的 PFILE 不含注释、格式扁平,且所有带引号的值(如
db_name='orcl')会被展开成无引号形式,注意单引号是否丢失
从 PFILE 创建 SPFILE:改完必须 reload
改完 PFILE 后不能直接用它启动——那还是静态配置。要让改动“活”起来,得转回 SPFILE 并重启或重载:
- 先确保数据库已关闭:
SHUTDOWN IMMEDIATE
- 启动到 nomount 状态并创建 SPFILE:
STARTUP NOMOUNT PFILE='/tmp/initsid.ora';<br>CREATE SPFILE FROM PFILE='/tmp/initsid.ora';
- 再重启:
SHUTDOWN IMMEDIATE;<br>STARTUP
- 或者更省事:如果实例已在运行,且你只是小修几个参数,可以直接
ALTER SYSTEM SET ... SCOPE=SPFILE,避免全量重建
修改参数时,SCOPE=MEMORY / SPFILE / BOTH 的坑
很多参数支持动态修改,但写法不对就白忙活:
-
SCOPE=MEMORY:只改当前实例内存,重启即失效
-
SCOPE=SPFILE:只写入 SPFILE,下次启动才生效,当前不生效
-
SCOPE=BOTH:内存 + SPFILE 同时改——但仅对「可动态修改」的参数有效,比如 sga_target;对 db_name 这种静态参数,会直接报错 ORA-02096
- 查某个参数是否可动态改:
SELECT name, issys_modifiable, ispdb_modifiable FROM v$parameter WHERE name = 'xxx';
-
issys_modifiable = IMMEDIATE 才能用 SCOPE=BOTH,FALSE 就只能改 SPFILE 后重启
SID.ora STARTUP PFILE='/path/initsid.ora')或 SPFILE 损坏时才起作用 - 连上数据库(必须是
sysdba权限)后执行:CREATE PFILE='/tmp/initsid.ora' FROM SPFILE;
- 如果没指定路径,Oracle 默认写到 $ORACLE_HOME/dbs/init
SID.ora,容易覆盖旧配置 - 导出后的 PFILE 不含注释、格式扁平,且所有带引号的值(如
db_name='orcl')会被展开成无引号形式,注意单引号是否丢失
从 PFILE 创建 SPFILE:改完必须 reload
改完 PFILE 后不能直接用它启动——那还是静态配置。要让改动“活”起来,得转回 SPFILE 并重启或重载:
- 先确保数据库已关闭:
SHUTDOWN IMMEDIATE
- 启动到 nomount 状态并创建 SPFILE:
STARTUP NOMOUNT PFILE='/tmp/initsid.ora';<br>CREATE SPFILE FROM PFILE='/tmp/initsid.ora';
- 再重启:
SHUTDOWN IMMEDIATE;<br>STARTUP
- 或者更省事:如果实例已在运行,且你只是小修几个参数,可以直接
ALTER SYSTEM SET ... SCOPE=SPFILE,避免全量重建
修改参数时,SCOPE=MEMORY / SPFILE / BOTH 的坑
很多参数支持动态修改,但写法不对就白忙活:
-
SCOPE=MEMORY:只改当前实例内存,重启即失效
-
SCOPE=SPFILE:只写入 SPFILE,下次启动才生效,当前不生效
-
SCOPE=BOTH:内存 + SPFILE 同时改——但仅对「可动态修改」的参数有效,比如 sga_target;对 db_name 这种静态参数,会直接报错 ORA-02096
- 查某个参数是否可动态改:
SELECT name, issys_modifiable, ispdb_modifiable FROM v$parameter WHERE name = 'xxx';
-
issys_modifiable = IMMEDIATE 才能用 SCOPE=BOTH,FALSE 就只能改 SPFILE 后重启
SHUTDOWN IMMEDIATE
STARTUP NOMOUNT PFILE='/tmp/initsid.ora';<br>CREATE SPFILE FROM PFILE='/tmp/initsid.ora';
SHUTDOWN IMMEDIATE;<br>STARTUP
ALTER SYSTEM SET ... SCOPE=SPFILE,避免全量重建 -
SCOPE=MEMORY:只改当前实例内存,重启即失效 -
SCOPE=SPFILE:只写入 SPFILE,下次启动才生效,当前不生效 -
SCOPE=BOTH:内存 + SPFILE 同时改——但仅对「可动态修改」的参数有效,比如sga_target;对db_name这种静态参数,会直接报错ORA-02096 - 查某个参数是否可动态改:
SELECT name, issys_modifiable, ispdb_modifiable FROM v$parameter WHERE name = 'xxx';
-
issys_modifiable = IMMEDIATE才能用SCOPE=BOTH,FALSE就只能改 SPFILE 后重启
spfile 的路径、权限、备份习惯常被忽略——它一旦损坏,没有 pfile 备份,实例就起不来。每次改完 spfile,顺手跑一次 create pfile from spfile 存个档,花不了十秒。

















