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 备份最佳实践
- 定期备份:建议每次数据库配置变更后立即备份SPFILE
- 定期备份:建议在每次数据库备份或者归档日志备份后,备份spfile和控制文件,写入一个备份脚本中实现
- 多重备份:同时使用手工导出(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需要额外注意:
-
SRVCTL注册信息 :SPFILE在OCR中有注册信息。还原SPFILE后,如果路径发生变化,需要使用
SRVCTL更新注册:$ srvctl modify database -d <dbname> -p <new_spfile_path> -
各节点PFILE同步 :每个节点的
$ORACLE_HOME/dbs/init<SID>.ora文件中的SPFILE路径必须保持一致 -
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正确注册