问题:使用PFILE可以正常启动数据库,利用这个PFILE创建SPFILE后,数据库竟然无法启动。
解答:问题的根源很简单,Oracle启动处理PFILE的机制和创建SPFILE时候的机制不一样。
重现的问题:
[oracle@yangtk ~]$ sqlplus "/ as sysdba"
SQL*Plus: Release 11.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> startup
ORACLE instance started.
Total System Global Area 267825152 bytes
Fixed Size 1299316 bytes
Variable Size 176163980 bytes
Database Buffers 88080384 bytes
Redo Buffers 2281472 bytes
Database mounted.
Database opened.
SQL> show parameter spfile
NAME TYPE VALUE
----------------------------- -----------------spfile string /data/oracle/product/11.1/dbs/
spfileora11g.ora
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down. |
以下创建一个可以使Oracle正常启动的PFILE:
SQL> host
[oracle@yangtk ~]$ echo "spfile=/data/oracle/product/11.1/dbs/spfileora11g.ora" >> initora11g.ora
[oracle@yangtk ~]$ exit
exit
SQL> startup pfile=initora11g.ora
ORACLE instance started.
Total System Global Area 267825152 bytes
Fixed Size 1299316 bytes
Variable Size 176163980 bytes
Database Buffers 88080384 bytes
Redo Buffers 2281472 bytes
Database mounted.
Database opened.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE 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
*.spfile='/data/oracle/product/11.1/dbs/spfileora11g.ora' |
文件中仅包含一行记录,且这个参数指向当前文件本身,Oracle在试图读取参数文件时碰到了死循环,因此启动一直没有反应。
从这里也可以看到启动和CREATE SPFILE时对PFILE处理的区别:启动的时候,如果参数文件中指定SPFILE的位置,则Oracle会根据配置找到相应的SPFILE,读取其中的配置;而对于CREATE SPFILE语句,仅仅是将PFILE中所有的内容转化为SPFILE中二进制的内容,不会根据参数值的设置寻找其他文件。
注释:在创建SPFILE时,不能仅仅参考PFILE能否启动数据库这个条件,还要检查PFILE的内容,否则很可能造成初始化参数设置丢失的情况 |
阅读(599) | 评论(0) | 转发(0) |