实验理论基础:
scn的序列的递增性不随数据库的任何操作而改变,即使是resetlogs也如此。
resetlogs清除所有联机日志文件中未应用的重做记录,resetlogs只重置日志文件的序列号为1,但对scn无影响,scn仍按原序列递增。
在控制文件中保存resetlogs scn和计数器,以便唯一地标识用resetlogs选项执行的每一次打开数据库的操作。
这个值被写进每个数据文件头以及重做日志文件。
如果重做日志文件的日志序列号与oracle的要求值不相符,则在恢复中不能应用重做日志文件。
执行不完全恢复后,数据库要求日志序列号为1的日志文件,所以原来的日志序列中剩余的日志文件将不可用。
resetlogs操作创建数据库的新形体,即一个拥有从1开始的新的日志序列号流的数据库。
根据以上理论:scn为顺序数据流,在数据库存在期间始终递增,而日志文件序列流也是递增序列,只不过会因resetlogs而重置为1,但日志文件序列流中的scn序列流却保持递增不变。
因此可以用resetlogs之前的归档日志流和resetlogs之后的归档日志流来连接和延续scn序列流,这样就实现了用resetlogs之前的备份恢复resetlogs之后的数据。
前提是:
保证两股日志流(resetlogs之前的归档日志流和resetlogs之后的归档日志流)完整,并且有相应两股日志流的控制文件。
建议:在resetlogs前保证数据库以前备份的数据安全,在创建resetlogs之后的第一个一致性备份之前,一定不可删掉在resetlogs前创建的一致数据库备份。
如空间足够,建议永久保留resetlogs前创建的一致数据库备份。
实验思路、步骤:
1.关库做备份--rman,记下scn与时间,,记录序号及redo。
2.打开库,记下时间/scn,删除一个用户,做基于时间点的不完全恢复。记录不完全恢复后的scn,归档序号
3.在恢复后的库,记下时间/scn,再删除一个用户,使用步骤1中备份可以对resetlos后的库再次做不完全恢复。
##########################################################################################################
第一步:关库做备份--rman,记录归档日志序号。1.查询当前归档日志序号sys@bys1>col name for a50
sys@bys1>select * from (select name,recid,sequence#,status,applied from v$archived_log order by recid desc) where rownumname recid sequence# s applied
-------------------------------------------------- ---------- ---------- - ---------
/u01/archbys1/arc_1_31_829941492.arc 120 31 a no
/u01/archbys1/arc_1_30_829941492.arc 119 30 a no
/u01/archbys1/arc_1_29_829941492.arc 118 29 a no
/u01/archbys1/arc_1_28_829941492.arc 117 28 a no
bys@bys1>select incarnation#,resetlogs_change#,resetlogs_time,prior_resetlogs_time,status,resetlogs_id from v$database_incarnation;后来补充-可以从此视图查出历次resetlogs情况
incarnation# resetlogs_change# resetlogs_time prior_resetlogs_tim status resetlogs_id
------------ ----------------- ------------------- ------------------- ------- ------------
1 1 2009/08/13 23:00:48 parent 694825248
2 754488 2013/08/01 08:58:04 2009/08/13 23:00:48 parent 822301084
3 2541692 2013/10/27 19:18:12 2013/08/01 08:58:04 parent 829941492
4 3228984 2013/11/06 00:14:08 2013/10/27 19:18:12 parent 830736848
5 3229505 2013/11/06 00:27:42 2013/11/06 00:14:08 current 830737662
2.关库并启动到 mount,做全备备份sys@bys1>startup mount;
oracle instance started.
total system global area 631914496 bytes
fixed size 1338364 bytes
variable size 385876996 bytes
database buffers 239075328 bytes
redo buffers 5623808 bytes
sys@bys1>exit
3.使用写好的备份脚本做全备备份--注意先用df -h确定备份的目录有足够空间。[oracle@bys001 ~]$ cat fullback.sh
rman log /home/oracle/backfull-`date +%y%m%d-%h%m`.log connect target /;
run {
backup full tag 'bys001-full' database
format /home/oracle/bys001full_%d_%t_%s
plus archivelog
format /home/oracle/bys001arch_%d_%t_%s
delete all input;
}
exit
[oracle@bys001 ~]$ sh fullback.sh
rman> rman> 2> 3> 4> 5> 6> 7> rman>
[oracle@bys001 ~]$ sqlplus / as sysdba
sys@bys1>alter database open;
database altered.
###############
4.记录当前系统的scn,并删除一个用户
sys@bys1>select open_mode from v$database;
open_mode
--------------------
read write
sys@bys1>select dbid,checkpoint_change# from v$database;
dbid checkpoint_change#
---------- ------------------
3957527513 3228508
sys@bys1>col name for a40
sys@bys1>select file#,name,checkpoint_change#,to_char(checkpoint_time,'yyyy-mm-dd hh24:mi:ss') cptime from v$datafile;
file# name checkpoint_change# cptime
---------- ---------------------------------------- ------------------ -------------------
1 /u01/oradata/bys1/system01.dbf 3228508 2013-11-05 23:51:15
2 /u01/oradata/bys1/sysaux01.dbf 3228508 2013-11-05 23:51:15
3 /u01/oradata/bys1/undotbs01.dbf 3228508 2013-11-05 23:51:15
4 /u01/oradata/bys1/users01.dbf 3228508 2013-11-05 23:51:15
5 /u01/oradata/bys1/example01.dbf 3228508 2013-11-05 23:51:15
6 /u01/oradata/bys1/test1.dbf 3228508 2013-11-05 23:51:15
sys@bys1> select group#,sequence#,status,first_change#,to_char(first_time,'yyyy/mm/dd:hh24:mi:ss') time from v$log;
group# sequence# status first_change# time
---------- ---------- ---------------- ------------- -------------------
1 31 inactive 3222825 2013/11/05:22:08:56
2 32 current 3228378 2013/11/05:23:38:08 可以看到当前redo日志的序号是32
3 30 inactive 3218774 2013/11/05:22:00:30
sys@bys1>set time on
23:55:34 sys@bys1> select dbms_flashback.get_system_change_number from dual;
get_system_change_number
------------------------
3228983
23:55:35 sys@bys1>conn test/test
connected.
23:55:53 test@bys1>select * from cat;
table_name table_type
------------------------------ -----------
test1 synonym
23:56:06 test@bys1>conn / as sysdba
connected.
23:56:18 sys@bys1>drop user test cascade;
user dropped.
删除用户完成
######################################################################
第二步:执行第一次不完全恢复1.首先将库启动到mount,然后基于scn进行不完全恢复
