oracle在启动时和启动过程中经常会出现这样那样的错误,简单记录下碰到过的问题,方便备用。

1、启库先起监听,发现监听启动失败

wKioL1cLWkrxm0A2AACVRzzHmYU186.jpg


一般常见是/etc/hosts里面配置的主机名称对应IP和你的实际IP不符,改了就OK了。
还要检查HOSTNAME和/etc/sysconfig/network里的主机名,都改一致保险。
对应的还可检查下:
listener和tnsnames里面的HOST名或IP,保持一致。
有时只有把listener和tnsnames里面的HOST配成主机名,且hosts文件里的主机名对应IP正确才会启动正常。

2、手动修改SPFILE文件报错

手动用VI命令修改oracle里面的SPFILE***.ORA文件,数据库就起不来了,报错ORA-27046: file size is not a multiple of logical block size 。
原因是动态服务器参数文件(SPFILE)是一个二进制文件,是不可以手工修改的,如果手工改了,该文件就成为了无效文件。
可以通过以下方法解决:
1、将SPFILE中的参数拷贝到init***.ora文件中
 strings spfileCP05PV1DB.ora
 查看到后拷贝到init***.ora中
 (控制文件也可strings)
2、删除DATABASE目录下的SPFILE***.ORA文件。
3、启动数据库 (现在应该可以成功启动)
4、SQL> create spfile from pfile 生成spfile(pfile文件可自己编写)
使用startup命令启动数据库,,Oralce将会按照以下顺序在缺省目录中(9i,10i在oracle_home/database目录下)搜索参数文件:(1)spfile***.ora文件 (2)如果没有spfile***.ora文件就用spfile.ora文件(3) 如果没有spfile.ora文件就用init***.ora(4)如果没有init***.ora文件就用 pfile.ora
所以上面我们采取的解决方法是将破坏的spfile中的参数复制到init***.ora中,然后删除spfile文件,这样启动时就会用init***.ora文件启动,然后用create spfile from pfile 命令生成spfile
注意如果要修改spfile中的参数,绝对不能手工修改spfile文件,要使用下面命令:alter system set parameter=Value scope=spfile|both|memory 例如:alter system set db_cache_size=24M scope=both;来修改

3、路径和名字问题
SQL> startup
ORA-48108: invalid value given for the diagnostic_dest init.ora parameter
ORA-48140: the specified ADR Base directory does not exist [/home/oracle/102/dbs/<ORACLE_BASE>]
ORA-48187: specified directory does not exist
Linux Error: 2: No such file or directory
Additional information: 1
SQL>

查看$ORACLE_HOME/dbs下的init文件(我的SID名为oracleprod),即initoracleprod.ora,发现该文件中的<ORACLE_BASE>没有更改过来,当然启动不了了,修改本文件里的所有<ORACLE_BASE>为绝对路径。
结合网上其他技术大拿的经验,并删除diagnostic_dest这行记录。
然后再启动数据库
SQL> startup nomount
SQL> alert database mount
此时出错,ORA-00205: error in identifying control file, check alert log for more info
还是查看$ORACLE_HOME/dbs/initoracleprod.ora中的内容,发现control_files = (ora_control1, ora_control2)有问题,修改为control_files = ("/u01/oradata/orcl/control01.ctl", "/u01/flash_recovery_area/orcl/control02.ctl")
注:上面的control_files以机器上实际路径为准。
然后再启动Oracle,即可以了。
第二,在上面的过程中,还可能会碰到如ORA-09925: Unable to create audit trail file这样的问题,均于<ORACLE_BASE>有关,修改之即可。
另外,在解决上述问题过程中,还出现了像如下一样的错误:
SQL> conn sys
SQL> show parameter 
SP2-0640: Not connected
SQL> conn / as sysdba
ERROR:
ORA-09925: Message 9925 not found;  product=RDBMS; facility=ORA
Linux-x86_64 Error: 30: Read-only file system
Additional information: 9925
ORA-01075: you are currently logged on
SQL> 
如果出现上面的问题,无法手动停止Oracle,于是找到pmon进程,然后再kill之,即可关停Oracle.

4、pfile与spfile启动问题
在一个节点启动数据库:
SQL>startup;
ORA-01506: missing or illegal database name
因前面是从PFILE启动,再生成SPFILE的,可能是生成文件出错。
[root@rac2 dbs]# strings spfileracdb2.ora
*.SPFILE='+DATA/racdb/spfileracdb.ora'

拷贝RAC1节点的spfileracdb1.ora 为spfileracdb2.ora

问题解决。
还有一个现象就是路径错也会导致这个错误。
比如/u01/app/oracle/admin/CP05PV1DB改错了/u01/app/oracle/admin/CP05MV1DB,导致无法识别数据库名


5、SPFILE的错误
SQL> startup mount
ORA-01078: failure in processing system parameters
ORA-01565: error in identifying file 'E:\oracle\product\10.2.0\db_1/dbs/spfileocl.ora'
ORA-27046: file size is not a multiple of logical block size
OSD-04012: ??????????????
O/S-Error: (OS 3516) ?????????????? Windows ??????????
尝试将SPFILEORCL.ORA的备份文件改名,启动数据库还是报同样的错误,而不是以前的错误,有些不知所措 幸好是自己的本机 实在不行就重装了,于是开始在google上继续找答案。找了一会就找了的方法 真的要感谢互联网。真是一个好东西。解决方法如下:
C:\Documents and Settings\Administrator>sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 2月 18 23:42:25 2016
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
SQL> connect /as sysdba
已连接到空闲例程。
SQL> create spfile='E:\oracle\product\10.2.0\db_1\dbs\SPFILEORCL.ORA' from pfil
='E:\oracle\product\10.2.0\admin\orcl\pfile\init.ora.132009183928';
文件已创建。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area  167772160 bytes
Fixed Size                  1247900 bytes
Variable Size              62915940 bytes
Database Buffers          100663296 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
数据库已经打开。
SQL>
至此问题得到解决。

6、另一例spfile问题

SQL> create pfile from spfile;
create pfile from spfile*
ERROR at line 1:
ORA-01565: error in identifying file '?/dbs/spfile@.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 Area251658240 bytes
Fixed Size1218796 bytes
Variable Size83887892 bytes
Database Buffers163577856 bytes
Redo Buffers2973696 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 DATABASEMOUNT
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_
 
NAMETYPEVALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_timeinteger7
control_filesstring/u01/app/oracle/oradata/orcl/c
ontrol01.ctl, /u01/app/oracle/
oradata/orcl/control02.ctl, /u01/app/oracle/oradata/orcl/control03.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 Area251658240 bytes
Fixed Size1218796 bytes
Variable Size83887892 bytes
Database Buffers163577856 bytes
Redo Buffers2973696 bytes
Database mounted.
Database opened.
 
SQL> ho ls /u01/app/oracle/10g/dbs/
alert_orcl.logcore_5372init.orainitorcl.oraorapworcl
core_5360hc_orcl.datinitdw.oralkORCL
 
--从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.loghc_orcl.datinitorcl.oraspfileorcl.ora
core_5360init.oralkORCL
core_5372initdw.oraorapworcl
 
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
 
SQL> startup--从spfile 启动
ORACLE instance started.
 
Total System Global Area251658240 bytes
Fixed Size1218796 bytes
Variable Size83887892 bytes
Database Buffers163577856 bytes
Redo Buffers2973696 bytes
Database mounted.
Database opened.
 
实际上可以先create spfile from pfile = '<dir>', 再从spfile启动,使用alter system 修改相关的参数比直接修改pfile似乎
更简单些,比如上面的例子中需要去掉一个控制文件。当然此类问题是仁者见仁,智者见者。
总之一条,定期备份参数文件是相当有必要的!