ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

时间:2024-04-05 15:18:33

问题:

        访问项目时发现不能正常访问,所以查看WebLogic后台日志,发现是线程阻塞导致,所以重启WebLogic服务器。

        重启服务器的时候,发现项目不能正常访问DATABASE数据库,于是尝试重启Oracle监听与服务。

             lsnrctl  start:启动Oracle监听

             lsnrctl  status:查看监听运行状况

             sqlplus  /nolog:使用sqlplus

             conn  /as sysdba:使用dba登陆

             startup:启动Oracle数据库服务

             但是启动报错,后自行使用PLSQL登陆数据库,发现登陆异常:ORA-01033。这个错误大致意思是说数据库中有某个文件是必须的,但是并不存在,导致报错。

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

所以尝试以下方法:

1、sqlplus  /nolog

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

2、connect sys/change_on_install as sysdba

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

3、shutdown normal

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

这里提示数据库没有启动,本身就是关闭状态

4、startup mount

        因为我们只是缺失在线重做日志,所以数据库是可以启动到mount状态的,mount状态的数据库只会打开控制文件,并不会去校验每个数据文件的状态,校验动作会在open阶段进行。

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

5、alter database open

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

注意有分号,执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

这里报错,保存信息ORA-00313,ORA-00312。

这个错误是说:日志组1的数据文件损坏或丢失了。那我们用CLEAR命令恢复就好了。

说明

       1)、如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就需要强行clear.

  2)、建议clear,特别是强行clear后作一次数据库的全备份。

  3)、此方法适用于归档与非归档数据库。

  损坏当前联机日志:

  归档模式下当前日志的损坏有两种情况,

  一、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损坏就可以直接用

                alter database clear unarchived  logfile group n来重建。

  二、是日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法

  A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份

  B. 通过强制性恢复,但是可能导致数据库不一致。

 

下面会介绍这两种情况。

从报警文件可以看到更详细的信息。

select group#, sequence#, archived, status from v$log;

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

可以看到,group1是CURRENT状态,并且ARCHIV是NO。

当该组是非当前状态,而且已经归档时,使用:

alter database clear logfile group 1

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

当该日志组还没有归档,则需要用:

alter database clear unarchived logfile group 1

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

我们这里应当使用第二个语句,执行后可以发现报错:ORA-01624、ORA-00312。

这个报错是说:实例ORCL崩溃恢复所需的日志1(线程1)。

那我们接下来就尝试恢复这个文件。可以采用获取最近的SCN的办法用until scn恢复或用until cnacel恢复。

1、recover database until cancel(先执行AUTO)

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

2、recover database until cancel(再次执行CANCEL)

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

可以看到两次执行都是有错误的。

3、直接OPEN不行,那就尝试利用alter database open resetlogs打开数据库

        resetlogs打开数据库必须在数据库不完全恢复之后才可以用,而且在不完全恢复后必须使用 RESETLOGS 或 NORESETLOGS 选项。

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行依旧报错。

  

我们的数据库日志没有备份,所以以上操作均出错!!!!!!!!!!

说明:

  1、这种办法恢复的数据库是一致的不完全恢复,会丢失当前联机日志中的事务数据

  2、这种方法适合于归档数据库并且有可用的数据库全备份。

  3、恢复成功之后,记得再做一次数据库的全备份。

  4、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

 

 

接下来,使用强制性恢复,即通过应用隐含参数,通过隐含参数使状态不一致的数据库打开。

1、alter database clear unarchived logfile group 1

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

这一步以及之前的操作都一样,到这里发现同样是报错。所以需要shutdown数据库。

2、shutdown immediate

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

3、接下来是重要的一步!

操作前先解释下:

3.1 pfile和spfile

Oracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件。它们是在数据库实例启动时候加载的,决定了数据库的物理 结构、内存、数据库的限制及系统大量的默认值、数据库的各种物理属性、指定数据库控制文件名和路径等信息,是进行数据库设计和性能调优的重要文件。可以分为两种类型:

pfile: 初始化参数文件(Initialization Parameters Files),Oracle 9i之前,ORACLE一直采用pfile方式存储初始化参数,pfile 默认的名称为“init+例程名.ora”文件路径:/data/app/oracle/product/12.1.0/dbhome_1/dbs,这是一个文本文件,可以用任何文本编辑工具打开。

spfile:服务器参数文件(Server Parameter Files),从Oracle 9i开始,Oracle引入了Spfile文件,spfile 默认的名称为“spfile+例程名.ora”文件路径:/data/app/oracle/product/12.1.0/dbhome_1/dbs 以二进制文本形式存在,不能用vi编辑器对其中参数进行修改,只能通过SQL命令在线修改。

3.2  spfile的好处

1、spfile改正了pfile管理混乱的问题,在多结点的环境里,pfile会有多个image,启动时候需要跟踪最新的image。这是个烦琐的过程。用spfile以后,所有参数改变都写到spfile里面(只要定义scope=spfile或both),参数配置有个权威的来源。

2、9i以前一般都是要备份pfile后再来做参数的修改,而且pfile的修改必须重启实例才能生效。非常的不方便;在9i以后的spfile就可以同通过命令修改指定的参数了,且有很多参数都不用重启数据库,能够在线生效,这个在线生效的参数会随着数据库的版本增高而增加。如果参数修改有问题数据库起不来了可以在 nomount状态下创建成pfile再修改回来即可。)

3.3 查看文件位置

SELECT NAME, VALUE, DISPLAY_VALUE FROM V$PARAMETER WHERE NAME ='spfile';

 

了解了这个文件之后,我们就要修改这个文件的内容。我们自己新创建一个pfile文件:

create spfile from pfile;

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

最好带上目录:

create pfile='/app/oracle/product/11.2.0/db_1/dbs/pfile2.ora' from spfile; 

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

4、向文件中插入配置

*._allow_resetlogs_corruption=TRUE

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

或者直接vim手动添加:*._allow_resetlogs_corruption=TRUE

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

5、关闭Oracle并启动

关闭:shutdown / shutdown immediate

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

启动:startup mount pfile='/xx/oracle/product/11.2.0/db_1/dbs/pfile2.ora'

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

注意,这里是使用的新创建的pfile文件。

执行结果:

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

数据库装载完毕后,通过 resetlogs的方法打开数据库。

alter database open resetlogs;

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

6、重启。

因为我们是用我们临时生成的pfile进行启动的,所以还要重启数据库和监听服务,

如果启动报错,或有其他问题,建议退出重新登录

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

ORA-01033、ORA-00313、ORA-01624等启动Oracle数据库报错

这里为止,发现启动不报错了。

OVER。