Oracle 参数文件 PFILE 与 SPFILE 详解

Oracle 参数文件 PFILE 与 SPFILE 详解

适用版本:Oracle Database 11g / 12c / 19c / 23ai 阅读基础:了解 Linux 基本操作、Oracle 实例概念 文档版本:v1.0 / 2026-07


目录


1. 概述:参数文件是实例启动的”DNA”

Oracle 实例启动时(STARTUP 命令),第一件事就是读取参数文件,从中获取 SGA 大小、控制文件位置、数据库块大小、进程数等关键配置信息[1]。

参数文件记录着初始化参数(Initialization Parameters),相当于实例的”DNA”——它定义了实例运行所需的基本环境,决定了 SGA/PGA 的内存分配、进程数量、归档模式、安全选项、性能相关参数等关键属性[2]。

从 Oracle 9i 开始,参数文件分为两种类型:

类型全称格式是否可在线修改
PFILEParameter File(初始化参数文件)文本否(需手工编辑文件)
SPFILEServer Parameter File(服务器参数文件)二进制是(通过 ALTER SYSTEM

自 Oracle 9i 起,Oracle 强烈推荐使用 SPFILE,因为它支持动态修改且具备自描述性[1][2]。


2. PFILE 与 SPFILE 的本质区别

维度PFILESPFILE
文件格式纯文本(可 vi 编辑)二进制(不能直接编辑)
文件名约定init<SID>.oraspfile<SID>.oraspfile.ora
默认位置$ORACLE_HOME/dbs(Linux)
%ORACLE_HOME%\database(Windows)
同 PFILE
修改方式手工编辑文本ALTER SYSTEM SET ... SCOPE=SPFILE/BOTH
修改后生效必须重启实例动态参数立即生效,静态参数需重启
是否支持 RAC 共享否(每个节点独立)(可放在共享存储 ASM 上)
恢复难度容易(有文本备份)较难(损坏后需从 PFILE 重建)
自描述性是(含参数注释、修改时间)
推荐使用调试、特殊场景生产环境标准

3. 参数文件的查找顺序

当执行 STARTUP(未显式指定 PFILE)时,Oracle 按以下顺序查找参数文件[1][3]:

1. spfile<SID>.ora      (首选,如 spfileorcl.ora)
2. spfile.ora           (次选,默认通用名)
3. init<SID>.ora        (最后回退,如 initorcl.ora)

查找路径

  • Linux/Unix:$ORACLE_HOME/dbs
  • Windows:%ORACLE_HOME%\database

验证当前实例使用哪个参数文件

-- 方法 1:通过 V$SPPARAMETER 判断是否使用 SPFILE
SELECT value FROM v$parameter WHERE name = 'spfile';

-- 方法 2:直接查询 SPFILE 路径
SHOW PARAMETER spfile;

-- 方法 3:从 V$SYSTEM_PARAMETER 视图
SELECT name, value, isspecified 
FROM v$spparameter 
WHERE isspecified = 'TRUE';

如果查询返回非空值,说明使用的是 SPFILE;如果为空,则使用的是 PFILE。


4. PFILE 详解

4.1 PFILE 文件结构

PFILE 是纯文本文件,每行一个参数,格式为 name=value,以 # 开头的行是注释[1]:

# /u01/app/oracle/product/19.3.0/dbhome_1/dbs/initorcl.ora
# Oracle 19c PFILE 示例

db_name='orcl'
db_unique_name='orcl'
memory_target=0
sga_target=4G
pga_aggregate_target=1G

# 控制文件位置(多路复用)
control_files=(
  '/u01/oradata/orcl/control01.ctl',
  '/u02/oradata/orcl/control02.ctl',
  '/u03/oradata/orcl/control03.ctl'
)

# 数据库块大小(建库后不可修改)
db_block_size=8192

# 进程数
processes=300

# 字符集
nls_language='AMERICAN'
nls_territory='AMERICA'

# 归档相关
log_archive_format='%t_%s_%r.dbf'
log_archive_dest_1='LOCATION=/u02/archive'

# 诊断目录
diagnostic_dest='/u01/app/oracle'

# 闪回区
db_recovery_file_dest='/u02/fast_recovery_area'
db_recovery_file_dest_size=20G

# Undo 表空间
undo_tablespace='UNDOTBS1'
undo_retention=900

4.2 PFILE 的修改方式

PFILE 必须手工编辑,修改后必须重启实例才能生效:

# 1. 编辑 PFILE
vi $ORACLE_HOME/dbs/initorcl.ora

# 2. 关闭数据库
sqlplus / as sysdba
SQL> SHUTDOWN IMMEDIATE;

# 3. 以 PFILE 启动
SQL> STARTUP PFILE='/u01/app/oracle/product/19.3.0/dbhome_1/dbs/initorcl.ora';

4.3 PFILE 的优缺点

优点

  • 纯文本,可手工编辑
  • 易于版本管理(Git)
  • 损坏后修复简单
  • 适合灾难恢复场景

缺点

  • 不能在线修改参数,每次修改都需重启
  • 不支持 RAC 共享(每个节点独立维护)
  • 容易引入手误(拼写错误、空格等)
  • 缺少参数修改历史记录

5. SPFILE 详解

5.1 SPFILE 文件结构

SPFILE 是 Oracle 维护的二进制文件,其内部结构大致如下:

+-----------------------------+
| 文件头(Header)            |
| - 文件类型标识              |
| - 创建时间                  |
| - 数据库标识                |
+-----------------------------+
| 参数记录区                  |
| - 参数名                    |
| - 参数值                    |
| - 参数类型(静态/动态)     |
| - 修改时间戳                |
| - 注释                      |
+-----------------------------+
| 文件尾校验                  |
+-----------------------------+

5.2 SPFILE 的二进制特性

重要警告:SPFILE 是二进制文件,绝对不能用 vi、notepad 等文本编辑器直接修改,否则会破坏文件结构,导致实例无法启动[3]。

正确做法是使用 ALTER SYSTEM 命令:

-- 修改参数(动态参数)
ALTER SYSTEM SET open_cursors=500 SCOPE=BOTH;

-- 修改参数(静态参数)
ALTER SYSTEM SET processes=500 SCOPE=SPFILE;

-- 重置参数为默认值
ALTER SYSTEM RESET open_cursors SCOPE=SPFILE SID='*';

5.3 SPFILE 的优势

  1. 在线修改:动态参数(如 sga_targetopen_cursors)可通过 ALTER SYSTEM 立即生效,无需重启
  2. 自动持久化:参数修改自动写回 SPFILE,重启后保留
  3. 支持 RAC 共享:SPFILE 可放在 ASM 中,所有节点共享
  4. 自描述性:记录参数修改时间、注释等信息
  5. 减少人为错误:通过 ALTER SYSTEM 修改,避免手写错误

6. PFILE 与 SPFILE 的相互转换

6.1 由 SPFILE 创建 PFILE

将 SPFILE 导出为 PFILE(用于备份或人工审查):

-- 数据库可处于 NOMOUNT / MOUNT / OPEN 状态
CREATE PFILE='/u01/backup/initorcl.ora.bak' 
FROM SPFILE;

-- 简化形式(默认路径)
CREATE PFILE FROM SPFILE;

典型场景

  • 定期备份参数文件
  • 检查参数配置
  • 修改 SPFILE 前先做 PFILE 备份

6.2 由 PFILE 创建 SPFILE

-- 实例关闭状态下也可以创建(用特定 PFILE 启动到 NOMOUNT 后创建)
CREATE SPFILE='/u01/backup/spfileorcl.ora' 
FROM PFILE='/u01/backup/initorcl.ora';

-- 默认路径创建
CREATE SPFILE FROM PFILE='/u01/backup/initorcl.ora';

典型场景

  • SPFILE 损坏后从 PFILE 重建
  • 新建数据库时从模板 PFILE 生成 SPFILE
  • 修改静态参数(先改 PFILE,再重建 SPFILE)

6.3 内存值导出为 PFILE

Oracle 11g+ 支持将内存中当前参数值导出为 PFILE:

CREATE PFILE='/u01/backup/initorcl_mem.ora' FROM MEMORY;

用途:当 SPFILE 丢失且无 PFILE 备份时,可从内存导出当前运行参数。


7. 参数修改:ALTER SYSTEM 命令

ALTER SYSTEM SET 命令的完整语法[1][2]:

ALTER SYSTEM SET parameter_name = value 
  [COMMENT '注释文本']
  [DEFERRED]                  -- 仅对后续会话生效
  [SCOPE = {MEMORY | SPFILE | BOTH}]
  [SID = 'sid' | '*'];        -- RAC 中指定实例

7.1 SCOPE=MEMORY

  • 仅修改当前实例内存中的参数值
  • 不写入 SPFILE,重启后失效
  • 仅适用于动态参数
  • 适用场景:临时测试参数效果
ALTER SYSTEM SET open_cursors=500 SCOPE=MEMORY;

7.2 SCOPE=SPFILE

  • 仅修改 SPFILE,不影响当前实例
  • 重启后才生效
  • 适用于静态参数(如 processesdb_block_size
  • 适用场景:必须重启的参数
-- processes 是静态参数,必须 SCOPE=SPFILE
ALTER SYSTEM SET processes=500 SCOPE=SPFILE;

-- 修改后重启生效
SHUTDOWN IMMEDIATE;
STARTUP;

7.3 SCOPE=BOTH

  • 同时修改内存和 SPFILE(默认值)
  • 立即生效,且持久化
  • 仅适用于动态参数
ALTER SYSTEM SET open_cursors=500 SCOPE=BOTH;
-- 等价于
ALTER SYSTEM SET open_cursors=500;

7.4 动态参数 vs 靜态参数

动态参数(Dynamic Parameters):可在实例运行时修改并立即生效

参数类别示例
内存相关sga_targetpga_aggregate_targetshared_pool_size
会话限制open_cursorssessionsprocesses(部分版本)
归档log_archive_dest_nlog_archive_format
闪回db_flashback_retention_target
资源管理resource_limitcpu_count

静态参数(Static Parameters):修改后必须重启实例才生效

参数说明
db_block_size数据库块大小,建库后不可修改
db_name数据库名称
processes最大进程数
db_unique_name数据库唯一名
cluster_databaseRAC 模式开关
compatible兼容版本
nls_languagenls_territory字符集相关

查询参数是否可在线修改

SELECT name, issys_modifiable 
FROM v$parameter 
WHERE name IN ('sga_target', 'processes', 'open_cursors', 'db_block_size');

-- ISSYS_MODIFIABLE 取值:
-- IMMEDIATE  : 动态参数,可立即修改
-- DEFERRED   : 修改后对新会话生效
-- FALSE      : 静态参数,需重启

8. 启动时指定参数文件

默认情况下,STARTUP 按查找顺序自动选择参数文件。也可以显式指定:

-- 显式使用 PFILE 启动(只能指定 PFILE,不能直接指定 SPFILE)
STARTUP PFILE='/u01/backup/initorcl.ora' NOMOUNT;

-- 使用 PFILE 启动后,再创建 SPFILE
CREATE SPFILE FROM PFILE;
SHUTDOWN IMMEDIATE;
STARTUP;  -- 此时使用新生成的 SPFILE

注意STARTUP 不能直接指定 SPFILE 路径,必须通过 PFILE 间接引用。可以在 PFILE 中通过 SPFILE 参数指定 SPFILE 路径:

# initorcl.ora 中指定 SPFILE
SPFILE='+DATA/orcl/spfileorcl.ora'

这种设计常用于 RAC 环境:本地 PFILE 只有一行 SPFILE=...,实际参数都在 ASM 中的 SPFILE 里。


9. 常用初始化参数清单

9.1 内存相关

参数说明默认值(19c)动态
memory_targetAMM 自动内存管理总目标0
memory_max_targetAMM 上限0
sga_targetASMM SGA 目标0
sga_max_sizeSGA 上限= sga_target
pga_aggregate_targetPGA 总目标10M / 2GB
pga_aggregate_limitPGA 硬上限2×pga_aggregate_target

9.2 数据库基本属性

参数说明
db_name数据库名(≤8 字符)
db_unique_name数据库唯一名(DG 环境必须)
db_domain数据库域名
instance_name实例名(RAC 中区分节点)
db_block_size标准块大小(2K/4K/8K/16K/32K)
compatible兼容版本号(如 19.0.0.0)
cluster_databaseRAC 开关(TRUE/FALSE)

9.3 控制文件与归档

参数说明
control_files控制文件路径(多路复用)
log_archive_dest_n归档目的地(n=1..31)
log_archive_format归档文件命名格式
log_archive_dest_state_n归档目的地状态

9.4 性能与进程

参数说明默认
processes最大进程数150
sessions最大会话数1.5×processes + 22
open_cursors单会话最大游标数50
cpu_countCPU 数量自动检测
parallel_threads_per_cpu每 CPU 并行线程2

9.5 诊断与闪回

参数说明
diagnostic_destADR 基目录
db_recovery_file_dest闪回区路径
db_recovery_file_dest_size闪回区大小
db_flashback_retention_target闪回保留时间(分钟)

10. 相关视图

10.1 V$PARAMETER

显示当前会话生效的参数值:

SELECT name, value, isdefault, isses_modifiable, issys_modifiable
FROM v$parameter
WHERE name LIKE 'sga%'
ORDER BY name;
含义
name参数名
value当前值
isdefault是否为默认值
isses_modifiable会话级可修改
issys_modifiable系统级可修改(IMMEDIATE/DEFERRED/FALSE)

10.2 V$SYSTEM_PARAMETER

显示实例级参数值(即所有会话默认值):

SELECT name, value, type, isspecified 
FROM v$system_parameter 
WHERE name = 'open_cursors';

10.3 V$SPPARAMETER

显示 SPFILE 中记录的参数值(可能与运行值不同):

SELECT name, value, sid, isspecified 
FROM v$spparameter 
WHERE isspecified = 'TRUE'
ORDER BY name;

对比三种视图

-- 对比 sga_target 的运行值 vs SPFILE 值
SELECT 'v$parameter' AS source, name, value 
FROM v$parameter WHERE name = 'sga_target'
UNION ALL
SELECT 'v$spparameter', name, value 
FROM v$spparameter WHERE name = 'sga_target';

10.4 V$PARAMETER2

与 V$PARAMETER 类似,但每个值占一行(便于列表型参数查看):

SELECT name, value, ordinal 
FROM v$parameter2 
WHERE name = 'control_files'
ORDER BY ordinal;

11. 常见坑与排错

11.1 SPFILE 损坏

现象:执行 STARTUP 报错:

ORA-01078: failure in processing system parameters
ORA-01565: error in identifying file 'spfileorcl.ora'
ORA-27046: file size is not a multiple of logical block size

原因:SPFILE 被文本编辑器修改导致二进制结构损坏。

修复步骤

# 1. 备份损坏的 SPFILE(用于分析)
mv $ORACLE_HOME/dbs/spfileorcl.ora /tmp/spfileorcl.ora.broken

# 2. 找最近的 PFILE 备份
ls -l $ORACLE_HOME/dbs/initorcl.ora*

# 3. 用 PFILE 启动到 NOMOUNT
sqlplus / as sysdba
SQL> STARTUP PFILE='/u01/backup/initorcl.ora' NOMOUNT;

# 4. 从 PFILE 重建 SPFILE
SQL> CREATE SPFILE FROM PFILE='/u01/backup/initorcl.ora';

# 5. 重新启动
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

11.2 修改静态参数报 ORA-02096

现象

ALTER SYSTEM SET processes=500;
-- ORA-02096: specified initialization parameter is not modifiable with this option

原因processes 是静态参数,必须用 SCOPE=SPFILE

修复

ALTER SYSTEM SET processes=500 SCOPE=SPFILE;
-- 然后重启
SHUTDOWN IMMEDIATE;
STARTUP;

11.3 RAC 中参数只对一个节点生效

现象:在节点 1 修改参数,节点 2 没生效。

原因:未指定 SID='*',导致参数只写到当前实例。

修复

-- 错误写法(仅对当前实例生效)
ALTER SYSTEM SET open_cursors=500;
-- 等价于 SID='<当前实例>'

-- 正确写法(RAC 所有节点生效)
ALTER SYSTEM SET open_cursors=500 SID='*';

11.4 PFILE 启动失败:参数文件路径错误

现象

ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/19.3.0/dbhome_1/dbs/initorcl.ora'

原因

  • PFILE 文件名不符合 init<SID>.ora 规范
  • ORACLE_SID 设置错误
  • PFILE 在错误的 ORACLE_HOME 下

排查

echo $ORACLE_SID
echo $ORACLE_HOME
ls -l $ORACLE_HOME/dbs/init$ORACLE_SID.ora

11.5 SPFILE 路径找不到

现象

ORA-01078: failure in processing system parameters
ORA-01565: error in identifying file 'spfileorcl.ora'

排查步骤

# 1. 确认 SPFILE 存在
ls -l $ORACLE_HOME/dbs/spfile*

# 2. 检查 PFILE 中是否指定了 SPFILE 路径
cat $ORACLE_HOME/dbs/initorcl.ora

# 3. 如果 SPFILE 在 ASM 中,PFILE 应包含:
#    SPFILE='+DATA/orcl/spfileorcl.ora'

11.6 修改 db_name 后无法启动

现象:修改 db_name 后启动报:

ORA-01504: database name does not match

原因db_name 是静态参数,修改后需用 NID 工具同步修改控制文件。

正确流程

# 1. 修改 SPFILE 中的 db_name
sqlplus / as sysdba
ALTER SYSTEM SET db_name='newdb' SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;

# 2. 启动到 mount 状态
STARTUP MOUNT;

# 3. 使用 nid 修改数据库名
nid TARGET=/ DBNAME=newdb

# 4. 重新启动
STARTUP;

12. 最佳实践

12.1 使用 SPFILE 作为生产标准

  • 所有生产环境统一使用 SPFILE
  • RAC 环境将 SPFILE 放在 ASM 共享存储
  • 保留至少一份 PFILE 备份

12.2 定期备份参数文件

# 每月备份 SPFILE 到 PFILE
sqlplus -s / as sysdba <<EOF
CREATE PFILE='/u01/backup/pfile_$(date +%Y%m%d).ora' FROM SPFILE;
EXIT;
EOF

或在 RMAN 备份脚本中加入:

rman target / <<EOF
BACKUP SPFILE FORMAT '/u01/backup/spfile_%U';
EXIT;
EOF

12.3 修改参数前先做 PFILE 备份

-- 修改前备份
CREATE PFILE='/u01/backup/pfile_before_change.ora' FROM SPFILE;

-- 修改参数
ALTER SYSTEM SET sga_target=8G SCOPE=BOTH;

-- 验证生效
SHOW PARAMETER sga_target;

12.4 修改静态参数前确认影响

-- 检查参数是否静态
SELECT name, issys_modifiable 
FROM v$parameter 
WHERE name = 'processes';

-- 检查当前值与目标值差距
SELECT name, value, isdefault 
FROM v$parameter 
WHERE name = 'processes';

12.5 RAC 环境使用 SID=’*’

-- RAC 中所有节点统一生效
ALTER SYSTEM SET open_cursors=500 SID='*';

-- 仅对特定节点生效(特殊场景)
ALTER SYSTEM SET instance_number=1 SID='orcl1' SCOPE=SPFILE;

12.6 使用隐藏参数前咨询 Oracle Support

  • 隐藏参数(以 _ 开头)不在官方文档中
  • 修改隐藏参数需 Oracle Support 明确建议
  • 修改前必须备份 SPFILE
-- 查看隐藏参数(仅查询,不修改)
SELECT ksppinm AS name, ksppstvl AS value, ksppdesc AS description
FROM x$ksppi a, x$ksppsv b
WHERE a.indx = b.indx
  AND ksppinm LIKE '\_%' ESCAPE '\'
  AND ksppinm LIKE '%parallel%';

12.7 版本控制

将 PFILE 备份纳入版本控制系统:

# 将 PFILE 备份目录纳入 Git
cd /u01/backup/pfiles
git add pfile_*.ora
git commit -m "Backup PFILE on $(date +%Y-%m-%d)"
git push

13. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Managing Initialization Parameters Using a Server Parameter File” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-initialization-parameters-using-a-server-parameter-file.html

[2] Oracle Database Reference 19c, “Initialization Parameters” https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/init-parameters-1.html

[3] AskTOM, “SPFILE vs PFILE - When to Use Which” https://asktom.oracle.com/pls/apex/f?p=100:1:0

[4] 墨天轮,“Oracle SPFILE 与 PFILE 详解与最佳实践” https://www.modb.pro/db/1759656813559025664

[5] Oracle Support Note 1002927.6, “How to Recreate a SPFILE from a PFILE” https://support.oracle.com/epmos/faces/DocumentDisplay?id=1002927.6