Oracle ASM存储Spfile解析

在以前的文章《Oracle Restart启动数据库实例故障一例》(http://space.itpub.net/17203031/viewspace-774622)中,笔者解决了一个因为使用create pfile from spfile引发的Restart没法启动数据库实例的故障。linux

 

严格的说,笔者并无彻底将其解决。主要体如今Spfile的使用和存放上。sql

 

一、问题简述数据库

 

Oracle Database安装在ASM存储的时候,默认都是使用ASM保存Spfile参数文件。与早期的pfile文件不一样,Spfile是具备二进制格式,可以支持部分参数的动态调整。网络

 

因此,咱们出现问题的时候,发现Restart的配置信息中包括了ASM中的Spfile参数内容。oracle

 

 

[oracle@SimpleLinux ~]$ srvctl config database -d ora11gapp

Database unique name: ora11gide

Database name:spa

Oracle home: /u01/app/oracle/product/11.2.0/db_1.net

Oracle user: oracleip

Spfile: +DATA/ORA11G/spfileora11g.ora

Domain:

Start options: open

Stop options: immediate

Database role: PRIMARY

Management policy: AUTOMATIC

Database instance: ora11g

Disk Groups: DATA,RECO

Services:

 

 

咱们以前的修复方法,就是将spfile内容置空,让数据库实例启动使用默认路径$ORACLE_HOME/dbs的spfile和pfile参数进行检索。

 

 

SQL> show parameter spfile

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string      /u01/app/oracle/product/11.2.0

                                                 /db_1/dbs/spfileora11g.ora

 

 

可是此时,咱们在ASM路径上是存在spfile上的。

 

 

ASMCMD> pwd       

+DATA/ORA11G

 

ASMCMD> ls

CONTROLFILE/

DATAFILE/

ONLINELOG/

PARAMETERFILE/

TEMPFILE/

spfileora11g.ora

 

 

在这种状况下,若是配置了ASM目录的spfile启动标志,启动Restart会报错。

 

 

[oracle@SimpleLinux ~]$ srvctl modify database -d ora11g -p +DATA/ora11g/spfileora11g.ora

[oracle@SimpleLinux ~]$ srvctl start database -d ora11g

PRCR-1079 : Failed to start resource ora.ora11g.db

CRS-5010: Update of configuration file "/u01/app/oracle/product/11.2.0/db_1/dbs/initora11g.ora" failed: details at "(:CLSN00014:)" in "/u01/app/grid/product/11.2.0/grid/log/simplelinux/agent/ohasd/oraagent_grid/oraagent_grid.log"

CRS-5017: The resource action "ora.ora11g.db start" encountered the following error:

CRS-5010: Update of configuration file "/u01/app/oracle/product/11.2.0/db_1/dbs/initora11g.ora" failed: details at "(:CLSN00014:)" in "/u01/app/grid/product/11.2.0/grid/log/simplelinux/agent/ohasd/oraagent_grid/oraagent_grid.log"

. For details refer to "(:CLSN00107:)" in "/u01/app/grid/product/11.2.0/grid/log/simplelinux/agent/ohasd/oraagent_grid/oraagent_grid.log".

 

CRS-2674: Start of 'ora.ora11g.db' on 'simplelinux' failed

 

 

二、分析和思考

 

一块儿冷静想一想~

 

Pfile和spfile是参数文件经历的两个阶段。在umount阶段,Oracle是经过参数$ORACLE_HOME和$ORACLE_SID进行目录定位,定位到$ORACLE_HOME/dbs或者$ORACLE_HOME/database,到里面寻找制定规则的参数文件。

 

Oracle首先会去寻找Spfile,以后才会去找Pfile。咱们经过create spfile和create pfile能够实现二者的转化。

 

一个比较常见的问题案例是:若是咱们把启动参数改错了,启动不了了,那么怎么办?标准的作法是经过create pfile from spfile,拿到一个文本格式的参数pfile。在里面修改启动参数,纠正错误。启动时候,使用startup pfile=xxx使用“指定的pfile”启动数据库实例,再经过create spfile from pfile将变化固化下来。

 

Oracle Restart提供的配置参数spfile实际上是很诡异的。从直观上看,好像是有startup数据库实例,后面能够本身去指定参数文件,相似于startup spfile=xxx的做用。可是实际上,startup是不支持spfile这样的参数的。

 

若是这个参数是用于指定,那么在Restart启动的时候咱们已经设置争取的spfile位置,指定位置上面也有文件。可是根本没有效果,Oracle仍是寻找参数文件。

 

那么,就只有一种可能性:即便Oracle使用Restart启动,也不是依靠指定的spfile,仍是按照原有的规则运行。

 

网络上有一种方法,说的是若是咱们须要指定一个spfile启动文件的时候,应该怎么作。答案是创建一个空的pfile文件,里面直接指定SPFILE参数的文件位置。

 

综合几种思路,咱们能够设想到Spfile保存在ASM里面,同时让Restart和sqlplus启动时候能够访问到ASM Spfile的方法。

 

三、配置ASM上SPFILE启动

 

首先是建立出ASM上的spfile。注意:建立spfile的时候必定是从pfile建立,因此须要转换一下。

 

 

SQL> startup pfile=/u01/app/oracle/product/11.2.0/db_1/dbs/initora11g.ora

ORACLE instance started.

 

Total System Global Area  263639040 bytes

Fixed Size                  1344312 bytes

Variable Size             134221000 bytes

Database Buffers          125829120 bytes

Redo Buffers                2244608 bytes

Database mounted.

Database opened.

SQL> show parameter spfile

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string

 

SQL> create spfile='+DATA/ORA11G/spfileora11g.ora' from pfile;

File created.

 

 

此时,咱们在ASM里面能够看到生成的spfile二进制文件。

 

 

ASMCMD> ls -l

Type           Redund  Striped  Time             Sys  Name

                                                 Y    CONTROLFILE/

                                                 Y    DATAFILE/

                                                 Y    ONLINELOG/

                                                 Y    PARAMETERFILE/

                                                 Y    TEMPFILE/

                                                 N    spfileora11g.ora => +DATA/ORA11G/PARAMETERFILE/spfile.267.829130539

 

 

第二部是建立维护一个“转发”参数文件。

 

 

 

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

 

[oracle@SimpleLinux ~]$ cd $ORACLE_HOME

[oracle@SimpleLinux db_1]$ cd dbs

[oracle@SimpleLinux dbs]$ ls -l

total 28

-rw-rw---- 1 oracle asmadmin 1544 Sep 12 12:58 hc_ora11g.dat

-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora

-rwxr-x--- 1 oracle oinstall  959 Oct 18 09:51 initora11g.ora

-rwxrwx--- 1 oracle oinstall  887 Sep 29 09:31 initora11g.ora.bk

-rw-r----- 1 oracle asmadmin   24 Sep 12 12:58 lkORA11G

-rw-r----- 1 oracle oinstall 1536 Sep 12 13:11 orapwora11g

-rw-r----- 1 oracle asmadmin 2560 Oct 18 09:57 spfileora11g.ora

 

 

在里面要完成两件事情,一个是将dbs目录下面的spfile删除。由于依据Oracle启动的原则,是先找spfile,以后再找pfile。第二件是修改文本参数文件,做为转发。

 

 

[oracle@SimpleLinux dbs]$ mv spfileora11g.ora spfileora11g.ora.bk

 

[oracle@SimpleLinux dbs]$ cat initora11g.ora

SPFILE='+DATA/ora11g/spfileora11g.ora’ –注意:不能包括*前缀或者SID前缀

 

[oracle@SimpleLinux dbs]$ ls -l

total 28

-rw-rw---- 1 oracle asmadmin 1544 Sep 12 12:58 hc_ora11g.dat

-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora

-rwxr-x--- 1 oracle oinstall   41 Oct 18 10:07 initora11g.ora

-rwxrwx--- 1 oracle oinstall  887 Sep 29 09:31 initora11g.ora.bk

-rw-r----- 1 oracle asmadmin   24 Sep 12 12:58 lkORA11G

-rw-r----- 1 oracle oinstall 1536 Sep 12 13:11 orapwora11g

-rw-r----- 1 oracle asmadmin 2560 Oct 18 09:57 spfileora11g.ora.bk

 

 

使用srvctl关闭和启动数据库。

 

 

[oracle@SimpleLinux dbs]$ srvctl start database -d ora11g

[oracle@SimpleLinux dbs]$ srvctl config database -d ora11g

Database unique name: ora11g

Database name:

Oracle home: /u01/app/oracle/product/11.2.0/db_1

Oracle user: oracle

Spfile: +DATA/ora11g/spfileora11g.ora

Domain:

Start options: open

Stop options: immediate

Database role: PRIMARY

Management policy: AUTOMATIC

Database instance: ora11g

Disk Groups: DATA,RECO

Services:

 

[oracle@SimpleLinux dbs]$ srvctl status database -d ora11g

Database is running.

 

 

数据库中,spfile参数被设置为ASM路径。

 

 

SQL> show parameter spfile;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string      +DATA/ora11g/spfileora11g.ora

 

 

故障完全解决。

 

四、结论

 

综合上面的实验,咱们能够看到ASM下Spfile使用的方法。ASM下的Spfile并非抛弃原有的启动规则,而是借助原有的pfile进行了目标转接。以后笔者查看MOS中的对应方案,官方推荐的也是这样的作法。

 

这样就须要一个前提,就是dbs或者database目录中不能包括spfile。若是包括了,Oracle设置的转接机制就被替换掉了。

 

另外一个问题是咱们一直看到的错误提示信息,提示参数文件initora11g.ora格式不能识别。笔者的理解是,原始的文件是笔者使用create pfile from spfile建立出来的,默认的SPFILE=XXX的内容被覆盖。而Oracle Restart不能识别这种非转接内容文件,因此报错。

相关文章
相关标签/搜索