断电导致oracle的ORA-01207错误完全解决办法

硬件维护的时候有人不小心把生产库的电源断掉了,重新启动盘柜和服务器后,oracle 10g 10.2.0.4 startup时出现错误提示:

 代码如下 复制代码
数据库装载完毕。
ORA-01122: 数据库文件 1 验证失败
ORA-01110: 数据文件 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF'
ORA-01207: 文件比控制文件更新 - 旧的控制文件 (file is more recent than controlfile - old controlfile)

由于时间紧迫,且对此错误不甚熟悉,就先将生产库切到了dataguard物理备库,有时间再研究此问题如何恢复。

ORA-01207: old control file完全解决方案

这个错误是oracle db最常见的错误了,引起的原因很多,但是最主要的一个原因是数据库服务器突然掉电,然后重启启动数据库报错。

究其这个问题产生的原因,其实就是控制文件中记录的db信息太老,导致数据库在启动检测时出现不一致。

控制文件中记录了整个数据库的全部信息,具体包括数据文件的,日志文件等等。

那么为什么会出现控制文件记录的数据库信息太老呢,原因很简单:根据oracle db运行原理,数据库在运行期间,由于检查点发生等原因会不断的更新控制文件,同时数据库在关闭和重启过程中都会更新控制文件的内容,但是数据库服务器突然的掉电,会导致当前的db信息无法适时更新到控制文件中,再次启动数据库后,当oracle检测控制文件和其它文件信息是否一致时,就出现了这个错误。

 

那么解决这个问题的方法有两个:
IXDBA.NET社区论坛

 
方法1:

u        主导思想:创建控制文件,然后open数据库。

u        具体步骤:

1.startup mount
2.alter database backup controlfile to trace
3.create a control file creation script from the trace file,
and use the noresetlogs option
4.shutdown
5.startup nomount
Use the script generated by the 'backup controlfile to trace' command above
creaet the control file
6.recover database
7.alter database open

u        步骤演示:

[oracle@localhost orcl]$ sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Nov 19 15:26:07 2006

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

添加测试数据:

SQL> create table gaojf as select * from all_objects;

Table created.

SQL> insert into gaojf select * from gaojf;

49390 rows created.

SQL> /

98780 rows created.

…………………………………

1580480 rows created.

SQL> commit;

Commit complete.

SQL> shutdown abort   

ORACLE instance shut down.

SQL> quit

Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

 

模拟ORA-01207错误很简单,这里不再说明,然后接着如下:

[oracle@localhost orcl]$ sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Nov 19 15:26:47 2006

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup

ORACLE instance started.

Total System Global Area  167772160 bytes

Fixed Size                  1218316 bytes

Variable Size              71305460 bytes

Database Buffers           92274688 bytes

Redo Buffers                2973696 bytes

Database mounted.

ORA-01122: database file 1 failed verification check

ORA-01110: data file 1: '/free/oracle/oradata/orcl/system01.dbf'

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

出现了ORA-01207错误:

SQL> shutdown abort

ORACLE instance shut down.

SQL> quit

Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

首先删除old control file,其实也可以不删除,个人习惯,然后重建控制文件。

重建控制文件可以在数据库到mount状态下执行alter database backup controlfile to trace生成sql文件,具体操作很简单,不再描述。

www.ixdba.net

[oracle@localhost orcl]$ rm -rf control0*

[oracle@localhost orcl]$ vi create.sql

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 292

LOGFILE

  GROUP 1 '/free/oracle/oradata/orcl/redo01.log'  SIZE 50M,

  GROUP 2 '/free/oracle/oradata/orcl/redo02.log'  SIZE 50M,

  GROUP 3 '/free/oracle/oradata/orcl/redo03.log'  SIZE 50M

-- STANDBY LOGFILE

DATAFILE

  '/free/oracle/oradata/orcl/system01.dbf',

  '/free/oracle/oradata/orcl/undotbs01.dbf',

  '/free/oracle/oradata/orcl/sysaux01.dbf',

  '/free/oracle/oradata/orcl/users01.dbf',

  '/free/oracle/oradata/orcl/gaojfdb.dbf'

CHARACTER SET AL32UTF8

;

[oracle@localhost orcl]$ sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Nov 19 15:28:00 2006

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> @create

ORACLE instance started.

Total System Global Area  167772160 bytes

Fixed Size                  1218316 bytes

Variable Size              71305460 bytes

Database Buffers           92274688 bytes

Redo Buffers                2973696 bytes

 

Control file created.

SQL> alter database open;
IXDBA.NET社区论坛

alter database open

*

ERROR at line 1:

ORA-01113: file 1 needs media recovery

ORA-01110: data file 1: '/free/oracle/oradata/orcl/system01.dbf'

不能直接open,看来有需要恢复的,执行recover database;

SQL> recover database;

Media recovery complete.

看来是在读取redo file进行前滚,出现这个现象是由于在上面的操作中,我在添加测试数据完毕后,执行了commit命令,然后直接执行了shutdown abort的缘故,所以在重启以后数据库要前滚,从redo file中恢复数据。

一般数据库服务器在突然掉电后,也就是相当于执行了shutdown abort的操作。所以必须在创建控制文件后,执行recoverdatabase。

如果是正常关闭的数据库,可以直接open,无需recover。

此时后台进程执行前滚日志信息如下:

ALTER DATABASE RECOVER  database

Media Recovery Start

Sun Nov 19 15:28:23 2006

Recovery of Online Redo Log: Thread 1 Group 1 Seq 22 Reading mem 0

  Mem# 0 errs 0: /free/oracle/oradata/orcl/redo01.log

Sun Nov 19 15:28:29 2006

Recovery of Online Redo Log: Thread 1 Group 2 Seq 23 Reading mem 0

  Mem# 0 errs 0: /free/oracle/oradata/orcl/redo02.log

Sun Nov 19 15:28:38 2006

Recovery of Online Redo Log: Thread 1 Group 3 Seq 24 Reading mem 0

  Mem# 0 errs 0: /free/oracle/oradata/orcl/redo03.log

Sun Nov 19 15:28:40 2006

Media Recovery Complete (orcl)

Completed: ALTER DATABASE RECOVER  database

此时可以打开数据库

SQL> alter database open;

SQL> select count(*) from gaojf;

  COUNT(*)

----------

   3160960

 

SQL>

 
方法2:

模拟ORA-01207错误很简单,不再描述:

 

u        思路:用旧的控制文件恢复,最后用resetlogs打开数据库。

u        具体步骤:

1:startup mount;
2:recover database using backup controlfile until cancel;

然后根据情况,指定archive log和redo file。
3:alter database open resetlogs;

u        操作演示:

oracle@linux:/free/oracle/oradata/orcl> sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 11月 19 13:57:51 2006

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup

ORACLE instance started.

Total System Global Area  167772160 bytes

Fixed Size

1218316 bytes

Variable Size              88082676 bytes

Database Buffers           75497472 bytes

Redo Buffers                2973696 bytes

Database mounted.

ORA-01122: database file 1 failed verification check

ORA-01110: data file 1: '/free/oracle/oradata/orcl/system01.dbf'

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

执行恢复:

SQL> recover database using backup controlfile until cancel;

ORA-00279: change 891145 generated at 11/18/2006 06:02:11 needed for thread 1

ORA-00289: suggestion :

/free/oracle/flash_recovery_area/ORCL/archivelog/2006_11_19/o1_mf_1_47_%u_.arc
IXDBA.NET社区论坛

ORA-00280: change 891145 for thread 1 is in sequence #47

 

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

auto (由于o1_mf_1_47_%u_.arc这个归档日志,我这里有这个文件,所以指定auto,此时应用了一些归档日志)

ORA-00279: change 911145 generated at 11/19/2006 13:49:24 needed for thread 1

ORA-00289: suggestion :

/free/oracle/flash_recovery_area/ORCL/archivelog/2006_11_19/o1_mf_1_48_%u_.arc

ORA-00280: change 911145 for thread 1 is in sequence #48

ORA-00278: log file

'/free/oracle/flash_recovery_area/ORCL/archivelog/2006_11_19/o1_mf_1_47_2ozw355r

_.arc' no longer needed for this recovery

 

ORA-00279: change 911687 generated at 11/19/2006 13:54:36 needed for thread 1

ORA-00289: suggestion :

/free/oracle/flash_recovery_area/ORCL/archivelog/2006_11_19/o1_mf_1_49_%u_.arc

ORA-00280: change 911687 for thread 1 is in sequence #49

ORA-00278: log file

'/free/oracle/flash_recovery_area/ORCL/archivelog/2006_11_19/o1_mf_1_48_2ozwf289

_.arc' no longer needed for this recovery

ORA-00308: cannot open archived log

'/free/oracle/flash_recovery_area/ORCL/archivelog/2006_11_19/o1_mf_1_49_%u_.arc'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-01152: file 1 was not restored from a sufficiently old backup

ORA-01110: data file 1: '/free/oracle/oradata/orcl/system01.dbf'

这种恢复方式,不会自动去找联机redo文件,所以必须要手工指定!

SQL> recover database using backup controlfile until cancel;

ORA-00279: change 911687 generated at 11/19/2006 13:54:36 needed for thread 1

ORA-00289: suggestion :

/free/oracle/flash_recovery_area/ORCL/archivelog/2006_11_19/o1_mf_1_49_%u_.arc

ORA-00280: change 911687 for thread 1 is in sequence #49

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

/free/oracle/oradata/orcl/redo01.log

ORA-00310: archived log contains sequence 47; sequence 49 required

ORA-00334: archived log: '/free/oracle/oradata/orcl/redo01.log'

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-01152: file 1 was not restored from a sufficiently old backup

ORA-01110: data file 1: '/free/oracle/oradata/orcl/system01.dbf'

 

需要的不是这个redo文件,继续指定!

 

SQL> recover database using backup controlfile until cancel;

ORA-00279: change 911687 generated at 11/19/2006 13:54:36 needed for thread 1

ORA-00289: suggestion :

/free/oracle/flash_recovery_area/ORCL/archivelog/2006_11_19/o1_mf_1_49_%u_.arc

ORA-00280: change 911687 for thread 1 is in sequence #49

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

/free/oracle/oradata/orcl/redo02.log

ORA-00310: archived log contains sequence 48; sequence 49 required
IXDBA.NET技术社区

ORA-00334: archived log: '/free/oracle/oradata/orcl/redo02.log'

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-01152: file 1 was not restored from a sufficiently old backup

ORA-01110: data file 1: '/free/oracle/oradata/orcl/system01.dbf'

仍然不是,继续指定!

SQL> recover database using backup controlfile until cancel;

ORA-00279: change 911687 generated at 11/19/2006 13:54:36 needed for thread 1

ORA-00289: suggestion :

/free/oracle/flash_recovery_area/ORCL/archivelog/2006_11_19/o1_mf_1_49_%u_.arc

ORA-00280: change 911687 for thread 1 is in sequence #49

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

/free/oracle/oradata/orcl/redo03.log

Log applied.

Media recovery complete.

SQL> alter database open resetlogs;

Database altered.

SQL> select count(*) from gaojf;

  COUNT(*)

----------

    791392

SQL>

完成恢复,数据没有丢失,但是redo file被重置,建议马上备份数据库一次。

 

通过以上两个方法,都可以完成恢复。

但是方法1中重建控制文件这个方法可能会简单一些,并且最后可以直接open,这样以前的备份也可以使用。建议使用这个方法。

方法2中,由于在recover中,还要一个一个的指定redo文件去试,最后resetlogs数据库,重置了redo文件,这样恢复完成后,以前如果有的备份可能就无法使用了.可能我认为是稍微复杂了,但是恢复数据库的目的都达到了。

时间: 2024-11-08 21:16:19

断电导致oracle的ORA-01207错误完全解决办法的相关文章

Oracle数据库ORA 54013错误的解决办法_oracle

ORA-54013: 不允许对虚拟列执行 INSERT 操作 这是Oracle 11 的新特性 -- 虚拟列. 在以前的Oracle 版本,当我们需要使用表达式或者一些计算公式时,我们会创建数据库视图,如果我们需要在这个视图上使用索引,我们会创建基于函数的索引.现在Oracle 11允许我们直接在表上使用虚拟列来存储表达式.虚拟列的值是不存储在磁盘的,它们是在查询时根据定义的表达式临时计算的.我们不能往虚拟列中插入数据,我们也不能隐式的添加数据到虚拟列,我们只能使用物理列来插入数据.然后可以查询

Oracle数据库TNS常见错误的解决办法

  1.ORA-12541:TNS:没有监听器 原因:没有启动监听器或者监听器损坏.若是前者,使用命令net start OracleOraHome10gTNSListener(名字可能有出入)即可;如果是后者,则使用"Net Configuration Assistant"工具向导之"监听程序配置"增加一个监听器即可(基本不用写任何信息,一路OK.在添加之前可能需要把所有的监听器先删!) 2.ORA-12500:TNS:监听程序无法启动专用服务器进程或ORA-12

Oracle数据库启动ORA-08103错误提示解决办法

数据库在open过程报ORA-08103错误导致数据库无法正确启动  代码如下 复制代码 Fri Jul 18 22:02:51 2014 SMON: enabling tx recovery Fri Jul 18 22:02:51 2014 Errors in file d:\oracle\product\10.2.0\admin\kemu3\udump\kemu3_ora_29788.trc: ORA-00604: ?? SQL ?? 1 ???? ORA-08103: ??????   F

Oracle的常见错误及解决办法

                      ORA-12528: TNS:listener: all appropriate instances are blocking new connections     ORA-12528问题是因为监听中的服务使用了动态服务,实例虽然启动,但没有注册到监听.实例是通过PMON进程注册到监听上的,而PMON进程需要在MOUNT状态下才会启动.所以造成了上面的错误. 解决这个问题,有三种方法:1.把监听设置为静态:2.在tnsnames.ora中追加(UR=

Oracle数据库TNS常见错误的解决方法汇总_oracle

TNS是Oracle Net的一部分,是专门用来管理和配置Oracle数据库和客户端连接的一个工具,在大多数情况下客户端和数据库要通讯,就必须配置TNS.本文主要讲述了Oracle数据库TNS常见错误的解决方法如下: 1.ORA-12541:TNS:没有监听器 原因:没有启动监听器或者监听器损坏.若是前者,使用命令net start OracleOraHome10gTNSListener(名字可能有出入)即可;如果是后者,则使用"Net Configuration Assistant"

Oracle客户端工具出现“Cannot access NLS data files or invalid environment specified”错误的解决办法

Oracle客户端工具出现"Cannot access NLS data files or invalid environment specified"错误的解决办法 方法一:参考,http://blog.csdn.net/longyuhome/article/details/7977433 方法二:此外也可以在环境变量(我的电脑-->右键属性-->高级系统设置-->环境变量-->系统变量)中添加NLS_LANG=SIMPLIFIED CHINESE_CHINA

ORA-01034错误的解决办法

错误|解决 ORA-01034错误的解决办法 --Oracle常见错误之一 事先说明,Oracle高手是不需要看本文的. 这是个Oracle数据库服务器比较常见的错误.有经验的用户几乎马上就能解决这个错误,再不济也能马上到Metalink(http://metalink.oracle.com)去搜索一下. 不幸的是,大多的时候,都是初级用户遇到的这样的问题(对他们提Metalink也起不到什么作用--一般都没有上面的帐号:)).所以,这个小帖子可能还有一定的作用. 问题描述======= 在试图

mysql Too many connections错误的解决办法

产生这种问题的原因是: 连接数超过了 MySQL 设置的值,与 max_connections 和 wait_timeout  都有关系.wait_timeout 的值越大,连接的空闲等待就越长,这样就会造成当前连接数越大. 解决方法: 修改MySQL配置文件/etc/my.cnf,设置成max_connections=1000,wait_timeout=5.如果没有此项设置可以自行添加,修改后重启MySQL服务即可.要不经常性报此错误,则要对服务器作整体性能优化 补充: 在工作中,大家或许常常

win8系统应用商店下载安装程序提示错误0x80200024解决办法

win8系统应用商店下载安装程序提示错误0x80200024解决办法   无法安装应用错误代码:0x80200024指的是服务器出现问题,错误代码:0x80080206指的是所下载的应用安装包已经损坏.如果是安装包被损坏主要是在下载应用时网络出现断开或无信号等等,导致下载的应用程序数据不完整 ,因此应用程序无法进行安装. 解决方法: 1.我们可以下载微软所提供的应用的疑难解答工具,点击下载>>微软疑难解答工具,在打开后可以对系统进行检测,打开后如下图,选择Windows商店应用并按下一步来进行

Win7 IIS7.5运行ASP时出现500错误的解决办法_win服务器

http 500内部服务器错误说明IIS服务器无法解析ASP代码,如果你联网还发现找不到服务器就是500错误了. 在iis7里面的iis设置要开启启用父路径这个选项,之后就可以了,当然为了调试程序可以打开"ASP设置选项-调试属性"里面的一些调试功能,方便程序的调试. Win7 IIS7.5运行ASP时出现500错误的解决办法 请确保在你的电脑上IIS配置完成了,静态页面能打开了,但是打开ASP就会出现500错误.再进行下面配置.具体如下: 一.进入"C:\Windows\S