如果没有恢复目录,执行了不完全恢复用open
resetlog打开后,日志序列号从1开始重新记数,之前的日志不可再用。使用恢复目录后,可以将数据库退到以前的日志。
为了准备其他备份实验用的数据环境,备份了多余的数据。不是很精确的只为这个实验所用
update scott.emp set sal=4000 where
empno=7788;
commit;
alter system switch
logfile;
select current_scn from
v$database;
select sal from scott.emp where
empno=7788;
开启控制文件自动备份。
备份过程
忘了记时间了,用这语句将scn转换为时间
SQL> select
to_char(scn_to_timestamp(534055),'yyyy.mm.dd hh24:mi:ss') from
dual;
TO_CHAR(SCN_TO_TIMESTAMP(53405
------------------------------
2012.11.19 20:51:39
动作
临近的Scn
所在log
临近时间
sal=4000
534055
8
20:51:39
switch logfile
Sal=5000
534105
8
20:52:51
Sal=6000
534125
8
20:53:21
Backup database
534332
8
20:57:25
switch logfile
534353
20:57:49
Sal=7000
534364
9
20:58:10
switch logfile
534586
20:58:31
Sal=8000
534596
10
20:58:48
Sal=9000
534621
10
20:59:04
Backup database
534983
21:02:59
switch logfile 3次
Sal=10000
535018
13
21:03:47
Sal=11000
535045
13
21:04:11
switch logfile
Backup database
537622
21:44:23
switch logfile 3次
14,15,16
Sal=12000
537998
17
21:50:02
switch logfile
538033
21:50:36
SQL> select
t.SEQUENCE#,t.RESETLOGS_CHANGE#,t.FIRST_CHANGE#,NEXT_CHANGE#,
nvl(t.END_OF_REDO_TYPE,'null') a from
v$archived_log t;
SEQUENCE# RESETLOGS_CHANGE#
FIRST_CHANGE# NEXT_CHANGE# A
---------- -----------------
------------- ------------ ----------
2
446075
474979
500679 null
3
446075
500679
529934 null
4
446075
529934
531684 null
5
446075
531684
532432 null
6
446075
532432
532807 null
7
446075
532807
533025 null
8
446075
533025
534348 null
9
446075
534348
534379 null
10
446075
534379
534992 null
11
446075
534992
534994 null
12
446075
534994
534999 null
13
446075
534999
537306 null
14
446075
537306
537673 null
15
446075
537673
537687 null
16
446075
537687
537691 null
17
446075
537691
538032 null
进行一次不完全恢复,生成一个resetlog,使数据库有多个版本。
恢复到日志序列号为14,sal=12000的数据丢失,回到sal=11000。
startup force mount;
run {
set until sequence=14;
restore database;
recover database;
alter database open
resetlogs;
}
SQL> select sal from
scott.emp where empno=7788;
SAL
----------
11000
sal=11000有预想一样。
SQL>alter system
switch logfile;4次
RMAN> list incarnation
of database;
List of Database
Incarnations
DB Key Inc Key DB
Name DB
ID
STATUS
Reset SCN
Reset Time
------- ------- --------
---------------- --- ---------- ----------
1
8
LY
1369670644
PARENT
1
30-JUN-05
1
2
LY
1369670644
PARENT
446075
19-NOV-12
1
364
LY
1369670644
CURRENT 537307
19-NOV-12
select
t.SEQUENCE#,t.RESETLOGS_CHANGE#,t.FIRST_CHANGE#,NEXT_CHANGE#,
nvl(t.END_OF_REDO_TYPE,'null') a from
v$archived_log t where
t.FIRST_CHANGE#>=533025;
SEQUENCE# RESETLOGS_CHANGE#
FIRST_CHANGE# NEXT_CHANGE# A
---------- -----------------
------------- ------------ ----------
8
446075
533025
534348 null
9
446075
534348
534379 null
10
446075
534379
534992 null
11
446075
534992
534994 null
12
446075
534994
534999 null
13
446075
534999
537306 null
14
446075
537306
537673 null
15
446075
537673
537687 null
16
446075
537687
537691 null
17
446075
537691
538032 null
18
446075
538032
538340 RESETLOGS
1
537307
537307
545884 null
2
537307
545884
545931 null
3
537307
545931
545977 null
4
537307
545977
545981 null
将数据库退到 2这个版本(书上叫这为“对应物”,好奇怪的名字)
RMAN> startup force
mount;
RMAN>reset database to
incarnation 2;
RMAN> list incarnation
of database;
List of Database
Incarnations
DB Key Inc Key DB
Name DB
ID
STATUS
Reset SCN
Reset Time
------- ------- --------
---------------- --- ---------- ----------
1
8
LY
1369670644
PARENT
1
30-JUN-05
1
2
LY
1369670644
CURRENT 446075
19-NOV-12
1
364
LY
1369670644
ORPHAN
537307
19-NOV-12
SQL> alter database
open;
SQL> select
current_scn from v$database;
CURRENT_SCN
-----------
567648
切换几次日志后,新的SCN不是从446075开始,而是接着从537307开始
1
537307
537307
545884 null
2
537307
545884
545931 null
3
537307
545931
545977 null
4
537307
545977
545981 null
5
537307
545981
567143 null
SQL> select sal from
scott.emp where empno=7788;
SAL
---------
11000.00
sal肯定还是11000
当前scn为567648,现尝试恢复到sal=8000,所在scn为534596
startup force mount;
run {
set until scn=534596;
restore database;
recover database;
alter database open
resetlogs;
}
SQL> select sal from
scott.emp where empno=7788;
SAL
---------
8000.00
没有问题。如果没有恢复目录,就不能恢复到scn=537307之前也就是resetlogs之前的旧日志。
在不使用恢复目录情况也能这样做。
RMAN> list incarnation
;
在有恢复目录和无恢复目录情况下 inc
key数字不同,因为恢复目录是为所有目标数据库拉通排的,编号不一样,这很正常
RMAN> reset database
to incarnation 2;
ORA-19910: can not change recovery
target incarnation in control file
RMAN> startup force mount;
RMAN> reset database to incarnation
2;
然后还原,恢复,打开,都一样。