我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

创建默认SPFILE需谨慎

上一篇 / 下一篇  2008-02-15 23:56:41 / 个人分类:ORACLE

碰到一个有趣的案例,使用PFILE可以正常启动数据库,利用这个PFILE创建SPFILE后,数据库无法启动。

 

 

其实造成问题的根源很简单,Oracle启动处理PFILE的机制和创建SPFILE时候的机制不一样。

下面重现一下问题:

[oracle@yangtk ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release11.1.0.6.0 - Production on Thu Jan 10 13:20:10 2008

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startupITPUB个人空间ay G0bXr2u
ORACLE instance started.

Total System Global Area  267825152 bytes
t[!u%ImM0Fixed Size                  1299316 bytes
s5{GW:NZP!b0Variable Size             176163980 bytes
ut!b x)N-Y ?9FRu0Database Buffers           88080384 bytesITPUB个人空间e/t\C V8m
Redo Buffers                2281472 bytes
cnbK+],]0u0Database mounted.ITPUB个人空间(}OQvo[S!l*ZQ
Database opened.ITPUB个人空间2J"KvtY
SQL> show parameter spfile

NAME                                 TYPE        VALUEITPUB个人空间6q2lL6s5R{
------------------------------------ ----------- ------------------------------ITPUB个人空间)AjtNn+Bz3K
spfile                               string      /data/oracle/product/11.1/dbs/
0\Lp0oM O0                                                 spfileora11g.ora
`+gGa#chM;{f0SQL> shutdown immediateITPUB个人空间 mF:U B.F,{+cw
Database closed.ITPUB个人空间+^5_g C`Q y1K1l5g
Database dismounted.ITPUB个人空间,rO%Q:j?w
ORACLE instance shut down.

下面创建一个可以使Oracle正常启动的PFILE

SQL> hostITPUB个人空间5z|0e"l%e4Fg!X5{A
[oracle@yangtk ~]$ echo "spfile=/data/oracle/product/11.1/dbs/spfileora11g.ora" >> initora11g.oraITPUB个人空间 kLmi4Y
[oracle@yangtk ~]$ exit
oH;OfH4s:g-U6?0exit

SQL> startup pfile=initora11g.oraITPUB个人空间-~!_0Gg^TE a3Z2c|8S
ORACLE instance started.

Total System Global Area  267825152 bytes
OLG R"q\6vH0Fixed Size                  1299316 bytesITPUB个人空间w6p M1F{{,VW {
Variable Size             176163980 bytes
G1oF4n&s}0Database Buffers           88080384 bytes
a.ge,bM0Redo Buffers                2281472 bytesITPUB个人空间N(p {(u4~{:K ] hah
Database mounted.ITPUB个人空间 VL/SR\ KL t,I
Database opened.ITPUB个人空间[vVdp/h7~
SQL> shutdown immediate
*dj&x#l8u.j&g0Database closed.
*|1H3D4[.r aSN:XB0Database dismounted.
;q6J%c)y6N\3V2g#\&_0ORACLE instance shut down.

下面通过CREATE SPFILE FROM PFILE的方式根据刚刚建立的pfile创建默认的SPFILE文件:

SQL> create spfile from pfile='/home/oracle/initora11g.ora';

File created.

SQL> startup

Oracle永远处于startup的状态,数据库的实例无法启动。

中止Oracle启动进程,检查最后创建的SPFILE文件:

[oracle@yangtk ~]$ strings /data/oracle/product/11.1/dbs/spfileora11g.ora
|"cd's't:y0*.spfile='/data/oracle/product/11.1/dbs/spfileora11g.ora'

文件中仅包含一行记录,且这个参数指向当前文件本身,Oracle在试图读取参数文件时碰到了死循环,因此启动一直没有反应。

从这里也可以看到启动和CREATE SPFILE时对PFILE处理的区别:启动的时候,如果参数文件中指定SPFILE的位置,则Oracle会根据配置找到相应的SPFILE,读取其中的配置;而对于CREATE SPFILE语句,仅仅是将PFILE中所有的内容转化为SPFILE中二进制的内容,不会根据参数值的设置寻找其他文件。

在创建SPFILE的时候,不要仅仅凭着这个PFILE能否启动数据库这个条件,还要检查PFILE的内容,否则有可能造成初始化参数设置丢失的情况。

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar