49-Oracle init.ora-PFILE-SPFILE-启动参数转换实操
一早出现EMCC挂了,之后发现EMCC依赖的instance 挂了,重启startup后发现spfile无法启动。还是和小伙伴把基础问题搞清。spfile是动态文件、动态文件、动态文件,linux下vi看起来部分乱码部分是可编辑的,vi即使可以编辑也需要转换成pfile这样的文本文件再使用,记得备份备份备份。
Oracle 数据库启动时依赖参数文件配置实例行为:
SPFILE(服务器参数文件)、PFILE(参数文件)和 init.ora 三者关系紧密但存在关键差异。
一、核心关系与区别
init.ora 与 PFILE
- init.ora 是 Oracle 提供的参数模板文件,命名格式通常为 init.ora,用于指导用户创建自定义的 PFILE
- **PFILE(如 init.ora)是用户根据 init.ora 模板创建的文本格式参数文件**,需手动编辑,修改后必须重启数据库生效
- 关系:init.ora 是模板,PFILE 是实际使用的配置文件。
SPFILE(动态文件)
- 二进制文件(如 spfile.ora),由 Oracle 自动维护,支持动态修改参数(无需重启)
- - 优先级高于 PFILE:若两者共存,默认优先加载 SPFILE
对比
特性 | PFILE(含init.ora) | SPFILEspfile.ora) |
文件类型 | 文本文件(可直接编辑) | 二进制文件(不可直接编辑) |
修改方式 | 手动编辑文件 | ALTER SYSTEM SET命令动态调整 |
生效条件 | 需重启数据库 | 部分参数可立即生效 |
备份支持 | 不支持 RMAN | 支持 RMAN 备份 |
创建来源 | 基于init.ora模板创建 | 从PFILE生成 (CREATE SPFILE...) |
二、启动机制与加载顺序
1. 默认启动流程
数据库实例启动(STARTUP NOMOUNT 阶段)时,按以下顺序搜索参数文件
- 1.spfile(SID).ora(如 spfileORCL.ora)
- 2.spfile.ora(通用二进制文件)
- 3.init.ora(如 initORCL.ora)
注:若以上均不存在,启动失败。记得备份这个文件,极端的情况从老的备份里扒拉一个出来,编辑关键信息强行开
2. 指定文件启动
- 强制使用 PFILE:
STARTUP PFILE='$ORACLE_HOME/dbs/initORCL.ora';
- 强制使用 SPFILE:需创建临时 PFILE 指向 SPFILE,再通过该 PFILE 启动
-- 创建临时 PFILE(内容:SPFILE='路径/spfile<SID>.ora')
STARTUP PFILE='临时文件路径';
3. 状态查询
- 确认当前使用的文件类型:
SHOW PARAMETER spfile;
-- 若返回 `spfile` 路径 → 使用 SPFILE;若为 `VALUE=NULL` → 使用 PFILE
三、相互转换方法
- PFILE → SPFILE
CREATE SPFILE='$ORACLE_HOME/dbs/spfileORCL.ora'
FROM PFILE='$ORACLE_HOME/dbs/initORCL.ora';
用途:迁移至动态参数管理
- SPFILE → PFILE
CREATE PFILE='$ORACLE_HOME/dbs/initORCL_new.ora'
FROM SPFILE='$ORACLE_HOME/dbs/spfileORCL.ora';
用途:备份或手动调整参数
- 从内存生成 PFILE(Oracle 11g+)
CREATE PFILE FROM MEMORY; -- 直接基于当前内存参数生成文本文件
四、实操记录
- 修改了系统参数文件spfile,导致数据库启动不了。
报错:
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
--内存参数错误的
ORA-00845: MEMORY_TARGET not supported on this system
--db_recovery_area参数错误的
ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated
ORA-01262: Stat failed on a file destination directory
- 在修改参数前,应该先备份spfile文件。
[oracle@em24ai:/u01/app/oracle/product/19.3.0/db/dbs]$
cp spfileemcc.ora spfileemcc.ora.bak
- 1、sqlplus / as sysdba
- 2、使用初始化的文件启动数据库 启动数据库到 nomount 状态,要使用一个可用的pfile
SQL> startup pfile=$ORACLE_HOME/dbs/init1.ora nomount;
- 3、备份初始化文件,然后修改初始化文件的参数配置与系统物理硬件匹配
vi $ORACLE_HOME/dbs/init1.ora
SYS@emcc SQL> create pfile='/u01/app/oracle/product/19.3.0/db/dbs/init1.ora' from spfile;
File created.SYS@emcc SQL> startup pfile='/u01/app/oracle/product/19.3.0/db/dbs/init1.ora'; ORACLE instance started.Total System Global Area 1.0737E+10 bytes
Fixed Size 13683928 bytes
Variable Size 2382364672 bytes
Database Buffers 8321499136 bytes
Redo Buffers 19869696 bytes
Database mounted.
- 4、创建新的 spfile
SQL> create spfile from pfile='$ORACLE_HOME/dbs/init1.ora';
- 5、重新启动数据库
SQL> shutdown immediate;
SQL> startup;
- 6、记得再生成一个可编辑的文本文件,pfile以备下次使用
SYS@emcc SQL> startup mount;
ORACLE instance started.Total System Global Area 1.0737E+10 bytes
Fixed Size 13683928 bytes
Variable Size 2382364672 bytes
Database Buffers 8321499136 bytes
Redo Buffers 19869696 bytes
Database mounted.
SYS@emcc SQL> alter database open;Database altered.SYS@emcc SQL> create pfile='/u01/app/oracle/product/19.3.0/db/dbs/pfileemcc.ora' from spfile;File created.SYS@emcc SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@emcc SQL> startup
ORACLE instance started.Total System Global Area 1.0737E+10 bytes
Fixed Size 13683928 bytes
Variable Size 2382364672 bytes
Database Buffers 8321499136 bytes
Redo Buffers 19869696 bytes
Database mounted.
Database opened.
五、运维实践与注意事项
- 生产环境推荐优先使用 SPFILE:支持动态调整、RMAN 备份,避免重启中断服务
- 故障恢复场景
- SPFILE 损坏时:通过备份的 PFILE 启动,或从内存生成临时 PFILE 后再重建 SPFILE
- 参数误配置:若因参数错误无法启动,可通过临时 PFILE 覆盖错误参数,再重建 SPFILE
- 关键命令示例
- 动态修改参数(使用 SPFILE 时):
-- 需重启生效ALTER SYSTEM SET sga_max_size=4G SCOPE=SPFILE;
注意:SCOPE 的默认值依赖当前参数文件类型
(SPFILE 启动时默认为 BOTH,RAC环境记得是sid=‘*’;)
- init.ora → 参数模板,指导创建 PFILE。
- PFILE → 可编辑的文本配置,需重启生效。
- SPFILE → 二进制动态配置,支持实时调整,生产环境首选。
- 启动优先级:spfile.ora > spfile.ora > init.ora。
- 灵活切换:通过 CREATE SPFILE/PFILE 命令实现互转,适应不同运维需求。
建议生产环境统一使用 SPFILE,结合定期备份(RMAN 或导出为 PFILE)确保参数安全