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之前的备份执行完全恢复。