Oracle spfile 参数文件

Posted Lucifer三思而后行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle spfile 参数文件相关的知识,希望对你有一定的参考价值。

📚 前言

上篇讲了 Oracle pfile 参数文件 ,这篇讲讲 spfile 参数文件!

Oracle数据库启动时,第一步开启到nomount状态,需要使用到参数文件。

spfile 也是参数文件的一种,全称:服务器参数文件(Server Parameter Files)

☀️ spfile 介绍

spfileSID.ora 文件就是 spfile 参数文件,是二进制文件。

从 Oracle 9i 开始,Oracle 引入 spfile 文件,使用spfile用户可以通过 ALTER SYSTEM 或者 ALTER SESSION 来修改参数,而不再需要通过手工修改。

使用 spfile 参数文件有以下好处:

  • 动态参数的更改可以立即生效,用户可以选择使更改只应用于当前实例还是应用到spfile,或者都应用;
  • 可以彻底告别手工修改初始化参数文件,也就大大减少了人为错误的发生;
  • spfile 是一个二进制文件,可以使用rman进行备份,增加数据库的安全,便于恢复;

所以,现在基本都是默认使用 spfile 来启动数据库,但是如果由于 spfile 修改参数数据库无法启动时,就只能使用 pfile 修改参数进行启动。

如何查看当前数据库使用的是不是 spfile 启动?

连接数据库之后,执行以下命令:

show parameter spfile

如果以下框选的地方不为空,则代表当前数据库使用 spfile 启动,否则是 pfile 启动。

⭐️ spfile 参数文件位置

单机数据库,spfile 参数文件通常存在于以下目录下:

  • Windows: $ORACLE_HOME/database
  • Linux: $ORACLE_HOME/dbs

RAC 集群,spfile 通常是存放在 ASM 磁盘中,以上目录仅存放 pfile 文件。

  • pfile 文件格式为:initSID.ora
  • spfile 文件格式为:spfileSID.ora

🌛 启动优先级

如果同时有 pfile 和 spfile 文件,数据库启动的优先级是如何的?

官方说法: spfileSID.ora > initorcl.ora

⭐️ 拓展:

我看到网上一个有趣的说法,如果使用 spfileSID.ora 文件复制出一个 spfile.ora 文件,那么优先级顺序是:spfileSID.ora > spfile.ora > initorcl.ora

所以,我做了个小测试:

1、首先关闭数据库:

sqlplus / as sysdba
shutdown immediate
exit


2、从 spfileSID.ora 复制一个 spfile.ora 文件:

cd $ORACLE_HOME/dbs
cp spfileorcl.ora spfile.ora

3、重新启动数据库

sqlplus / as sysdba
startup
show parameter spfile

从上图可以看出,优先级最高的是 spfileSID.ora,验证没有问题。

4、删除 spfileSID.ora 文件,重启数据库

cd $ORACLE_HOME/dbs
rm -rf spfileorcl.ora
sqlplus / as sysdba
shutdown immediate
startup
show parameter spfile


根据上图所示,居然真的优先识别到的是 spfile.ora 文件,那就有一个问题,如果是随便 export 一个 ORACLE_SID,是不是也能启动呢?

5、先关闭当前数据库,设置一个新的 ORACLE_SID,启动数据库

export ORACLE_SID=lucifer
sqlplus / as sysdba
startup

根据上图实验,实例名为 lucifer,数据库也是可以成功启动😂。

所以,如果 ORACLE_SID 设置错误的情况下,如果存在 spfile.ora 文件,那么优先级会跳过 spfileSID.ora 文件,直接优先选择 spfile.ora 文件来启动数据库。

6、最后删除所有 spfile 文件,重启数据库

source ~/.bash_profile
rm -rf spfile*
sqlplus / as sysdba
shutdown immediate
startup

当没有 spfile 文件时,最后只能选择 initSID.ora 文件来进行启动数据库。

因此,优先级顺序:spfileSID.ora > spfile.ora > initorcl.ora 是没有问题的。

❄️ 实例讲解

① 从 pfile 切换为 spfile 启动数据库

有一些特殊情况下需要切换使用参数文件,如何切换使用 pfile 和 spfile?

1、首先,使用 pfile 参数文件启动数据库:

sqlplus / as sysdba
startup pfile=$ORACLE_HOME/dbs/initorcl.ora

2、为了测试会生成 spfile 参数文件,我提前删除它:

3、确保当前数据库环境是由 pfile 文件启动,连接 sqlplus:

sqlplus / as sysdba
create spfile from pfile;

执行以上命令,可以根据 pfile 生成 spfile 文件,保存在默认的参数文件目录下。

4、重启数据库,默认会使用 spfile 文件启动:

sqlplus / as sysdba
shutdown immediate
startup

此时,数据库已经使用 spfile 启动。

② 使用 spfile 启动数据库后修改参数错误,导致数据库无法启动

一般什么情况下必须用到 pfile 参数文件?

问题重现

比如,你在数据库中通过 alter system 设置了数据库参数,关闭数据库后,重新打开数据库时报错无法打开。

此时,由于 spfile 是二进制文件,无法直接打开修改,因此需要通过手动生成 pfile 文件进行修改启动。

解决步骤

1、手动生成 pfile 文件

sqlplus / as sysdba
create pfile from spfile;

注意:以上命令可以在未开启数据库时进行执行,pfile生成路径也可以指定:pfile=生成路径/pfile文件名。

2、编辑 pfile 文件,修改错误设置的参数

cd $ORACLE_HOME/dbs
vi initorcl.ora

打开之后,修改 processes 参数为正确✅的数值即可。

3、使用修改后的 pfile 参数文件启动数据库

sqlplus / as sysdba
startup pfile=$ORACLE_HOME/dbs/initorcl.ora

此时,数据库已经成功打开。

4、数据库启动成功后,切换回 spfile 重新启动数据库
由于当前数据库是使用 pfile 进行启动,需要修改为spfile启动。

sqlplus / as sysdba
create spfile from pfile;

修改完之后,重启数据库生效:

sqlplus / as sysdba
shutdown immediate
startup

如上,数据库已经成功恢复为 spfile 启动,并且当前数据库参数也是正确的。

5、注意点

如果是 RAC 集群操作时,由于 RAC 的 spfile 文件是保存在 ASM 磁盘中,所以是跟 pfile 文件配合进行使用。

比如,下方的 RAC 集群示例:

# ASM磁盘下的 spfile 文件
ASMCMD> pwd
+data/orcl
ASMCMD> ls spfile*
spfileorcl.ora

# 一节点 ORACLE_HOME/dbs 目录下的 pfile 文件
[oracle@orcl1 dbs]$ cat initorcl1.ora 
SPFILE='+DATA/orcl/spfileorcl.ora'

通过上述示例可以发现,RAC 实际上使用的还是 pfile 去启动的,但是将 spfile 路径写在 pfile 文件中。

❤️ 注意:

因此,在最后生成 spfile 时,需要手动指定 spfile 的路径为 ASM 磁盘中的路径!

需要注意 $ORACLE_HOME/dbs 目录下不能存在 spfile[ORACLE_SID].ora 文件,否则启动时优先选择 $ORACLE_HOME/dbs 下的 spfile 文件。


本次分享到此结束啦~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

❤️ 技术交流可以 关注公众号:Lucifer三思而后行 ❤️

以上是关于Oracle spfile 参数文件的主要内容,如果未能解决你的问题,请参考以下文章

oracle里。CREATE SPFILE ,spfile是啥意思?

Oracle基础 07 参数文件 pfile/spfile

数据库参数文件PFILE和SPFILE

oracle的参数文件(pfile,spfile)

关于oracle pfile和spfile文件说明

ORACLE RAC如何把spfile参数文件放共享存储上