我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

恢复之利用RESETLOGS之前的备份进行恢复(四)

上一篇 / 下一篇  2006-03-12 00:00:00 / 个人分类:ORACLE

一般情况下,是无法利用RESETLOGS操作之前的备份进行数据库的恢复的。但是在特定条件下利用RESETLOGS之前的备份进行恢复是可行的。

本文通过一个例子具体说明,如何利用RESETLOGS操作前的数据库备份跨越RESETLOGS操作,进行数据库的恢复。

ITPUB个人空间2viSZlU

利用RESETLOGS操作之前的数据库备份的前提是:数据库的备份处于一致性状态,且在以RESETLOGS方式打开数据库之前没有进一步的恢复操作或数据文件的修改。而且,恢复时必须存在RESETLOGS操作之后的控制文件。

下面介绍的这个例子就是利用上面的描述的这个特性来进行跨越数据库的RESETLOGS操作的恢复。整个恢复过程分为两步,首先,利用RESETLOGS以前的备份,经数据库恢复到RESETLOGS操作之前,然后,再利用RESETLOGS操作以后的控制文件和日志文件将数据库恢复到最新的时刻。

首先,构造两步恢复操作需要的所有备份文件:

SQL> CONN /@TEST AS SYSDBAITPUB个人空间FOCgj#^1f
已连接。ITPUB个人空间z-\%W {^GA!j
SQL> SELECT COUNT(*) FROM YANGTK.TEST_BACKUP;

COUNT(*)
Y.`jW3GJ1Ap5G0----------ITPUB个人空间&H3bI.L+ysAA
1

SQL> INSERT INTO YANGTK.TEST_BACKUP SELECT ROWNUM FROM DBA_OBJECTS;

已创建6290行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

SQL> DELETE YANGTK.TEST_BACKUP WHERE ID < 1000;

已删除1000行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

SQL> SHUTDOWN ABORTITPUB个人空间i~&i9n!bzZ
ORACLE 例程已经关闭。ITPUB个人空间6r6\5UQ6f+P;m~"|H
SQL> HOST COPY F:ORACLEBACKUPTEST20060312*.DBF F:ORACLEORADATATEST

SQL> STARTUP MOUNTITPUB个人空间^([u QI@
ORACLE 例程已经启动。

Total System Global Area 76619308 bytes
D1Xd| FM9Rf'N0Fixed Size 454188 bytes
~:u~y/s^\J3O0GZ0Variable Size 50331648 bytesITPUB个人空间~!I1v;l:Xe+S*])o uv
Database Buffers 25165824 bytesITPUB个人空间*krK h ?8Q`
Redo Buffers 667648 bytesITPUB个人空间i(f|D,j%?DjWW's
数据库装载完毕。
yY+AVSw PB;@:nF1Wn0SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL
~Jj/PRD/b0D0ORA-00279: 更改 46448931 (在 03/12/2006 19:22:59 生成) 对于线程 1 是必需的
cvLa3R:SF3g)~0ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00001.001ITPUB个人空间1OSb~z9B S)b8r
ORA-00280: 更改 46448931 对于线程 1 是按序列 # 1 进行的


iDu)a9xv0指定日志: {<RET>=suggested | filename | AUTO | CANCEL}ITPUB个人空间3sG.Fk1ub
AUTOITPUB个人空间Xx.^a)Kv0j
ORA-00279: 更改 46449098 (在 03/12/2006 23:38:24 生成) 对于线程 1 是必需的
O5t xP$m x;P+v0ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00002.001
"`8AFQ n5RC#G%d0ORA-00280: 更改 46449098 对于线程 1 是按序列 # 2 进行的
8y}%jDZl,raX0ORA-00278: 此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00001.001'


I[V"a$j8I!H0ORA-00279: 更改 46449118 (在 03/12/2006 23:39:03 生成) 对于线程 1 是必需的
n[]-A T/l0ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00003.001ITPUB个人空间?irsN O3Rc
ORA-00280: 更改 46449118 对于线程 1 是按序列 # 3 进行的
a:sDZ(M Y0ORA-00278: 此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00002.001'

ITPUB个人空间7x3iU6CpY+t
ORA-00328: 归档日志在更改 46448727 结束,需要稍后的更改 46449118ITPUB个人空间 Yo w|,B
ORA-00334: 归档日志: 'F:ORACLEORADATATESTARCHIVEARC00003.001'


\/yT:fm&{ P:z\0SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCELITPUB个人空间,ELUvF-L [
ORA-00279: 更改 46449118 (在 03/12/2006 23:39:03 生成) 对于线程 1 是必需的ITPUB个人空间 I!Zo#rM1u$y
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00003.001
Fm;Vcm)D&wp1s0ORA-00280: 更改 46449118 对于线程 1 是按序列 # 3 进行的


9B)N)e:FZ[*Grql0指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
/X8DM3C)eUf,L)c0F:ORACLEORADATATESTREDO01.LOGITPUB个人空间m T+aSYM+a.r-s
ORA-00310: 存档日志包含序列 2;要求序列 3ITPUB个人空间%zAgBj NN o4q
ORA-00334: 归档日志: 'F:ORACLEORADATATESTREDO01.LOG'


U^$|$d#~9Q%P0SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCELITPUB个人空间w5eI r8?+Rrdy
ORA-00279: 更改 46449118 (在 03/12/2006 23:39:03 生成) 对于线程 1 是必需的ITPUB个人空间N+kD/EPVy @,S
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00003.001
~6Z&[7["J(a3miM0ORA-00280: 更改 46449118 对于线程 1 是按序列 # 3 进行的

ITPUB个人空间 x!?*Dj9Aj Q8m_
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}ITPUB个人空间c,}j%q&e!a
F:ORACLEORADATATESTREDO03.LOG
A yGj/s Z%X0已应用的日志。
6MP r C\Z(Dt0完成介质恢复。ITPUB个人空间2v `x;Hr
SQL> SHUTDOWN
W@(KWB^MZ@0ORA-01109: 数据库未打开

ITPUB个人空间"DU)Y+]jK ~;sx
已经卸载数据库。ITPUB个人空间o;xV"n m6j
ORACLE 例程已经关闭。
_9A]0I0T+h0SQL> HOST COPY F:ORACLEORADATATEST* F:ORACLEBACKUPTEST_BEF_RESETLOGS

SQL> HOST COPY F:ORACLEORADATATESTARCHIVE*.001 F:ORACLEBACKUPTEST_BEF_RESETLOGS

SQL> STARTUP MOUNTITPUB个人空间;CS/eW^}]-z
ORACLE 例程已经启动。

Total System Global Area 76619308 bytes
0eV{Dw3B0Fixed Size 454188 bytesITPUB个人空间.nJi$s5E2YHV)r
Variable Size 50331648 bytes
`q#DMw0Database Buffers 25165824 bytesITPUB个人空间} B)y)G[
Redo Buffers 667648 bytes
R;B@r7|#k0数据库装载完毕。ITPUB个人空间2w8?2z5eZ!r,K
SQL> ALTER DATABASE OPEN RESETLOGS;

数据库已更改。

SQL> SELECT COUNT(*) FROM YANGTK.TEST_BACKUP;

COUNT(*)ITPUB个人空间{`.\BY$n @@
----------ITPUB个人空间]}8F/|%U t
5291

SQL> DELETE YANGTK.TEST_BACKUP;

已删除5291行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

SQL> INSERT INTO YANGTK.TEST_BACKUP VALUES (1);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

SQL> INSERT INTO YANGTK.TEST_BACKUP VALUES (2);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

SQL> SHUTDOWN IMMEDIATE
$p(k Iz*X Mi&T7A0数据库已经关闭。
,Bx&Aj Y(ll7je0已经卸载数据库。ITPUB个人空间 T B j"C!MaWQ#x%]8F
ORACLE 例程已经关闭。ITPUB个人空间,k,R ^ fZ|RFj
SQL> HOST COPY F:ORACLEORADATATEST* F:ORACLEBACKUPTEST_AFT_RESETLOGS

SQL> HOST COPY F:ORACLEORADATATESTARCHIVE*.001 F:ORACLEBACKUPTEST_AFT_RESETLOGS

到此,所有的需要的备份构造完毕。例子需要一个以前时刻的备份,在这个例子中,这个备份存放在F:ORACLEBACKUPTEST20060312目录下。

然后,模拟了丢失控制文件和数据文件后利用这个备份进行恢复的过程。在恢复之后且OPEN RESETLOGS之前,关闭数据库,进行数据库的冷备份(注意,这里需要备份联机日志文件和归档日志文件)。这个冷备份中的数据文件可以用于跨越RESETLOGS操作的恢复,这在前两篇文章中已经介绍过了。在本例中不会利用这个冷备份中的数据文件,而是会利用到此时的控制文件和联机重做日志文件已经归档日志文件。

RESETLOGS操作打开数据库后,进行一些数据修改,并关机进行了冷备份。这个例子中,为了减少篇幅,TEST20060312目录下和TEST_AFT_RESETLOGS目录下的备份均为关机备份,这两个地方也可以使用联机备份。操作上没有什么大的区别。

下面尝试使用RESETLOGS操作之前的某个数据库备份来恢复到RESETLOGS之后的状态:

SQL> HOST COPY F:ORACLEBACKUPTEST20060312*.DBF F:ORACLEORADATATEST

SQL> HOST COPY F:ORACLEBACKUPTEST_BEF_RESETLOGS*.001 F:ORACLEORADATATESTARCHIVE

SQL> HOST COPY F:ORACLEBACKUPTEST_BEF_RESETLOGS*.CTL F:ORACLEORADATATEST

SQL> HOST COPY F:ORACLEBACKUPTEST_BEF_RESETLOGS*.LOG F:ORACLEORADATATEST

SQL> STARTUP MOUNTITPUB个人空间*AY1a zlGW4m1g
ORACLE 例程已经启动。

Total System Global Area 76619308 bytesITPUB个人空间`9M4_ASF o"_/^
Fixed Size 454188 bytes
Py*E _&F)i\hK0Variable Size 50331648 bytes
hKU#v6QcCR)s.gf0Database Buffers 25165824 bytesITPUB个人空间I'Q DT Jr
Redo Buffers 667648 bytes
W@Az"| Hr9W0数据库装载完毕。
:E.~*m `M!gw U0SQL> RECOVER DATABASE
ftF/x g z8T#H0ORA-00283: 恢复会话因错误而取消
*L!q+f|UN0ORA-01610: 使用 BACKUP CONTROLFILE 选项的恢复必须已完成

ITPUB个人空间QxVX ea,]9y
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
P%W]w)PN!B0ORA-00279: 更改 46448931 (在 03/12/2006 19:22:59 生成) 对于线程 1 是必需的ITPUB个人空间)C!F|z3j
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00001.001
4j%t(n4T}.XZ(XQG0ORA-00280: 更改 46448931 对于线程 1 是按序列 # 1 进行的


!Tss$CF._!e0指定日志: {<RET>=suggested | filename | AUTO | CANCEL}ITPUB个人空间%Ed4N ^p-J.m
AUTO
}7}[,d(Pl(W0ORA-00279: 更改 46449098 (在 03/12/2006 23:38:24 生成) 对于线程 1 是必需的ITPUB个人空间 N!`&u!h j
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00002.001ITPUB个人空间#C V\$aa9X
ORA-00280: 更改 46449098 对于线程 1 是按序列 # 2 进行的ITPUB个人空间_9f0Wl [O&O y!|R Q
ORA-00278: 此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00001.001'


)p#[&}X$R8i~3{0ORA-00279: 更改 46449118 (在 03/12/2006 23:39:03 生成) 对于线程 1 是必需的
+U+XD-O7pdX0ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00003.001
~6y-b*lStM;dZ0ORA-00280: 更改 46449118 对于线程 1 是按序列 # 3 进行的
"Ee4_1_:a0n0E0ORA-00278: 此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00002.001'


Hn c{f)k s&^p0ORA-00326: 日志在更改 46449431 开始,需要更早的更改 46449118
#s!K-~G3h$V-i&Jm0ORA-00334: 归档日志: 'F:ORACLEORADATATESTARCHIVEARC00003.001'


Y/k(NmHq7R v0SQL> RECOVER DATABASE USING BACKUP CONTROLFILEITPUB个人空间4Q#y8p H](q%s
ORA-00279: 更改 46449118 (在 03/12/2006 23:39:03 生成) 对于线程 1 是必需的ITPUB个人空间F!l xnO%@
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00003.001ITPUB个人空间:H&KGu6]f
ORA-00280: 更改 46449118 对于线程 1 是按序列 # 3 进行的


}u!W,E!m Y0指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
V,M#R%F9j NT,Yje$H0F:ORACLEORADATATESTREDO03.LOG
;Sj-y} p Z0已应用的日志。ITPUB个人空间+``L g"BS TH O:T*d
完成介质恢复。

此时,第一步的恢复操作已经完成,这一步操作的目的是将数据库恢复到RESETLOGS操作前的那个一致性状态,然后就可以利用前两篇文章介绍的方法继续进行恢复了。

SQL> SHUTDOWNITPUB个人空间,m a kC&I5D
ORA-01109: 数据库未打开

ITPUB个人空间$}p'XiML6qe
已经卸载数据库。ITPUB个人空间?N)s M"`pa
ORACLE 例程已经关闭。ITPUB个人空间*e_lO;z n*Z$b,P0G
SQL> HOST COPY F:ORACLEBACKUPTEST_AFT_RESETLOGS*.CTL F:ORACLEORADATATEST

SQL> HOST COPY F:ORACLEBACKUPTEST_AFT_RESETLOGS*.LOG F:ORACLEORADATATEST

SQL> HOST COPY F:ORACLEBACKUPTEST_AFT_RESETLOGS*.001 F:ORACLEORADATATESTARCHIVE

SQL> STARTUP MOUNT
k]+PI4m P0ORACLE 例程已经启动。

Total System Global Area 76619308 bytes
IF5g{C0Fixed Size 454188 bytesITPUB个人空间#[ si(c4K:AP^)`Y
Variable Size 50331648 bytes
c1dm8Yq0?5W0Database Buffers 25165824 bytesITPUB个人空间Z e:MRKrF
Redo Buffers 667648 bytesITPUB个人空间-Sm7v8P^to&T?}j
数据库装载完毕。
5Q&{,OVsY l0SQL> RECOVER DATABASE
Jm kMs0ORA-00279: 更改 46449132 (在 03/13/2006 00:44:17 生成) 对于线程 1 是必需的ITPUB个人空间;P9kdOgQ
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00001.001
^wYn6Nu0ORA-00280: 更改 46449132 对于线程 1 是按序列 # 1 进行的


iS,e_a3gf9B0指定日志: {<RET>=suggested | filename | AUTO | CANCEL}ITPUB个人空间e ^$g J7br
AUTO
4gwX#V5B0已应用的日志。
@Z S%z*L0s?|0完成介质恢复。
"S CpjR VCN0SQL> ALTER DATABASE OPEN;

数据库已更改。

SQL> SELECT COUNT(*) FROM YANGTK.TEST_BACKUP;

COUNT(*)
1P U#x'DA1~:\:o*d0----------ITPUB个人空间IZR)c ?B4\au
2

至此,数据库恢复成功。

需要注意的时,由于恢复实际上包含了前后两个部分,因此,这里需要在不同的部分利用不同的的控制文件、归档日志文件和联机日志文件的备份进行恢复。

最后强调一点:虽然Oracle的恢复技术理论上使得利用RESETLOGS操作之前的备份去恢复RESETLOGS之后的数据成为可能,但是实际上处理起来十分繁琐,而且容易出错。最重要的时,平时一般的备份策略产生的备份无法满足这种恢复操作的需要(一般情况下,不会备份联机日志文件)。因此,还是应该养成好的习惯,在数据库以RESETLOGS方式打开之后,应该马上进行数据库的备份。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar