--==========================================
--SPFILE 错误导致数据库无法启动 (ORA-01565)
--==========================================
SPFILE 错误导致数据库无法启动
SQL > startup
ORA - 01078 : failure in processing system parameters
ORA - 01565 : error in identifying file '/u01/app/oracle/10g/dbs/spfileorcl.ora'
ORA - 27046 : file size is not a multiple of logical block size
Additional information : 1
分析:
从错误的提示来看,第一行说系统参数出错
第二行详细指出了 spfileorcl . ora 出现了错误
再看第三行, google 了一下 ORA - 27046 ,原来是 spfileorcl . ora 文件被损坏,导致 spfile 文件不可读
在 spfile 文件损坏的时候,如果尝试使用 create pfile from spfile ,也将收到同样的错误
由于告警日志 alert_orcl . log 之前被清空,故此时未能看到更详细的错误提示
解决办法:
由于 spfile 为二进制文件,因此修复比较困难,所以考虑从备份的 spfile 中恢复
1.spfile 备份是否存在,如存在则恢复到原始位置,如放在缺省位置,则为 $ORACLE_HOME / dbs , Windows 平台为 % ORACLE_HOME % / database
2.spfile 备份文件不存在,也可以从 pfile 启动,启动时指定 pfile 参数
3.spfile 备份文件不存在 , pfile 也不存在 , 则从告警日志 alert_orcl . log 中最后一次正常启动中使用 strings 命令提取相关参数来手动创
建 pfile ,然后从 pfile 启动 , 启动时指定 pfile 参数。
注意从告警日志中复制过来的内容有些需要加单引号 , 一是所有的路径需要使用单引号括起来,其次是和 db_name , db_domain 等等
4.spfile 备份文件不存在 , pfile 也不存在 , 也不愿从告警日志中手动创建 pfile ,则可以使用数据库初始化时的 pfile 来启动,缺省位置为
$ORALCE_BASE / admin / $ORACLE_SID / pfile
5. 也可以在 SQLplus 下直接使用 create spfile from pfile = '<dir>' 来先创建 spfile 文件,再启动 Oracle
6. 注意
从缺省的 pfile 或数据库初始化的 pfile 中来启动数据库后,有很多参数不一致,可能会导致一些功能不可用,需要调整
建议定期备份参数文件
7. 更多有关参数文件的详细描述,请参阅: Oracle 参 数 文 件
解决示例
-- 本示例直接数据库了初始化数据库时的 pfile 来启动数据库
-- 启动后收到了有关控制文件的错误提示
SQL > startup pfile = '/u01/app/oracle/admin/orcl/pfile/init.ora.2292010214348'
ORACLE instance started .
Total System Global Area 251658240 bytes
Fixed Size 1218796 bytes
Variable Size 83887892 bytes
Database Buffers 163577856 bytes
Redo Buffers 2973696 bytes
ORA - 00205 : error in identifying control file , check alert log for more info
-- 从告警日志中查看控制文件的信息,告警日志提示 control03.ctl 不存在
SQL > ho tail - n 100 / u01 / app / oracle / admin / orcl / bdump / alert_orcl . log
Thu Jul 29 16 : 52 : 44 2010
ALTER DATABASE MOUNT
Thu Jul 29 16 : 52 : 44 2010
ORA - 00202 : control file : '/u01/app/oracle/oradata/orcl/control03.ctl'
ORA - 27037 : unable to obtain file status
Linux Error : 2 : No such file or directory
-- 查看控制文件相关的参数信息中定义了 control03.ctl
SQL > show parameter control_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string / u01 / app / oracle / oradata / orcl / c
ontrol01 . ctl , / u01 / app / oracle /
oradata / orcl / control02 . ctl , / u
01 / app / oracle / oradata / orcl / con
trol03 . ctl
SQL > ho ls / u01 / app / oracle / oradata / orcl / control03 . ctl -- 查看 control03.ctl 物理文件不存在
ls : / u01 / app / oracle / oradata / orcl / control03 . ctl : No such file or directory
-- 修改 pfile 文件
SQL > ho vim / u01 / app / oracle / admin / orcl / pfile / init . ora.2292010214348
-- 删除这段, /u01/app/oracle/oradata/orcl/control03.ctl 内容
-- 从修改后的 pfile 文件启动
SQL > startup pfile = '/u01/app/oracle/admin/orcl/pfile/init.ora.2292010214348'
Total System Global Area 251658240 bytes
Fixed Size 1218796 bytes
Variable Size 83887892 bytes
Database Buffers 163577856 bytes
Redo Buffers 2973696 bytes
Database mounted .
Database opened .
SQL > ho ls / u01 / app / oracle / 10g / dbs /
alert_orcl . log core_5372 init . ora initorcl . ora orapworcl
core_5360 hc_orcl . dat initdw . ora lkORCL
-- 从 pfile 文件中创建 spfile
SQL > create spfile from pfile = '/u01/app/oracle/admin/orcl/pfile/init.ora.2292010214348' ;
File created .
-- 查看 spfileorcl.ora 已生成
SQL > ho ls / u01 / app / oracle / 10g / dbs /
alert_orcl . log hc_orcl . dat initorcl . ora spfileorcl . ora
core_5360 init . ora lkORCL
core_5372 initdw . ora orapworcl
SQL > shutdown immediate ;
Database closed .
Database dismounted .
ORACLE instance shut down .
SQL > startup -- 从 spfile 启动
ORACLE instance started .
Total System Global Area 251658240 bytes
Fixed Size 1218796 bytes
Variable Size 83887892 bytes
Database Buffers 163577856 bytes
Redo Buffers 2973696 bytes
Database mounted .
Database opened .
实际上可以先 create spfile from pfile = '<dir>' , 再从 spfile 启动,使用 alter system 修改相关的参数比直接修改 pfile 似乎
更简单些,比如上面的例子中需要去掉一个控制文件。当然此类问题是仁者见仁,智者见者。
总之一条,定期备份参数文件是相当有必要的 !
更多
Oracle 实例和Oracle 数据库(Oracle 体系结构)
Oracle 联机重做日志文件(ONLINE LOG FILE)