意外断电开库触发ORA-01207

来源:互联网 发布:七雄战记更新网络错误 编辑:程序博客网 时间:2024/05/21 08:00

故障描述

数据库服务器异常断电,启动数据库报错:

报错解析

ORA-01122:database filestring failed verification check

Cause: The information in this file is inconsistent withinformation from the control file. See accompanying message for reason.

Action: Make certain that the db files and control files are thecorrect files for this database.

以上报错描述的是存在的问题引发的报错,不用考虑,下面的ora-01207是问题所在。

 ORA-01207: fileis more recent than control file - old control file

Cause:The control filechange sequence number in the data file is greater than the number in thecontrol file.

This impliesthat the wrong control file is being used. Note that repeatedly causing thiserror can make it stop happening without correcting the real problem.

Everyattempt to open the database will advance the control file change sequencenumber until it is great enough.

Action: Use the current control file or do backup control filerecovery to make the control file current. Be sure to follow all restrictionson doing a backup control file recovery.

 

意思是说,控制文件中记录的在数据文件中的更改序列号大于控制文件本身的更改序列号。

解决方案

重建控制文件恢复

 

SQL>startup mount;

SQL>!date      #记录该时间

SQL>alter database backup controlfile totrace;

SQL>show parameter user_dump

SQL>archive log list ;   #显示没开归档

在显示出的目录找到备份控制文件时间点的*.trc文件,在该trc文件中找到创建controlfile的脚本。

CREATE CONTROLFILE REUSE DATABASE "XSZC" NORESETLOGS NOARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 800

    MAXINSTANCES 8

    MAXLOGHISTORY 83880

LOGFILE

  GROUP 1'/oracle/app/oradata/xszc/redo01.log' SIZE 50M,

  GROUP 2'/oracle/app/oradata/xszc/redo02.log' SIZE 50M,

  GROUP 3'/oracle/app/oradata/xszc/redo03.log' SIZE 50M

-- STANDBY LOGFILE

DATAFILE

 '/oracle/app/oradata/xszc/system01.dbf',

 '/oracle/app/oradata/xszc/undotbs01.dbf',

 '/oracle/app/oradata/xszc/sysaux01.dbf',

 '/oracle/app/oradata/xszc/users01.dbf',

………

CHARACTER SET ZHS16GBK

;

SQL>startup nomount;

SQL>@createCtl.sql        #执行控制文件创建脚本。

之后,按着给出的以下提示操作:

RECOVER DATABASE;

ALTER DATABASE OPEN;

ALTER TABLESPACE TEMP ADD TEMPFILE'/oracle/app/oradata/xszc/temp01.dbf' REUSE;

操作:

SQL> alter database open ;

alter database open

*

ERROR at line 1:

ORA-01113: file 1 needs media recovery

ORA-01110: data file 1: '/oracle/app/oradata/xszc/system01.dbf'

SQL> recover database;

Media recovery complete.

SQL> alter database open;

Database altered.

 

至此,当再次查看数据库时,发现数据库已经关闭。查看告警日志:出现ORA-00600报错。

修正ORA-01207,引发ORA-00600+[4194]

做完控制文件的恢复之后,发现开库之后,数据库立即自动关闭,查看alert告警日志,发现如下报错信息:

ORA-12012: error on auto execute of job 42568

ORA-00607: Internal error occurred while making a change to adata block

ORA-00607: Internal error occurred while making a change to adata block

Tue Oct 18 11:31:00 2016

Errors in file /oracle/app/admin/xszc/bdump/xszc_j003_6783.trc:

ORA-00600: internal error code, arguments: [4194], [58], [11], [], [], [], [], []

故障解析

遇到ora-00600报错,比如: ORA-00600:internal error code, arguments: [4194],当 alertlog里出现 ORA-600 + [4194] 时,基本就可以断定,是 undo 表空间出现了损坏。 对于 Undo 损坏的情况,能用备份恢复最好,如果不能,就只能通过一些特殊的方法来恢复。出现 undo 损坏的情况, 大多数是因为异常宕机,在启动的时候报的错误。 DB 不能启动。

重建undo表空间

当UNDO表空间出现损坏时,可以先用 systemsegment 启动 DB, 启动之后,再重新创建 UNDO 表空间,之后再使用UNDO表空间来启动。 步骤如下:

 

(1)用 spfile 创建 pfile,然后修改参数:

         SQL>create pfile from spfile;

(2)编辑initSID.ora文件,将有关UNDO参数信息注释增加标红两行,使用手工管理undo段,回滚段使用system segment:

         #*.undo_tablespace='UNDOTBS1'

         #*.undo_management='AUTO' 

         #*.undo_retention=1800
         undo_management='MANUAL'
         rollback_segments='SYSTEM'

( 2)用修改之后的pfile,重启 DB

         SQL>STARTUP MOUNT pfile='$ORACLE_HOME/dbs/initSID.ora' ;
( 3)删除原来的表空间,创建新的 UNDO 表空间

         SQL>alter database open;

SQL> drop tablespace undotbs01;

        #du –sh /data/oradata/undotbs01.dbf     #显示为826M

SQL> create undo tablespace undotbs1 datafile '/data/oradata/undotbs1.dbf'size 900M;
( 4)关闭数据库,修改pfile 参数,然后用新的 pfile 创建 spfile,在正常启动数据库。

          SQL>shutdown immediate;

           $vi $ORACLE_HOME/dbs/initSID.ora

            *.undo_tablespace='UNDOTBS1'

            *.undo_management='AUTO'

            *.undo_retention=1800

            #undo_management='MANUAL'

            #rollback_segments='SYSTEM'

           SQL>create spfile from pfile;

           SQL>startup

记得添加好临时数据文件:

           SQL>ALTER TABLESPACE TEMP ADD TEMPFILE'/oracle/app/oradata/xszc/temp01.dbf' REUSE;

至此数据库恢复完毕。

总结:

本次故障是由于异外断电,导致数据库中数据文件头记录的信息与控制文件记录的相关信息不匹配,也就是说,我们需要做实例恢复的那部分数据,

在意外断电的瞬间,并没有写到相关的文件中,而是在内存中被丢失了。

这样的话,我们需要将控制文件恢复到与数据文件一致的状态。可以使用控制文件的备份来做恢复(足够新),也可以重建控制文件。

当我们恢复完控制文件,能够正常开库了,发现undo出现问题;那说明数据库中有一部分undo信息也被丢失,那只能通过重建undo来解决问题。


0 0
原创粉丝点击