热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

硬件维护的时候有人不小心把生产库的电源断掉了,重新启动盘柜和服务器后,oracle10g10.2.0.4startup时出现错误提示:代码如下

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

 代码如下
1 数据库装载完毕。
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: {=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: {=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: {=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: {=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文件,这样恢复完成后,以前如果有的备份可能就无法使用了.可能我认为是稍微复杂了,但是恢复数据库的目的都达到了。


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
author-avatar
想飞的糊涂虫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有