碰到一个有趣的案例,使用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个人空间ayG0bXr2u
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
?9FR u0Database Buffers 88080384 bytesITPUB个人空间e/t\C
V8m
Redo Buffers 2281472 bytes
cnbK+],]0u0Database mounted.ITPUB个人空间(}O Qvo[S!l*ZQ
Database opened.ITPUB个人空间2J"KvtY
SQL> show parameter spfile
NAME TYPE VALUEITPUB个人空间6q2lL6s5R{
------------------------------------ ----------- ------------------------------ITPUB个人空间)Aj tNn+Bz3K
spfile string /data/oracle/product/11.1/dbs/
0\Lp0oMO0 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个人空间
k Lmi4Y
[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个人空间w6pM1F{{,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的内容,否则有可能造成初始化参数设置丢失的情况。