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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

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

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

    3 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: {=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.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,如需转载请自行联系原作者











相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
24天前
|
SQL 存储 关系型数据库
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
老架构师尼恩在其读者交流群中分享了关于 MySQL 中 redo log、undo log 和 binlog 的面试题及其答案。这些问题涵盖了事务的 ACID 特性、日志的一致性问题、SQL 语句的执行流程等。尼恩详细解释了这些日志的作用、所在架构层级、日志形式、缓存机制以及写文件方式等内容。他还提供了多个面试题的详细解答,帮助读者系统化地掌握这些知识点,提升面试表现。此外,尼恩还推荐了《尼恩Java面试宝典PDF》和其他技术圣经系列PDF,帮助读者进一步巩固知识,实现“offer自由”。
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1611 14
|
1月前
|
监控 Linux 应用服务中间件
系统监控:使用日志文件 journalctl的使用
本文介绍了如何使用`journalctl`命令来监控和查看Linux系统的日志文件,包括查看特定行数、过滤日志级别、实时跟踪日志、按时间段查询日志以及日志轮换和压缩的配置。
34 2
系统监控:使用日志文件 journalctl的使用
|
29天前
|
SQL 数据库
为什么 SQL 日志文件很大,我应该如何处理?
为什么 SQL 日志文件很大,我应该如何处理?
|
2月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。 数据库没有备份,无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件,急需恢复zxfg用户下的数据。 出现“system01.dbf需要更多的恢复来保持一致性”这个报错的原因可能是控制文件损坏、数据文件损坏,数据文件与控制文件的SCN不一致等。数据库恢复工程师对数据库文件进一步检测、分析后,发现sysaux01.dbf文件损坏,有坏块。 修复并启动数据库后仍然有许多查询报错,export和data pump工具使用报错。从数据库层面无法修复数据库。
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
|
1月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
35 1
|
1月前
|
存储 监控 固态存储
如何监控和优化 WAL 日志文件的存储空间使用?
如何监控和优化 WAL 日志文件的存储空间使用?
|
18天前
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
28 0
|
2月前
|
存储 缓存 关系型数据库
redo log 原理解析
redo log 原理解析
37 0
redo log 原理解析
|
28天前
|
Oracle 关系型数据库 数据库
oracle数据恢复—Oracle数据库文件损坏导致数据库打不开的数据恢复案例
打开oracle数据库时报错,报错信息:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。急需恢复zxfg用户下的数据。 出现上述报错的原因有:控制文件损坏、数据文件损坏、数据文件与控制文件的SCN不一致等。数据恢复工程师对数据库文件做进一步检测分析后发现sysaux01.dbf文件有坏块。修复sysaux01.dbf文件,启动数据库依然有许多查询报错。export和data pump工具无法使用,查询告警日志并分析报错,确认发生上述错误的原因就是sysaux01.dbf文件损坏。由于该文件损坏,从数据库层面无法修复数据库。由于system和用户表空间的数据文件是正常的,

推荐镜像

更多
下一篇
无影云桌面