Oracle参数文件(PFILE与SPFILE)维护操作总结

Oracle参数文件(PFILE与SPFILE)维护操作总结

一、Oracle参数文件的作用

Oracle参数文件(Parameter File)是数据库实例启动时最先读取的核心配置文件。它定义了数据库实例的物理结构、内存分配、控制文件位置、数据库名称以及大量系统默认值,是数据库设计和性能调优的重要基础。

Oracle参数文件分为两种类型:

类型 全称 格式 特点
PFILE 初始化参数文件(Initialization Parameter File) 纯文本(ASCII) 可用文本编辑器直接修改,Oracle 9i之前唯一的形式
SPFILE 服务器参数文件(Server Parameter File) 二进制数据文件 Oracle 9i引入,不支持直接编辑,只能通过SQL命令在线修改(可通过strings spfile.ora查看内容)

Oracle官方建议使用SPFILE管理数据库参数。SPFILE的核心优势在于:

  • 在线修改:支持在数据库运行时动态修改参数,无需停机
  • RMAN备份支持:RMAN原生支持SPFILE备份,这是PFILE不具备的特性
  • 一致性保证:避免多节点参数不一致的问题

数据库启动时,Oracle按照以下顺序搜索参数文件:

复制代码
spfile<SID>.ora → spfile.ora → init<SID>.ora
其中SID表示环境变量ORACLE_SID,环境变量ORACLE_SID的查看方式
su - oracle
env|grep ORACLE_SID

二、PFILE和SPFILE的位置

2.1 单机环境

在单机Oracle环境中,参数文件默认存放在$ORACLE_HOME/dbs目录下:

文件类型 默认命名规则 示例
SPFILE spfile<SID>.ora spfileorcl.ora
PFILE init<SID>.ora initorcl.ora

通过以下命令可以确认当前使用的是哪种参数文件:

复制代码
SQL> SHOW PARAMETER spfile;

如果VALUE列显示具体的SPFILE路径,说明数据库使用SPFILE启动;

如果为空,则使用PFILE启动。

使用file命令可以直观区分两种文件的格式:

复制代码
$ file init.ora
init.ora: ASCII English text
$ file spfileorcl.ora
spfileorcl.ora: data

备注:Windows环境下的存放位置%ORACLE_HOME%\database\文件夹中

2.2 RAC集群环境

RAC环境中的参数文件位置与单机有本质区别:

核心原则 :RAC中所有实例必须使用同一个SPFILE ,因此SPFILE必须存放在所有节点都能访问的共享存储上。

SPFILE可存放的位置包括:

  • ASM磁盘组(最常用)
  • 集群文件系统
  • 共享RAW设备
  • NFS共享存储

典型路径示例

复制代码
+DATA/orcl/spfileorcl.ora

RAC中SPFILE的定位机制

  • 各节点$ORACLE_HOME/dbs/init<SID>.ora文件中记录了SPFILE的ASM路径
  • 集群启动时,各节点通过该PFILE指向共享存储中的SPFILE

查看RAC中SPFILE位置的方法:

复制代码
SQL> SHOW PARAMETER spfile;

或使用SRVCTL命:

复制代码
$ srvctl config database -d <dbname>

[oracle@host33rac1 ~]$ srvctl config database -d orcl
Database unique name: orcl
Database name: orcl
Oracle home: /u01/app/oracle/product/11.2/db_1
Oracle user: oracle
Spfile: +DATA/orcl/spfileorcl.ora         --这里保存了spfile参数文件的位置,记录在集群配置文件中
...下面输出省略...

RAC环境的PFILE内容示例

复制代码
$ cat $ORACLE_HOME/dbs/initorcl1.ora
spfile='+DATA/orcl/spfileorcl.ora'

注意 :RAC中执行CREATE PFILE FROM SPFILE时,如果不指定完整路径,会覆盖本地的init<SID>.ora文件,需要手动恢复内容。正确的做法是指定绝对路径:

复制代码
CREATE PFILE='/home/oracle/pfile.ora' FROM SPFILE='+DATA/orcl/spfileorcl.ora';

三、参数的修改方法

3.1 如何判断参数是否可以动态修改

通过查询V$PARAMETER视图的ISSYS_MODIFIABLE列可以判断参数类型:

ISSYS_MODIFIABLE值 参数类型 说明
IMMEDIATE 动态参数 可在线修改,立即生效
DEFERRED 延迟参数 当前会话不生效,后续会话生效
FALSE 静态参数 必须重启数据库才能生效

查询示例:

复制代码
set linesize 200 pagesize 999
col name format a30
col value format a30
SELECT name, value, issys_modifiable 
FROM v$parameter 
WHERE name = 'undo_retention';

查询结果
NAME                           VALUE                          ISSYS_MOD
------------------------------ ------------------------------ ---------
undo_retention                 900                            IMMEDIATE

查询所有静态参数

复制代码
set linesize 200 pagesize 999
col name format a30
col value format a30
SELECT name, value, issys_modifiable 
FROM v$parameter 
WHERE issys_modifiable = 'FALSE';

3.2 SCOPE参数的用法

ALTER SYSTEM SET命令中的SCOPE子句控制参数修改的生效方式和持久化范围:

SCOPE值 行为 适用参数
MEMORY 仅修改内存,立即生效,重启后失效 仅动态参数
SPFILE 仅写入SPFILE,重启后生效 动态参数+静态参数
BOTH 同时修改内存和SPFILE,立即生效且持久化 仅动态参数(默认行为)

3.3 修改示例

动态参数修改

复制代码
ALTER SYSTEM SET undo_retention=10800 SCOPE=BOTH;

静态参数修改 (必须指定SCOPE=SPFILE):

复制代码
ALTER SYSTEM SET processes=151 SCOPE=SPFILE;
-- 如果误用 SCOPE=BOTH 会报错:
-- ORA-02095: specified initialization parameter cannot be modified

延迟参数修改(对后续会话生效):

复制代码
ALTER SYSTEM SET sort_area_size=104800 DEFERRED;

集群环境参数修改(可以指定生效节点):

复制代码
ALTER SYSTEM SET undo_retention=10800 sid='orcl1' SCOPE=BOTH;  //表示修改节点一的指定参数
ALTER SYSTEM SET undo_retention=10800 sid='orcl2' SCOPE=BOTH;  //表示修改节点二的指定参数
ALTER SYSTEM SET undo_retention=10800 sid='*' SCOPE=BOTH;  //表示修改集群所有节点的指定参数

重要提醒 :任何通过ALTER SYSTEM修改的参数只会写入SPFILE,不会自动同步到PFILE 。如果同时维护PFILE作为备用,修改后应手动执行CREATE PFILE FROM SPFILE进行同步。


四、参数文件的备份方式

4.1 手工备份

方法一:通过CREATE PFILE导出备份

这是最常用的手工备份方式,将二进制SPFILE导出为文本PFILE:

复制代码
-- 从当前运行的SPFILE创建PFILE备份
CREATE PFILE='/home/oracle/pfile_backup.ora' FROM SPFILE;

-- 或从指定的SPFILE文件创建
CREATE PFILE='/home/oracle/pfile_backup.ora'  FROM SPFILE='+DATA/orcl/spfileorcl.ora';

优点:生成的PFILE是纯文本,可直接查看和编辑所有参数设置。

方法二:直接复制文件
复制代码
# 备份SPFILE
cp $ORACLE_HOME/dbs/spfileorcl.ora /home/oracle/spfileorcl.ora.bak

# 备份PFILE
cp $ORACLE_HOME/dbs/initorcl.ora /home/oracle/initorcl.ora.bak

4.2 RMAN备份

RMAN是Oracle官方推荐的备份工具,仅支持备份SPFILE(二进制文件),不支持备份PFILE(文本文件)。

备份当前SPFILE

复制代码
RMAN> BACKUP SPFILE;

有如下输出:
piece handle=/u01/app/oracle/product/11.2/db_1/dbs/074tphki_1_1 tag=TAG20260721T154522 comment=NONE

随数据库一起备份(默认包含SPFILE):

复制代码
RMAN> BACKUP DATABASE;

备份SPFILE到指定格式

复制代码
RMAN> BACKUP AS BACKUPSET SPFILE;

有如下输出:
piece handle=/u01/app/oracle/product/11.2/db_1/dbs/084tphkp_1_1 tag=TAG20260721T154529 comment=NONE

4.3 备份最佳实践

  1. 定期备份:建议每次数据库配置变更后立即备份SPFILE
  2. 定期备份:建议在每次数据库备份或者归档日志备份后,备份spfile和控制文件,写入一个备份脚本中实现
  3. 多重备份:同时使用手工导出(PFILE)和RMAN备份,形成互补

五、参数文件的还原方式

5.1 手工还原

场景一:SPFILE损坏,有PFILE备份

使用PFILE启动数据库,然后重新创建SPFILE:

复制代码
# 1. 使用PFILE启动到NOMOUNT状态
SQL> STARTUP NOMOUNT PFILE='/backup/pfile_backup.ora';

# 2. 从PFILE创建新的SPFILE
SQL> CREATE SPFILE='$ORACLE_HOME/dbs/spfileorcl.ora'  FROM PFILE='/backup/pfile_backup.ora';
# 3. 重启数据库使用SPFILE
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
场景二:直接复制备份文件恢复
复制代码
# 将备份的SPFILE复制回原位置
cp /backup/spfileorcl.ora.bak $ORACLE_HOME/dbs/spfileorcl.ora
场景三:从告警日志重建PFILE

如果没有任何备份,可以从告警日志中提取参数信息重建PFILE。数据库每次启动时都会将使用的初始化参数写入告警日志:

复制代码
# 1. 定位告警日志位置
SQL> SELECT VALUE FROM V$DIAG_INFO WHERE NAME='Diag Trace';

# 2. 从告警日志中提取参数设置部分
$ grep "Using parameter settings" alert_<SID>.log -A 100

# 3. 将提取的参数内容整理成PFILE格式
# 4. 使用PFILE启动并重建SPFILE

备注:步骤2的输出,类似如下
grep "Using parameter settings" alert_orcl2.log -A 100
Using parameter settings in server-side pfile /u01/app/oracle/product/11.2/db_1/dbs/initorcl2.ora
System parameters with non-default values:
  processes                = 1500
  sessions                 = 2272
  spfile                   = "+DATA/orcl/spfileorcl.ora"
  sga_target               = 1136M
  control_files            = "+DATA/orcl/control01.ctl"
  control_files            = "+DATA/orcl/control02.ctl"
  db_block_size            = 8192
  compatible               = "11.2.0.4.0"
  log_archive_dest_1       = "location=+ARCH"
  log_archive_dest_2       = ""
  log_archive_dest_3       = ""
  fal_client               = ""
  fal_server               = ""
  log_archive_config       = "NODG_CONFIG"
  log_archive_max_processes= 8
  cluster_database         = TRUE
  standby_file_management  = "MANUAL"
  thread                   = 2
  undo_tablespace          = "UNDOTBS2"
  instance_number          = 2
  remote_login_passwordfile= "EXCLUSIVE"
  db_domain                = ""
  dispatchers              = "(PROTOCOL=TCP) (SERVICE=orclXDB)"
  remote_listener          = "hostrac-scan:1521"
  audit_file_dest          = "/u01/app/oracle/admin/orcl/adump"
  audit_trail              = "DB"
  db_name                  = "orcl"
  open_cursors             = 300
  pga_aggregate_target     = 376M
  diagnostic_dest          = "/u01/app/oracle"

5.2 RMAN还原

RMAN还原SPFILE的前提是已经通过RMAN执行过SPFILE备份

场景一:从自动备份还原
复制代码
RMAN> STARTUP NOMOUNT;
RMAN> RESTORE SPFILE FROM AUTOBACKUP;
RMAN> STARTUP FORCE;
场景二:从指定备份片还原
复制代码
RMAN> RESTORE SPFILE FROM '/backup_path/spfile_backup.bkp';
场景三:还原到指定位置
复制代码
RMAN> RESTORE SPFILE TO '/tmp/spfile_restore.ora' FROM AUTOBACKUP;
场景四:从自动备份还原并生成PFILE
复制代码
RMAN> RESTORE SPFILE TO PFILE '/tmp/init.ora' FROM AUTOBACKUP;

5.3 RAC环境下的特殊注意事项

RAC环境中还原SPFILE需要额外注意:

  1. SRVCTL注册信息 :SPFILE在OCR中有注册信息。还原SPFILE后,如果路径发生变化,需要使用SRVCTL更新注册:

    复制代码
    $ srvctl modify database -d <dbname> -p <new_spfile_path>
  2. 各节点PFILE同步 :每个节点的$ORACLE_HOME/dbs/init<SID>.ora文件中的SPFILE路径必须保持一致

  3. ASM权限 :如果SPFILE存放在ASM磁盘组中,确保grid用户有相应权限


六、隐含参数

6.1 隐含参数介绍

Oracle 中还有一些隐含的参数无法直接通过 show parameter 的方式查询,Oracle 的隐藏参数 (hidden parameters) ,由oracle内部使用,以 '_' 开头。

6.2 查看select * from v$parameter的执行计划

复制代码
SQL> select * from v$parameter;。
  执行计划
  ----------------------------------------------------------
  Plan hash value: 1128103955
  ------------------------------------------------------------------------------
  | Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
 
  ------------------------------------------------------------------------------
  |   0 | SELECT STATEMENT  |          |     1 |  4414 |     1 (100)| 00:00:01 |
  |*  1 |  HASH JOIN        |          |     1 |  4414 |     1 (100)| 00:00:01 |
  |*  2 |   FIXED TABLE FULL| X$KSPPI  |     1 |   249 |     0   (0)| 00:00:01 |
  |   3 |   FIXED TABLE FULL| X$KSPPCV |   100 |   406K|     0   (0)| 00:00:01 |
  ------------------------------------------------------------------------------
可以看到,底层是查询两张内部表X$KSPPI和X$KSPPCV
desc x$ksppi
  名称         是否为空? 类型
  ------------ -------- ---------------
  ADDR                  RAW(4)           --内存地址
  INDX                  NUMBER           --序号,从0开始
  INST_ID               NUMBER           --instance number
  KSPPINM               VARCHAR2(64)     --参数名称
  KSPPITY               NUMBER           --参数类型 1,'boolean' 2,'string', 3,'number',4,'file
  KSPPDESC              VARCHAR2(64)     --描述
  KSPPIFLG              NUMBER           --标志字段(用来说明是isses_modifiable or issys_modifiable
 
desc x$ksppcv
  名称          是否为空? 类型
  ------------- -------- -------------
  ADDR                   RAW(4)         --内存地址
  INDX                   NUMBER         --序号,从0开始
  INST_ID                NUMBER         --instance number
  KSPPSTVL               VARCHAR2(512)  --当前值
  KSPPSTDF               VARCHAR2(9)    --是否为缺省值
  KSPPSTVF               NUMBER         --标志字段,用来说明('Modified' or 'System Modified' or is_adjusted)
  KSPPSTCMNT             VARCHAR2(255)  --comment

6.3 查看当前实例的某一个隐含参数

复制代码
set linesize 200
col name format a30
col value format a15
col description format a30
SELECT i.ksppinm name,
       CV.ksppstvl VALUE,
       CV.ksppstdf isdefault,
       DECODE (BITAND (CV.ksppstvf, 7),
               1, 'MODIFIED',
               4, 'SYSTEM_MOD',
               'FALSE')
          ismodified,
       DECODE (BITAND (CV.ksppstvf, 2), 2, 'TRUE', 'FALSE') isadjusted,
       i.ksppdesc description
  FROM sys.x$ksppi i, sys.x$ksppcv CV
 WHERE i.inst_id = USERENV ('Instance')
       AND CV.inst_id = USERENV ('Instance')
       AND i.indx = CV.indx
       AND i.ksppinm LIKE '/_%' ESCAPE '/'
       and i.ksppinm like '_controlfile_autobackup_delay'
ORDER BY REPLACE (i.ksppinm, '_', '');

备注:
i.ksppinm like '_controlfile_autobackup_delay' 表示查询_controlfile_autobackup_delay隐含参数!
如果需要查询其它的隐含参数,将查询内容进行实际修改即可

6.4 修改隐含参数

复制代码
类似如下
alter system set "_controlfile_autobackup_delay"=600  scope=both;
注意:隐含参数一定要加上双引号, 引号内不能有空格, 只能包含参数的名字,否则报错!

七、event事件参数

7.1 event事件参数介绍

复制代码
Oracle数据库可以通过event可以开启或关闭Oracle某项特性,Events事件是Oracle的重要诊断工具以及问题解决方法,很多时候需要通过Events设置来屏蔽或更改Oracle的行为

生效范围:实例级别或者会话级别
是否立即:即时生效或者重启生效
提示:可以在$ORACLE_HOME/rdbms/mesg/oraus.msg查看各类event的解释

7.2 在spfile中修改event参数

复制代码
alter system set event='10235 trace name context forever,level 512', '10015 trace name context forever, level 1' scope=spfile;

清空event的值
ALTER SYSTEM RESET EVENT SCOPE=SPFILE SID='*';

7.3 在init参数文件中修改event参数

复制代码
方法一
*.event='10235 trace name context forever,level 512:10015 trace name context forever,level 1'

方法二
*.event='10235 trace name context forever,level 512'
*.event='10015 trace name context forever,level 1'

方法三
*.event='10235 trace name context forever,level 512:\
10015 trace name context forever,level 1'

清空init参数文件的event参数
直接删除init文件中的event参数即可

总结

维度 PFILE SPFILE
格式 纯文本 二进制
可编辑性 可直接编辑 只能通过SQL修改
动态修改 不支持 支持
RMAN备份 不支持 支持
Oracle推荐
适用场景 备用、应急恢复 生产环境

核心建议

  • 生产环境统一使用SPFILE
  • 每次参数变更后,同时保留一份PFILE导出作为应急备份
  • 将SPFILE纳入RMAN备份策略
  • RAC环境中务必确保SPFILE位于共享存储,并用SRVCTL正确注册
相关推荐
l1t1 小时前
kryonix提交的DuckDB 统一并优化标量执行器基础设施 - #24564 PR
开发语言·数据库·数据仓库·sql
鸽芷咕1 小时前
【金仓数据库征文】从 Oracle 到金仓:一次零误差的数据库国产化迁移实录
数据库·oracle
0566462 小时前
RAG 向量检索:从“查字“到“查意“
数据库·人工智能·学习·oracle
bug嘛我经常写2 小时前
dbf文件UTF-8转GBK编码,以及两编码文件互转
数据库·python
知行合一。。。2 小时前
LangGraph--03--本地服务与 Studio 调试
数据库
你不是我我2 小时前
【AI 测评】PostgreSQL主从流复制实战:数据同步、状态验证与故障切换
数据库·postgresql
月落归舟2 小时前
Redis 三种消息队列实现方案
数据库·redis·list
棒棒的唐2 小时前
postgresql集成pgvector
数据库·postgresql
智购科技智能售货柜3 小时前
自动售货机商品识别YOLO模型训练实战:从6万张图片到98%识别率的完整复盘~YH
运维·服务器·数据库·人工智能·redis·物联网·yolo