千家信息网

Oracle在线 redo log文件丢失后的恢复

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,今天一个开发库启动不了了,发过来报错一看是日志文件损坏了(见下图),接着说了一下前因后果。说是年前服务器掉电了,然后就再没有启动起来过。今天有人用才想到要处理。先说一下大体的思路,如果损坏的redo
千家信息网最后更新 2026年11月02日Oracle在线 redo log文件丢失后的恢复

今天一个开发库启动不了了,发过来报错一看是日志文件损坏了(见下图),接着说了一下前因后果。说是年前服务器掉电了,然后就再没有启动起来过。今天有人用才想到要处理。

先说一下大体的思路,如果损坏的redo log是INACTIVE状态的,也就是实例崩溃恢复用不到的redo log,那处理起来比较容易,直接alter database clear logfile group #;或alter database clear unarchived logfile group #;重建日志组就行了。建议重建日志文件级后对数据库做一个全库备份,特别是强制clear后,造成的归档日志文件断层。在如果损坏的redo log是ACTIVE或CURRENT状态的,也就是实例崩溃恢复需要用到的redo log,那处理起来就比较麻烦了,损坏这种redo log就意味着丢失数据。

redo log的三种状态:

  • INACTIVE:日志对应的修改已经被写入硬盘

  • ACTIVE:日志对应的修改还没有被写入硬盘

  • CURRENT:实例正在使用的日志文件

由于这个开发库有种种的问题,恢复起来遇到了各种情况,这里用一个虚拟机上的数据库演示如果CURRENT或ACTIVE状态的日志文件损坏的情况下如何恢复。

1、构造场景

删除一张表的数据但不提交,然后在另一个会话中把数据库shutdown abort。再删除所有的redo log文件。

#session 1sys@ORCL>delete from zx;2858 rows deleted.#session 2sys@ORCL>select group#,status from v$log;    GROUP# STATUS---------- ------------------------------------------------         1 INACTIVE         2 ACTIVE         3 CURRENTsys@ORCL>shutdown abort;ORACLE instance shut down.#删除redo log文件[oracle@rhel6 ~]$ cd /u02/app/oracle/oradata/orcl/[oracle@rhel6 orcl]$ ls -l  total 1944992-rw-r----- 1 oracle oinstall   9748480 Feb 24 23:56 control01.ctl-rw-r----- 1 oracle oinstall   9748480 Feb 24 23:56 control02.ctl-rw-r----- 1 oracle oinstall 328343552 Feb 24 23:54 example01.dbf-rw-r----- 1 oracle oinstall  52429312 Feb 24 23:54 redo01.log-rw-r----- 1 oracle oinstall  52429312 Feb 24 23:55 redo02.log-rw-r----- 1 oracle oinstall  52429312 Feb 24 23:55 redo03.log-rw-r----- 1 oracle oinstall 545267712 Feb 24 23:54 sysaux01.dbf-rw-r----- 1 oracle oinstall 796925952 Feb 24 23:54 system01.dbf-rw-r----- 1 oracle oinstall  30416896 Feb 24 13:58 temp01.dbf-rw-r----- 1 oracle oinstall 110108672 Feb 24 23:54 undotbs01.dbf-rw-r----- 1 oracle oinstall   5251072 Feb 24 23:54 users01.dbf[oracle@rhel6 orcl]$ rm redo*logl[oracle@rhel6 orcl]$ ls -ltotal 1791212-rw-r----- 1 oracle oinstall   9748480 Feb 24 23:56 control01.ctl-rw-r----- 1 oracle oinstall   9748480 Feb 24 23:56 control02.ctl-rw-r----- 1 oracle oinstall 328343552 Feb 24 23:54 example01.dbf-rw-r----- 1 oracle oinstall 545267712 Feb 24 23:54 sysaux01.dbf-rw-r----- 1 oracle oinstall 796925952 Feb 24 23:54 system01.dbf-rw-r----- 1 oracle oinstall  30416896 Feb 24 13:58 temp01.dbf-rw-r----- 1 oracle oinstall 110108672 Feb 24 23:54 undotbs01.dbf-rw-r----- 1 oracle oinstall   5251072 Feb 24 23:54 users01.dbf

2、启动数据库出现报错

idle>startup ORACLE instance started.Total System Global Area 1603411968 bytesFixed Size             2253664 bytesVariable Size               1476398240 bytesDatabase Buffers     117440512 bytesRedo Buffers                   7319552 bytesDatabase mounted.ORA-00313: open failed for members of log group 2 of thread 1ORA-00312: online log 2 thread 1: '/u02/app/oracle/oradata/orcl/redo02.log'ORA-27037: unable to obtain file statusLinux-x86_64 Error: 2: No such file or directoryAdditional information: 3

3、尝试使用clear方式重建日志组出现报错

idle>alter database clear logfile group 2;alter database clear logfile group 2*ERROR at line 1:ORA-01624: log 2 needed for crash recovery of instance orcl (thread 1)ORA-00312: online log 2 thread 1: '/u02/app/oracle/oradata/orcl/redo02.log'idle>alter database clear unarchived logfile group 2;alter database clear unarchived logfile group 2*ERROR at line 1:ORA-01624: log 2 needed for crash recovery of instance orcl (thread 1)ORA-00312: online log 2 thread 1: '/u02/app/oracle/oradata/orcl/redo02.log'

从报错信息中可以看出log 2是实例崩溃恢复所需要的日志文件,不能直接重建。

4、这种情况下使用隐含参数_allow_resetlogs_corruption,创建pfile,把*._allow_resetlogs_corruption=TRUE加入到pfile中。然后mount数据库,强制不完全恢复,再open resetlogs

idle>create pfile='/home/oracle/initorcl.ora' from spfile;File created.[oracle@rhel6 orcl]$ vi /home/oracle/initorcl.ora idle>shutdown immediate;ORA-01109: database not openDatabase dismounted.ORACLE instance shut down.idle>startup pfile='/home/oracle/initorcl.ora' mount;ORACLE instance started.Total System Global Area 1603411968 bytesFixed Size             2253664 bytesVariable Size               1476398240 bytesDatabase Buffers     117440512 bytesRedo Buffers                   7319552 bytesDatabase mounted.idle>show parameter _allow_NAME                                 TYPE                             VALUE------------------------------------ --------------------------------- ------------------------------_allow_resetlogs_corruption          boolean                          TRUEidle>recover database until cancel;ORA-00279: change 1023441 generated at 02/24/2017 23:54:54 needed for thread 1ORA-00289: suggestion : /u02/app/oracle/product/11.2.4/db1/dbs/arch2_2_936817668.dbfORA-00280: change 1023441 for thread 1 is in sequence #2Specify log: {=suggested | filename | AUTO | CANCEL}cancelORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error belowORA-01194: file 1 needs more recovery to be consistentORA-01110: data file 1: '/u02/app/oracle/oradata/orcl/system01.dbf'ORA-01112: media recovery not startedidle>alter database open resetlogs;Database altered.idle>select open_mode from v$database;OPEN_MODE------------------------------------------------------------READ WRITE

可以看到现在数据库已经被open了。

5、再次查看第一步中被删除的数据的表,数据仍然存在说明丢失CURRENT或ACTIVE状态的日志文件会导致数据丢失。

idle>select count(*) from zx;  COUNT(*)----------      2858

以上是在虚拟机上做测试的恢复过程,但是对于前面说到的开发库的恢复就没有这个过程简单了。可以说是解决了一个报错又出来新的报错。

在使用_allow_resetlogs_corruption参数执行不完全恢复,open resetlogs 时,遇到了ORA-01248

SQL> alter database open resetlogs;alter database open resetlogs*ERROR at line 1:ORA-01248: file 5 was created in the future of incomplete recovery

于是先把这个文件offline drop

SQL> alter database datafile 5 offline drop;

再次open resetlogs时又遇到了ORA-00704和ORA-01555

SQL> alter database open resetlogs;alter database open resetlogs*ERROR at line 1:ORA-01092: ORACLE instance terminated. Disconnection forcedORA-00704: bootstrap process failureORA-00704: bootstrap process failureORA-00604: error occurred at recursive SQL level 1ORA-01555: snapshot too old: rollback segment number 5 with name"_SYSSMU5_4116806824$" too smallProcess ID: 3396Session ID: 573 Serial number: 51

由于现在的水平有限,在网上查资料也没有能解决这一系列的问题,最后没办法只能重建库,重新导数据了。

如果哪位遇到了类似的问题,而且解决了,也请分享一下经验。

其实上午在模拟这个问题的时候,在open resetlogs时还遇到了一个经典的报错ORA-600 [2662],这个错误可以参考eygle的博客http://www.eygle.com/archives/2005/12/oracle_diagnostics_howto_deal_2662_error.html

参考:http://iquicksandi.blog.163.com/blog/static/13228526220107642655204/

http://www.linuxidc.com/Linux/2012-02/53426.htm

http://www.killdb.com/2014/06/19/%E6%95%B0%E6%8D%AE%E5%BA%93open%E6%8A%A5%E9%94%99ora-01555-snapshot-too-old.html

http://www.askmaclean.com/archives/%E3%80%90oracle%E6%81%A2%E5%A4%8D%E3%80%91ora-704.html

数据 日志 文件 数据库 状态 实例 问题 情况 处理 开发 也就是 再次 参数 硬盘 说是 过程 参考 强制 前因后果 下图 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 喔噻互联网科技有限公司 河南真二互联网科技有限公司 互联网科技论坛 美国互联网前沿科技 济南和联互联网科技有限公司 互联网科技产品 金融科技与互联网金融相同和不同 重庆互联网医院沙龙医盟信息科技 荆州市昕露互联网络科技有限公司 互联网科技革命什么开始 消费医药和互联网科技 天津腾达互联网科技有限公司 互联网科技和法律行业 科技互联网海报 上海钢联属于互联网科技股吗 广东鹅鹅鹅互联网科技有限公司 世界互联网科技成果奖 银川新华互联网科技学校原画 悟空问答互联网科技 互联网科技自媒体灵感 腾讯阿里互联网科技 镁科技互联网资讯平台 中正互联网科技招聘 东莞新华互联网科技学校 北京市互联网新科技 宇信科技在杭州互联网排第几 江苏互联网智能科技产品出厂价 广西科技产业互联网是什么 上海万顺科技互联网有限公司招聘 每日互联网科技新闻
0