暂无图片
暂无图片
3
暂无图片
暂无图片
2
暂无图片

数据库完全恢复与Resetlogs

原创 eygle 2019-11-21
2474

很多朋友经常会对完全恢复与Resetlogs产生误解,以为使用Resetlogs方式打开数据库就是不完全恢复,这种看法是不正确的。
只要拥有当前的日志文件,那么就能够对数据库执行完全恢复,而是否需要使用Resetlogs方式打开,则取决于是否使用的是备份的控制文件。如果使用的是备份的控制文件则需要使用Resetlogs方式打开数据库;如果拥有当前的控制文件或者通过重建控制文件来恢复,就不需要通过Resetlogs方式打开数据库。
下面通过两个试验来讨论一下Oracle的恢复控制,以下两个试验的前提是日志文件完好,而其他数据文件、控制文件全部损失。

(1)使用备份控制文件进行恢复。

首先对数据库执行一次全备份,由于数据库启用了控制文件的自动备份,在全备份完成后Oracle将自动执行控制文件的备份:

RMAN> backup database format '/opt/oracle/backup/full%T';

Starting backup at 2007-05-12 22:24:28
。。。。。。。。
Finished backup at 2007-05-12 22:26:35

Starting Control File and SPFILE Autobackup at 2007-05-12 22:26:37
piece handle=/opt/oracle/product/9.2.0/dbs/c-1407686520-20070512-00 comment=NONE
Finished Control File and SPFILE Autobackup at 2007-05-12 22:26:40
复制

然后可以在数据库中执行一系列的DML操作,生成一系列的归档日志,最后强制删除所有的数据文件、控制文件,模拟一次数据库故障。接下来开始尝试恢复,首先通过控制文件的自动备份恢复出控制文件:

RMAN> startup nomount;
Oracle instance started

RMAN> set dbid=1407686520
executing command: SET DBID
RMAN> restore controlfile from autobackup;
Starting restore at 2007-05-12 22:32:26

using channel ORA_DISK_1
channel ORA_DISK_1: looking for autobackup on day: 20070512
channel ORA_DISK_1: autobackup found: c-1407686520-20070512-00
channel ORA_DISK_1: controlfile restore from autobackup complete
replicating controlfile
input filename=/opt/oracle/oradata/eygle/control01.ctl
Finished restore at 2007-05-12 22:32:29
复制

然后开始执行备份文件的回复工作:

RMAN> alter database mount;
RMAN> restore database;
复制

最后可以通过RMAN执行介质恢复:

RMAN> recover database;
复制

由于恢复使用的是备份的控制文件,所以Oracle要求必须使用Resetlogs的方式打开数据库:

RMAN> alter database open;

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of alter db command at 05/12/2007 22:35:43
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
复制

由于没有损失当前的日志文件,所以恢复可以做到完全恢复,也就是说可以恢复到最后一次成功完成的Commit操作,使用SQLPlus手工恢复过程可以更清晰地看到这个过程,在以上步骤中,当完成数据文件回复之后,可以通过SQLPlus来手工执行恢复。
由于是使用的备份控制文件,Oracle要求必须使用Backup Controlfile的选项来执行恢复:

SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
复制

在恢复过程中Oracle会依次应用归档日志:

SQL> recover database using backup controlfile;          
ORA-00279: change 18997660553 generated at 05/12/2007 22:24:28 needed for thread 1
ORA-00289: suggestion : /opt/oracle/product/9.2.0/dbs/arch1_31.dbf
ORA-00280: change 18997660553 for thread 1 is in sequence #31
………………
复制

直至最后一个日志无法找到为止:

ORA-00308: cannot open archived log '/opt/oracle/product/9.2.0/dbs/arch1_34.dbf'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
复制

这个最后的归档日志请求的实际上就是在线的尚未归档的日志文件,可以手工指定这个文件名称:

SQL> recover database using backup controlfile;
ORA-00279: change 18997660690 generated at 05/12/2007 22:28:08 needed for thread 1
ORA-00289: suggestion : /opt/oracle/product/9.2.0/dbs/arch1_34.dbf
ORA-00280: change 18997660690 for thread 1 is in sequence #34

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/opt/oracle/oradata/eygle/redo03.log
Log applied.
Media recovery complete.
复制

输入日志文件后,Oracle提示日志内容得到应用,介质恢复成功完成,也就是说所有日志都已经成功应用,实际上这已经是完成了一次完全恢复,只不过使用的是备份的控制文件,Oracle需要以Resetlogs方式来打开数据库:

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
复制

在这种情况下,之所以Oracle要求以Resetlogs来重置日志文件,是因为当使用备份的控制文件进行恢复,Oracle已经假定数据库发生了严重的介质故障。丢失了当前的控制文件之后,Oracle已经无法判断哪一个日志文件才是最后的Current的日志文件;即使通过一个日志文件完成了一个完全恢复,那么这个完全恢复也可能只是一个阶段性的,也就是说这个日志文件可能仅仅是Redo Stream里的一个中间阶段而已。

所以如果恢复执行到了某一个日志文件停止,Oracle依据用户的意图,假定这个状态是用户期待的最佳状态,那么Oracle必须要确保在这个Redo Stream里的其他日志不被应用,归档日志是可以被逐步应用用于恢复的,而且在恢复的中间阶段数据库甚至可以只读打开,所以一旦用户的意志被确定下来,Oracle要以读写方式打开数据库,必须执行Resetlogs。

对于以上测试,如果日志文件没有损失,则可以通过重建控制文件的方法来完成完全恢复,在这种情况下,就不再需要通过Resetlogs的方式来打开数据库了。

(2)通过重建控制文件进行恢复。

在测试之前执行一次全库备份,并拥有了控制文件的自动备份,这些步骤和上一个测试完全相同。
因为丢失了当前的控制文件,在执行恢复时,同样从自动备份中恢复一个控制文件:

RMAN> startup nomount;
Oracle instance started
RMAN> restore controlfile 
   2 from '/opt/oracle/product/9.2.0/dbs/c-1407686520-20070513-03';
Starting restore at 2007-05-13 12:45:05

using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=10 devtype=DISK
channel ORA_DISK_1: restoring controlfile
channel ORA_DISK_1: restore complete
replicating controlfile
input filename=/opt/oracle/oradata/eygle/control01.ctl
Finished restore at 2007-05-13 12:45:12
复制

然后通过这个备份的控制文件来回复备份的数据文件:

RMAN> alter database mount;
database mounted
RMAN> restore database;
复制

我们可以通过转储当前的控制文件为跟踪文件,获得创建控制文件的脚本:

SQL> alter database backup controlfile to trace;
Database altered.
复制

关闭数据库,启动到nomount状态,重建控制文件:

SQL> CREATE CONTROLFILE REUSE DATABASE "EYGLE" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 1134
  8  LOGFILE
  9    GROUP 3 '/opt/oracle/oradata/eygle/redo03.log'  SIZE 1M,
 10    GROUP 4 '/opt/oracle/oradata/eygle/redo04.dbf'  SIZE 1M,
 11    GROUP 5 '/opt/oracle/oradata/eygle/redo05.dbf'  SIZE 1M
 12  -- STANDBY LOGFILE
 13  DATAFILE
 14    '/opt/oracle/oradata/eygle/system01.dbf',
 15    '/opt/oracle/oradata/eygle/undotbs01.dbf',
 16    '/opt/oracle/oradata/eygle/users.dbf'
 17  CHARACTER SET ZHS16GBK
 18  ;

Control file created.
复制

接下来的恢复就可以顺利进行了:

SQL> recover database;
ORA-00279: change 18997676883 generated at 05/13/2007 12:39:15 needed for thread 1
ORA-00289: suggestion : /opt/oracle/product/9.2.0/dbs/arch1_8.dbf
ORA-00280: change 18997676883 for thread 1 is in sequence #8

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
    
ORA-00279: change 18997676947 generated at 05/13/2007 12:41:03 needed for thread 1
ORA-00289: suggestion : /opt/oracle/product/9.2.0/dbs/arch1_9.dbf
ORA-00280: change 18997676947 for thread 1 is in sequence #9
ORA-00278: log file '/opt/oracle/product/9.2.0/dbs/arch1_8.dbf' no longer needed for this recovery

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

ORA-00279: change 18997676975 generated at 05/13/2007 12:41:22 needed for thread 1
ORA-00289: suggestion : /opt/oracle/product/9.2.0/dbs/arch1_10.dbf
ORA-00280: change 18997676975 for thread 1 is in sequence #10
ORA-00278: log file '/opt/oracle/product/9.2.0/dbs/arch1_9.dbf' no longer needed for this recovery

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

Log applied.
Media recovery complete.
复制

在完成完全恢复之后,数据库可以正常打开:

SQL> alter database open;
Database altered.
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

陈年酒诗
暂无图片
5年前
评论
暂无图片 0
想看盖总的其他文章,但是点了盖总的名字没任何反应
5年前
暂无图片 点赞
1
Yukki
暂无图片
5年前
回复
暂无图片 0
一样一样,希望墨天轮能出个人空间,点击用户名查看该用户下所有文章
5年前
暂无图片 点赞
回复