2. 需要用srvctl修改config信息,指向新文件
第二篇:Oracle ASM存储Spfile解析
以下来自论坛:
在之前的文章《Oracle Restart启动数据库实例故障一例》(http://space.itpub.net/17203031/viewspace-774622)中,笔者解决了一个由于使用create pfilefrom spfile引起的Restart无法启动数据库实例的故障。
严格的说,笔者并没有完全将其解决。主要体现在Spfile的使用和存放上。
1、问题简述
Oracle Database安装在ASM存储的时候,默认都是使用ASM保存Spfile参数文件。与早期的pfile文件不同,Spfile是具有二进制格式,能够支持部分参数的动态调整。
所以,我们出现问题的时候,发现Restart的配置信息中包括了ASM中的Spfile参数内容。
[oracle@SimpleLinux ~]$ 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:
我们之前的修复方法,就是将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" encounteredthe 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
2、分析和思考
一起冷静想想~
Pfile和spfile是参数文件经历的两个阶段。在umount阶段,Oracle是通过参数$ORACLE_HOME和$ORACLE_SID进行目录定位,定位到$ORACLE_HOME/dbs或者$ORACLE_HOME/database,到里面寻找制定规则的参数文件。
Oracle首先会去寻找Spfile,之后才会去找Pfile。我们通过create spfile和create pfile可以实现两者的转化。
一个比较常见的问题案例是:如果我们把启动参数改错了,启动不了了,那么怎么办?标准的做法是通过create pfilefrom spfile,拿到一个文本格式的参数pfile。在里面修改启动参数,纠正错误。启动时候,使用startuppfile=xxx使用“指定的pfile”启动数据库实例,再通过create spfile from pfile将变化固化下来。
Oracle Restart提供的配置参数spfile其实是很诡异的。从直观上看,好像是有startup数据库实例,后面可以自己去指定参数文件,类似于startupspfile=xxx的作用。但是实际上,startup是不支持spfile这样的参数的。
如果这个参数是用于指定,那么在Restart启动的时候我们已经设置争取的spfile位置,指定位置上面也有文件。但是根本没有效果,Oracle还是寻找参数文件。
那么,就只有一种可能性:即使Oracle使用Restart启动,也不是依靠指定的spfile,还是按照原有的规则运行。
网络上有一种方法,说的是如果我们需要指定一个spfile启动文件的时候,应该怎么做。答案是建立一个空的pfile文件,里面直接指定SPFILE参数的文件位置。
综合几种思路,我们可以设想到Spfile保存在ASM里面,同时让Restart和sqlplus启动时候可以访问到ASMSpfile的方法。
3、配置ASM上SPFILE启动
首先是创建出ASM上的spfile。注意:创建spfile的时候一定是从pfile创建,所以需要转换一下。
SQL> startuppfile=/u01/app/oracl