Oracle ASM存储Spfile解析

 

在之前的文章《Oracle Restart启动数据库实例故障一例》(http://space.itpub.net/17203031/viewspace-774622)中,笔者解决了一个由于使用create pfile from 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" 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

 

 

2、分析和思考

 

一起冷静想想~

 

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的方法。

 

3、配置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

 

 

故障彻底解决。

 

4、结论

 

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

 

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

 

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

 

时间: 2024-07-31 20:33:18

Oracle ASM存储Spfile解析的相关文章

如何解决Oracle ASM故障导致的数据丢失问题

一.故障描述 ASM磁盘组掉线 ,ASM实例不能mount.ASM磁盘组有4个500G的磁盘组成,数据库和ASM软件为10.2.0.1,急需恢复oracle数据库. 二.故障分析 分析组成ASM磁盘组的磁盘,取出ASM元数据,对元数据进行分析:ASM存储元数据损坏,导致diskgroup无法mount.重组ASM存储空间,从ASM磁盘组中导出数据库文件,然后对数据库文件进行检测,修复.如果数据库文件完好,可以利用从ASM磁盘组中导出的数据库文件启动数据库.如果数据库文件损坏,这底层解析这些数据库

【ASM】Oracle ASM + 11gR2 + RHEL6.5 安装

[ASM]Oracle ASM + 11gR2 + RHEL6.5 安装 1.1    简介     1.1.1    ASMLib     1.1.2    什么是 udev     1.1.3    Why ASMLIB and why not 1.2    在 RHEL 6.4 上安装 Oracle 11gR2 + ASM --使用udev 1.2.1    检查硬件     1.2.2    安装软件包检查     1.2.3    修改主机名     1.2.4    网络配置    

Oracle ASM+11gR2安装

[ASM]Oracle ASM + 11gR2 + RHEL6.5 安装 1.1    简介     1.1.1    ASMLib     1.1.2    什么是 udev     1.1.3    Why ASMLIB and why not 1.2    在 RHEL 6.4 上安装 Oracle 11gR2 + ASM --使用udev 1.2.1    检查硬件     1.2.2    安装软件包检查     1.2.3    修改主机名     1.2.4    网络配置    

How to use udev for Oracle ASM in Oracle Linux 6 怎样使用udev在linux 6系统上使用asm

大部分在网上可以找到的文档都是在RHEL5或者OEL5中设置udev,udev对于Linux而言最大的作用是防止操作系统重新启动以后,作为ASM磁盘使用的盘符发生变化. 比如说Tim Hall的文章:UDEV SCSI Rules Configuration for ASM in Oracle Linux 5. 比如说Maclean的文章:利用UDEV服务解决RAC ASM存储设备名. 但是在OEL6或者RHEL6中,这一切都有所变化. 主要的变化是: 1. scsi_id的命令语法发生了变化,

Oracle的存储结构关系

oracle数据库的整体结构                                                             数据库的结构关系 其实,我前面一篇讲表空间的时候就介绍了数据库的结构,只是那个图只是简单的层次关系,这张图片看上去挺封复杂的,只要关注几个概念就行了. Database(数据库) :数据库是按照数据结构来组织.存储和管理数据的仓库. Tablespaces(表空间) :表空间是数据库的逻辑划分,一个表空间只能属于一个数据库.所有的数据库对象都存放在

在Linux 6上使用UDEV解决RAC ASM存储设备名问题

连接:http://www.askmaclean.com/archives/%E5%9C%A8linux-6%E4%B8%8A%E4%BD%BF%E7%94%A8udev%E8%A7%A3%E5%86%B3rac-asm%E5%AD%98%E5%82%A8%E8%AE%BE%E5%A4%87%E5%90%8D%E9%97%AE%E9%A2%98.html Maclean一直是使用UDEV替代ASMLIB做RAC存储设备名绑定的拥护者,相关的专题文章可以作为读者的预读知识是:Why ASMLIB

深入内核:从Oracle ASM自动备份头块到ASMFD

张乐奕 云和恩墨副总经理 Oracle ACE 总监 ITPUB Oracle数据库管理版版主.Oracle高可用版版主.ACOUG联合创始人 在 Oracle 10.2.0.5 之前,ASM 磁盘的头块并没有自己的备份,因此一旦头块损坏,如果没有以前 kfed read 备份出来的信息,也就没有办法使用 kfed merge来作头块恢复,特别是如果一个磁盘组中所有的磁盘头块都出现问题(比如被人为地创建了 PV ),恢复 ASM 磁盘头块的操作就会非常麻烦. 但是从 Oracle 10.2.0.

(转)How to use udev for Oracle ASM in Oracle Linux 6

How to use udev for Oracle ASM in Oracle Linux 6 原文:http://www.dbform.com/html/2011/1708.html 大部分在网上可以找到的文档都是在RHEL5或者OEL5中设置udev,udev对于Linux而言最大的作用是防止操作系统重新启动以后,作为ASM磁盘使用的盘符发生变化.比如说Tim Hall的文章:UDEV SCSI Rules Configuration for ASM in Oracle Linux 5.比

Oracle诊断案例-Spfile案例一则

oracle Oracle诊断案例-Spfile案例一则   link: http://www.eygle.com/case/spfile.htm 情况说明:系统:SUN Solaris8数据库版本:9203问题描述:工程人员报告,数据库在重新启动时无法正常启动.检查发现UNDO表空间丢失.问题诊断及解决过程如下:   1. 登陆系统检查alert.log文件 检查alert.log文件是通常是我们诊断数据库问题的第一步 SunOS 5.8 login: rootPassword: Last l