RESETLOG之后数据文件丢失的RMAN恢复测试

版权声明:本文为作者原创,转载请标明出处! https://blog.csdn.net/kiral07/article/details/87254905

RESETLOG之后数据文件丢失的RMAN恢复测试

一、场景

在T0时间点做了RMAN全备,随后在T1时间点由于误操作将T0表truncate。在T2时间点通过RMAN的不完全恢复,将数据库恢复到T1时间点(truncate之前),resetlog之后没有做RMAN的全备。恢复数据库之后,创建了3张业务表T1、T2、T3,由于介质故障在T4时间点所有的数据文件均已丢失(模拟删除),然而redo、归档日志文件、控制文件都在,可以通过resetlog之前的备份文件执行完全恢复。
在这里插入图片描述

二、模拟步骤

1、T0时间点admin用户下创建表T0

conn admin/admin123
create table t0 (id number,name varchar2(10));
insert into t0 values(1,'a');
insert into t0 values(2,'b');
insert into t0 values(3,'c');
insert into t0 values(4,'d');
insert into t0 values(5,'e');
commit;
alter system switch logfile;
/
/
/
SQL> select * from t0;

        ID NAME
---------- ------------------------------
         1 a
         2 b
         3 c
         4 d
         5 e

2、对数据库做RMAN全备

RMAN> backup database format '/u01/rman_orcl/fulldb_%d_%T_%U.bak';

3、记录下当前全备的时间

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') currtime from dual;
2018/08/09 16:09:19

4、在T1时间点truncate表T0,模拟误操作

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') currtime from dual;

CURRTIME
---------------------------------------------------------
2018-08-09 16:33:40

truncate table t0;
Table truncated.

select * from t0;
no rows selected

5、在T2时间点通过RMAN不完全恢复到T1时间点(truncate之前)

SQL> shutdown immediate;
startup mount;

还原数据文件

RMAN> restore database until time "to_date('2018-08-09 16:33:40','yyyy-mm-dd hh24:mi:ss')";
Starting restore at 2018/08/09 16:38:16
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=386 device type=DISK
flashing back control file to SCN 3009005

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/orcl/system01.dbf
channel ORA_DISK_1: restoring datafile 00002 to /u01/app/oracle/oradata/orcl/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/orcl/undotbs01.dbf
channel ORA_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/orcl/users01.dbf
channel ORA_DISK_1: restoring datafile 00005 to /u01/app/oracle/oradata/orcl/secure.dbf
channel ORA_DISK_1: restoring datafile 00006 to /u01/app/oracle/oradata/orcl/tbs.dbf
channel ORA_DISK_1: restoring datafile 00007 to /u01/app/oracle/oradata/orcl/epoint9_9_3_3.dbf
channel ORA_DISK_1: restoring datafile 00008 to /u01/app/oracle/oradata/orcl/admin1.dbf
channel ORA_DISK_1: restoring datafile 00010 to /u01/app/oracle/oradata/orcl/admin2.dbf
channel ORA_DISK_1: reading from backup piece /u01/rman_orcl/fulldb_ORCL_20180809_6rta4q4v_1_1.bak
channel ORA_DISK_1: piece handle=/u01/rman_orcl/fulldb_ORCL_20180809_6rta4q4v_1_1.bak tag=TAG20180809T160903
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
Finished restore at 2018/08/09 16:38:42

恢复应用日志

RMAN> recover database until time "to_date('2018-08-09 16:33:40','yyyy-mm-dd hh24:mi:ss')";
Starting recover at 2018/08/09 16:39:17
using channel ORA_DISK_1

starting media recovery

archived log for thread 1 with sequence 16 is already on disk as file /u01/arch/1_16_983525552.dbf
archived log for thread 1 with sequence 17 is already on disk as file /u01/arch/1_17_983525552.dbf
archived log for thread 1 with sequence 18 is already on disk as file /u01/arch/1_18_983525552.dbf
archived log for thread 1 with sequence 19 is already on disk as file /u01/arch/1_19_983525552.dbf
archived log for thread 1 with sequence 20 is already on disk as file /u01/arch/1_20_983525552.dbf
archived log for thread 1 with sequence 21 is already on disk as file /u01/arch/1_21_983525552.dbf
archived log for thread 1 with sequence 22 is already on disk as file /u01/app/oracle/oradata/orcl/redo03.log
archived log for thread 1 with sequence 23 is already on disk as file /u01/app/oracle/oradata/orcl/redo01.log
archived log for thread 1 with sequence 24 is already on disk as file /u01/app/oracle/oradata/orcl/redo02.log
archived log file name=/u01/arch/1_16_983525552.dbf thread=1 sequence=16
archived log file name=/u01/arch/1_17_983525552.dbf thread=1 sequence=17
archived log file name=/u01/arch/1_18_983525552.dbf thread=1 sequence=18
archived log file name=/u01/arch/1_19_983525552.dbf thread=1 sequence=19
archived log file name=/u01/arch/1_20_983525552.dbf thread=1 sequence=20
archived log file name=/u01/arch/1_21_983525552.dbf thread=1 sequence=21
media recovery complete, elapsed time: 00:00:01
Finished recover at 2018/08/09 16:39:20

6、在T3时间点resetlogs,日志序列号被重置

alter database open resetlogs;
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/arch
Oldest online log sequence     1
Next log sequence to archive   2
Current log sequence           2

7、恢复数据库之后查看T0表

SQL> select * from admin.t0;

        ID NAME
---------- ------------------------------
         1 a
         2 b
         3 c
         4 d
         5 e

已恢复表数据

8、随后admin下创建3张表

SQL> conn admin/admin123
create table t1 as select * from dba_users;
create table t2 as select * from dba_users;
create table t3 as select * from dba_users;

记录下此时时间点

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') currtime from dual;

CURRTIME
---------------------------------------------------------
2018-08-09 16:44:19

9、在T4时间点删除所有数据文件(模拟介质故障),日志文件、归档日志、控制文件都在

SQL> select name from v$datafile;
NAME
----------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
/u01/app/oracle/oradata/orcl/secure.dbf
/u01/app/oracle/oradata/orcl/tbs.dbf
/u01/app/oracle/oradata/orcl/epoint9_9_3_3.dbf
/u01/app/oracle/oradata/orcl/admin1.dbf
/u01/app/oracle/oradata/orcl/admin2.dbf

9 rows selected.
SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

记录下此时日志序列号

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/arch
Oldest online log sequence     3
Next log sequence to archive   5
Current log sequence           5
SQL> shutdown immediate;

删除所有数据文件

[oracle@gs orcl]$ rm -rf *.dbf

10、通过RMAN完全恢复到T4故障点之前

[oracle@gs orcl]$ rman target /
RMAN> startup mount;
RMAN> restore database;
Starting restore at 2018/08/09 16:58:24
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=5 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/orcl/system01.dbf
channel ORA_DISK_1: restoring datafile 00002 to /u01/app/oracle/oradata/orcl/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/orcl/undotbs01.dbf
channel ORA_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/orcl/users01.dbf
channel ORA_DISK_1: restoring datafile 00005 to /u01/app/oracle/oradata/orcl/secure.dbf
channel ORA_DISK_1: restoring datafile 00006 to /u01/app/oracle/oradata/orcl/tbs.dbf
channel ORA_DISK_1: restoring datafile 00007 to /u01/app/oracle/oradata/orcl/epoint9_9_3_3.dbf
channel ORA_DISK_1: restoring datafile 00008 to /u01/app/oracle/oradata/orcl/admin1.dbf
channel ORA_DISK_1: restoring datafile 00010 to /u01/app/oracle/oradata/orcl/admin2.dbf
channel ORA_DISK_1: reading from backup piece /u01/rman_orcl/fulldb_ORCL_20180809_6rta4q4v_1_1.bak
channel ORA_DISK_1: piece handle=/u01/rman_orcl/fulldb_ORCL_20180809_6rta4q4v_1_1.bak tag=TAG20180809T160903
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
Finished restore at 2018/08/09 16:58:50
RMAN> recover database;
Starting recover at 2018/08/09 16:58:59
using channel ORA_DISK_1

starting media recovery

archived log for thread 1 with sequence 24 is already on disk as file /u01/arch/1_24_983525552.dbf
archived log for thread 1 with sequence 1 is already on disk as file /u01/arch/1_1_983724050.dbf
archived log for thread 1 with sequence 2 is already on disk as file /u01/arch/1_2_983724050.dbf
archived log for thread 1 with sequence 3 is already on disk as file /u01/arch/1_3_983724050.dbf
archived log for thread 1 with sequence 4 is already on disk as file /u01/arch/1_4_983724050.dbf
archived log file name=/u01/arch/1_24_983525552.dbf thread=1 sequence=24
archived log file name=/u01/arch/1_1_983724050.dbf thread=1 sequence=1
archived log file name=/u01/arch/1_2_983724050.dbf thread=1 sequence=2
media recovery complete, elapsed time: 00:00:01
Finished recover at 2018/08/09 16:59:01

11、恢复之后打开数据库

RMAN> alter database open;

database opened

查看此时序列号还是故障之前,保持完整

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/arch
Oldest online log sequence     3
Next log sequence to archive   5
Current log sequence           5

12、查看在发生故障之前创建的3张表

SQL> select count(*) from t1;

  COUNT(*)
----------
        32

SQL> select count(*) from t2;

  COUNT(*)
----------
        32


SQL> select count(*) from t3;

  COUNT(*)
----------
        32

SQL> select count(*) from t0;

  COUNT(*)
----------
         5

SQL> select * from t0;

        ID NAME
---------- ------------------------------
         1 a
         2 b
         3 c
         4 d
         5 e
         
数据均准确。

结论:resetlog之后,如果数据文件意外损坏或者误删。只要redo、归档文件、控制文件还在,可以拿resetlog之前的备份执行完全恢复。

猜你喜欢

转载自blog.csdn.net/kiral07/article/details/87254905