当前位置: 首页 > news >正文

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

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

wKiom1iwUvihDrlHAAOLpRmbTUI019.jpg-wh_50

先说一下大体的思路,如果损坏的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文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#session 1
sys@ORCL> delete  from  zx;
 
2858  rows  deleted.
#session 2
sys@ORCL> select  group #,status  from  v$log;
 
     GROUP # STATUS
---------- ------------------------------------------------
      1 INACTIVE
      2 ACTIVE
      CURRENT
 
sys@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*log
l[oracle@rhel6 orcl]$ ls -l
total 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、启动数据库出现报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
idle>startup 
ORACLE instance started.
 
Total System Global Area 1603411968 bytes
Fixed Size         2253664 bytes
Variable Size       1476398240 bytes
Database Buffers     117440512 bytes
Redo Buffers           7319552 bytes
Database mounted.
ORA-00313:  open  failed  for  members of log group 2 of thread 1
ORA-00312: online log 2 thread 1:  '/u02/app/oracle/oradata/orcl/redo02.log'
ORA-27037: unable to obtain  file  status
Linux-x86_64 Error: 2: No such  file  or directory
Additional information: 3

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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  open
 
 
Database dismounted.
ORACLE instance shut down.
idle>startup pfile= '/home/oracle/initorcl.ora'  mount ;
ORACLE instance started.
 
Total System Global Area 1603411968 bytes
Fixed Size         2253664 bytes
Variable Size       1476398240 bytes
Database Buffers     117440512 bytes
Redo Buffers           7319552 bytes
Database mounted.
idle>show parameter _allow_
 
NAME                     TYPE                 VALUE
------------------------------------ --------------------------------- ------------------------------
_allow_resetlogs_corruption      boolean                  TRUE
idle>recover database  until  cancel;
ORA-00279: change 1023441 generated at 02 /24/2017  23:54:54 needed  for  thread 1
ORA-00289: suggestion :  /u02/app/oracle/product/11 .2.4 /db1/dbs/arch1_2_936817668 .dbf
ORA-00280: change 1023441  for  thread 1 is  in  sequence  #2
 
 
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194:  file  1 needs  more  recovery to be consistent
ORA-01110: data  file  1:  '/u02/app/oracle/oradata/orcl/system01.dbf'
 
 
ORA-01112: media recovery not started
 
 
idle>alter database  open  resetlogs;
 
Database altered.
 
idle> select  open_mode from  v $database;
 
OPEN_MODE
------------------------------------------------------------
READ WRITE

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

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

1
2
3
4
5
idle> select  count(*) from zx;
 
   COUNT(*)
----------
       2858

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

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

1
2
3
4
5
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

1
SQL> alter database datafile 5 offline drop;

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

1
2
3
4
5
6
7
8
9
10
11
12
SQL>  alter  database  open  resetlogs;
alter  database  open  resetlogs
*
ERROR  at  line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-00704: bootstrap process failure
ORA-00604: error occurred  at  recursive SQL  level  1
ORA-01555: snapshot too old:  rollback  segment number 5  with  name
"_SYSSMU5_4116806824$"  too small
Process ID: 3396
Session 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



     本文转自hbxztc 51CTO博客,原文链接:http://blog.51cto.com/hbxztc/1901100,如需转载请自行联系原作者











相关文章:

  • python time 与datetime之间的区别与联系
  • Exchange帐号如何手动更新?
  • MySQL体系结构:八大功能模块浅析
  • 如何读取磁盘温度
  • 【FTP】FTP 命令模式下 PASV OR PORT
  • mysql如何保证redolog和binlog的一致性,安全性,效率。
  • C++连接mysql数据库的两种方法
  • 集成银联3.3.0
  • 群集笔记
  • 教徒计划出品:同一端口同时启用PEAP和MAC地址旁路(适用于IPPhone串接PC的网络环境)...
  • 百度的“框”正在移动
  • MySQL RESET MASTER与RESET SLAVE
  • Lua 面向对象
  • java socket通信-传输文件图片--传输图片
  • 为Unreal添加一个定时运行的功能模块
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Android交互
  • CSS实用技巧
  • docker python 配置
  • jquery ajax学习笔记
  • JS 面试题总结
  • Lsb图片隐写
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • ucore操作系统实验笔记 - 重新理解中断
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 强力优化Rancher k8s中国区的使用体验
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • $GOPATH/go.mod exists but should not goland
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (八)Flask之app.route装饰器函数的参数
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (定时器/计数器)中断系统(详解与使用)
  • (六)c52学习之旅-独立按键
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (强烈推荐)移动端音视频从零到上手(下)
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)linux 命令大全
  • (转)nsfocus-绿盟科技笔试题目
  • ******之网络***——物理***
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 中 GetProcess 相关方法的性能
  • .Net6使用WebSocket与前端进行通信
  • .NET企业级应用架构设计系列之应用服务器
  • .sh
  • :=
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)