Oracle 参数文件 PFILE 与 SPFILE 详解
Oracle 参数文件 PFILE 与 SPFILE 详解
适用版本:Oracle Database 11g / 12c / 19c / 23ai 阅读基础:了解 Linux 基本操作、Oracle 实例概念 文档版本:v1.0 / 2026-07
目录
- 1. 概述:参数文件是实例启动的”DNA”
- 2. PFILE 与 SPFILE 的本质区别
- 3. 参数文件的查找顺序
- 4. PFILE 详解
- 5. SPFILE 详解
- 6. PFILE 与 SPFILE 的相互转换
- 7. 参数修改:ALTER SYSTEM 命令
- 8. 启动时指定参数文件
- 9. 常用初始化参数清单
- 10. 相关视图
- 11. 常见坑与排错
- 12. 最佳实践
- 13. 参考资料
1. 概述:参数文件是实例启动的”DNA”
Oracle 实例启动时(STARTUP 命令),第一件事就是读取参数文件,从中获取 SGA 大小、控制文件位置、数据库块大小、进程数等关键配置信息[1]。
参数文件记录着初始化参数(Initialization Parameters),相当于实例的”DNA”——它定义了实例运行所需的基本环境,决定了 SGA/PGA 的内存分配、进程数量、归档模式、安全选项、性能相关参数等关键属性[2]。
从 Oracle 9i 开始,参数文件分为两种类型:
| 类型 | 全称 | 格式 | 是否可在线修改 |
|---|---|---|---|
| PFILE | Parameter File(初始化参数文件) | 文本 | 否(需手工编辑文件) |
| SPFILE | Server Parameter File(服务器参数文件) | 二进制 | 是(通过 ALTER SYSTEM) |
自 Oracle 9i 起,Oracle 强烈推荐使用 SPFILE,因为它支持动态修改且具备自描述性[1][2]。
2. PFILE 与 SPFILE 的本质区别
| 维度 | PFILE | SPFILE |
|---|---|---|
| 文件格式 | 纯文本(可 vi 编辑) | 二进制(不能直接编辑) |
| 文件名约定 | init<SID>.ora | spfile<SID>.ora 或 spfile.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 的优势
- 在线修改:动态参数(如
sga_target、open_cursors)可通过ALTER SYSTEM立即生效,无需重启 - 自动持久化:参数修改自动写回 SPFILE,重启后保留
- 支持 RAC 共享:SPFILE 可放在 ASM 中,所有节点共享
- 自描述性:记录参数修改时间、注释等信息
- 减少人为错误:通过
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,不影响当前实例
- 重启后才生效
- 适用于静态参数(如
processes、db_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_target、pga_aggregate_target、shared_pool_size |
| 会话限制 | open_cursors、sessions、processes(部分版本) |
| 归档 | log_archive_dest_n、log_archive_format |
| 闪回 | db_flashback_retention_target |
| 资源管理 | resource_limit、cpu_count |
静态参数(Static Parameters):修改后必须重启实例才生效
| 参数 | 说明 |
|---|---|
db_block_size | 数据库块大小,建库后不可修改 |
db_name | 数据库名称 |
processes | 最大进程数 |
db_unique_name | 数据库唯一名 |
cluster_database | RAC 模式开关 |
compatible | 兼容版本 |
nls_language、nls_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_target | AMM 自动内存管理总目标 | 0 | 是 |
memory_max_target | AMM 上限 | 0 | 否 |
sga_target | ASMM SGA 目标 | 0 | 是 |
sga_max_size | SGA 上限 | = sga_target | 否 |
pga_aggregate_target | PGA 总目标 | 10M / 2GB | 是 |
pga_aggregate_limit | PGA 硬上限 | 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_database | RAC 开关(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_count | CPU 数量 | 自动检测 |
parallel_threads_per_cpu | 每 CPU 并行线程 | 2 |
9.5 诊断与闪回
| 参数 | 说明 |
|---|---|
diagnostic_dest | ADR 基目录 |
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