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

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

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

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

本文讨论如何利用RESETLOGS操作前的数据库备份进行数据库的恢复。


ns[y)ntM}0

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

先看下面这个简单的例子:假设服务器调整硬件,在调整之前,对数据库的数据文件进行冷备份。

SQL> CONN /@TEST AS SYSDBAITPUB个人空间$XHH*E1qTO|p
已连接。
#zl Ys6h@:cc'X0SQL> SHUTDOWN IMMEDIATEITPUB个人空间'zH{B-?%B"c
数据库已经关闭。ITPUB个人空间#W4Y;C6x1T e^!Fh
已经卸载数据库。ITPUB个人空间5}L)_P p@0j5DR'M
ORACLE 例程已经关闭。ITPUB个人空间bqW-fG6B
SQL> HOST COPY F:ORACLEORADATATEST*.DBF F:ORACLEBACKUPTEST20060310

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

由于硬件故障导致数据库的所有联机日志丢失,数据库需要使用RESETLOGS方式打开。下面模仿丢失所有文件,利用刚才备份的数据以RESETLOGS方式打开数据库。

SQL> HOST DEL F:ORACLEORADATATEST*

SQL> HOST COPY F:ORACLEBACKUPTEST20060310* F:ORACLEORADATATEST

SQL> STARTUP MOUNTITPUB个人空间-B?h9Otp}4d|M
ORACLE 例程已经启动。

Total System Global Area 76619308 bytesITPUB个人空间VN+~Z7rn0fT
Fixed Size 454188 bytes
o+T/U8M\&ele0Variable Size 50331648 bytes
Q4xG DS*`)Ra0Database Buffers 25165824 bytes
\$pn:S!x"}3I0Redo Buffers 667648 bytes
tYq:u W}n;u"d0数据库装载完毕。
Z\DJ W0U0SQL> RECOVER DATABASE UNTIL CANCEL
(k YBl_.F)K0完成介质恢复。ITPUB个人空间 ko$U @%gC
SQL> ALTER DATABASE OPEN RESETLOGS;

数据库已更改。

由于数据库是正常关闭,因此RECOVER DATABASE UNTIL CANCEL不会进行任何实际的恢复操作,因此,这个备份可以在RESETLOGS操作后用来恢复。

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

COUNT(*)ITPUB个人空间aM2_\,j C
----------ITPUB个人空间S ]+F,p!vu`)V*G
6290

SQL> DELETE YANGTK.TEST_BACKUP WHERE ROWNUM < 6000;

已删除5999行。

SQL> COMMIT;

提交完成。

SQL> SHUTDOWN IMMEDIATEITPUB个人空间jmW/y C;Y
数据库已经关闭。ITPUB个人空间6w[@"OuA@:iRf
已经卸载数据库。ITPUB个人空间7\K9Zyv/mI*sP%h
ORACLE 例程已经关闭。
{3k(NO(Cu ]R ? Y i0SQL> HOST COPY F:ORACLEBACKUPTEST20060310*.DBF F:ORACLEORADATATEST

SQL> STARTUP MOUNTITPUB个人空间7Ah h#i!EO
ORACLE 例程已经启动。

Total System Global Area 76619308 bytes
&?!r#H[(ty[0Fixed Size 454188 bytes
7Z%g(RU{o @+f0Variable Size 50331648 bytesITPUB个人空间&v0_is(['Cn
Database Buffers 25165824 bytesITPUB个人空间!IB7o/t(A uQf6V
Redo Buffers 667648 bytes
VaI cO}n$E0数据库装载完毕。
;O`+KmH^4p-H0SQL> RECOVER DATABASE
9c|I&a4[0完成介质恢复。
X(] u3n3Q0SQL> ALTER DATABASE OPEN;

数据库已更改。

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

COUNT(*)
9jEcV? CoJKmM0----------ITPUB个人空间*~&lp`7o,}
291

虽然这种方法可以用来恢复数据库,但是限制条件还是相对比较多的。在执行完RESETLOGS操作后,还是应该马上进行数据库的全备。

如果数据库是OPEN RESETLOGS前不是处于正常关闭状态下,可以利用RECOVER DATABASE操作,将数据库恢复到一致性状态,然后SHUTDOWN数据库,备份数据库后再以RESETLOGS方式打开,这样得到的备份也可以用于RESETLOGS方式之后的恢复。

SQL> CONN /@TEST AS SYSDBA
o)f LXlFCOL [0已连接。ITPUB个人空间D1_Q*w*A't3m
SQL> SELECT 'ALTER TABLESPACE ' || TABLESPACE_NAME || ' BEGIN BACKUP;'
Ab3a#@BF"os0 2 FROM DBA_TABLESPACES WHERE CONTENTS != 'TEMPORARY';

'ALTERTABLESPACE'||TABLESPACE_NAME||'BEGINBACKUP;'ITPUB个人空间'T q5?@As ~-B
-------------------------------------------------------------ITPUB个人空间/O8X y+^7r
ALTER TABLESPACE SYSTEM BEGIN BACKUP;ITPUB个人空间t(W6j2X{2Mp?(e!x
ALTER TABLESPACE UNDOTBS1 BEGIN BACKUP;ITPUB个人空间y#Pm%i:[8~Zs]N
ALTER TABLESPACE INDX BEGIN BACKUP;ITPUB个人空间G/Lt&Z b2Ma&^`L
ALTER TABLESPACE TOOLS BEGIN BACKUP;
4y%h8Ooo/h0ALTER TABLESPACE USERS BEGIN BACKUP;ITPUB个人空间 @mn M\,{ v
ALTER TABLESPACE YANGTK BEGIN BACKUP;

已选择6行。

SQL> ALTER TABLESPACE SYSTEM BEGIN BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE UNDOTBS1 BEGIN BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE INDX BEGIN BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE TOOLS BEGIN BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE USERS BEGIN BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE YANGTK BEGIN BACKUP;

表空间已更改。

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

SQL> SELECT 'ALTER TABLESPACE ' || TABLESPACE_NAME || ' END BACKUP;'
|}qg0M/Uva J$i0 2 FROM DBA_TABLESPACES WHERE CONTENTS != 'TEMPORARY';

'ALTERTABLESPACE'||TABLESPACE_NAME||'ENDBACKUP;'ITPUB个人空间,WYv5y/LYfAs kP{
-----------------------------------------------------------
GH _.V pU B/nI0ALTER TABLESPACE SYSTEM END BACKUP;ITPUB个人空间bJd2Fz8R%h
ALTER TABLESPACE UNDOTBS1 END BACKUP;
]3~9@;Wr9Y0ALTER TABLESPACE INDX END BACKUP;ITPUB个人空间3gs E;uX9QJ
ALTER TABLESPACE TOOLS END BACKUP;ITPUB个人空间 y6j }N q/T9^(M
ALTER TABLESPACE USERS END BACKUP;ITPUB个人空间3x9|V\$II T0}8z
ALTER TABLESPACE YANGTK END BACKUP;

已选择6行。

SQL> ALTER TABLESPACE SYSTEM END BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE UNDOTBS1 END BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE INDX END BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE TOOLS END BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE USERS END BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE YANGTK END BACKUP;

表空间已更改。

SQL> ALTER DATABASE BACKUP CONTROLFILE TO 'F:ORACLEBACKUPTEST20060310CONTROL01.CTL';

数据库已更改。

先做一个联机热备份,一会用于恢复操作。

SQL> DELETE YANGTK.TEST_BACKUP;

已删除291行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

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

已创建6290行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

SQL> UPDATE YANGTK.TEST_BACKUP SET ID = ID + 1;

已更新6290行。

SQL> COMMIT;

提交完成。

假设现在数据库崩溃了,丢失了重做日志文件和数据文件,需要利用备份恢复并以RESETLOGS方式打开:

SQL> SHUTDOWN IMMEDIATEITPUB个人空间PXJy|6c LO
数据库已经关闭。
[L2td@M]v?0已经卸载数据库。
I)H-QwrIY0ORACLE 例程已经关闭。ITPUB个人空间W4zhT/abE
SQL> HOST COPY F:ORACLEBACKUPTEST20060310*.DBF F:ORACLEORADATATEST

SQL> HOST COPY F:ORACLEBACKUPTEST20060310CONTROL01.CTL F:ORACLEORADATATEST

SQL> HOST COPY F:ORACLEORADATATESTCONTROL01.CTL F:ORACLEORADATATESTCONTROL02.CTL

SQL> HOST COPY F:ORACLEORADATATESTCONTROL01.CTL F:ORACLEORADATATESTCONTROL03.CTL

SQL> STARTUP MOUNTITPUB个人空间'bKM4Wp @;vN]
ORACLE 例程已经启动。

Total System Global Area 76619308 bytes
HJ tl qm(J7sH0Fixed Size 454188 bytes
f*i+c'Hr6EPIN{0Variable Size 50331648 bytes
Qa'h,T$WYr;l~x0Database Buffers 25165824 bytesITPUB个人空间!} rgn&D/S VxE
Redo Buffers 667648 bytesITPUB个人空间3X3IX^O#{v
数据库装载完毕。
Q!r(ScG*Dty0SQL> RECOVER DATABASE USING BACKUP CONTROLFILEITPUB个人空间'S,Ru5M)b F X
ORA-00279: 更改 46427277 (在 03/10/2006 23:10:38 生成) 对于线程 1 是必需的
P \-wm aO*]0ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00001.001
DM\5Cm'?9_~.]#T0ORA-00280: 更改 46427277 对于线程 1 是按序列 # 1 进行的

ITPUB个人空间8]Faa3L!KdO6[*{
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}ITPUB个人空间tB~Ga
AUTO
!X-Jml/dP0ORA-00279: 更改 46427492 (在 03/10/2006 23:17:24 生成) 对于线程 1 是必需的ITPUB个人空间 \ FA&Nr
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00002.001ITPUB个人空间3m(?7Q@E~q6g n
ORA-00280: 更改 46427492 对于线程 1 是按序列 # 2 进行的ITPUB个人空间t,ji&vTrP#F7KvS-X
ORA-00278: 此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00001.001'


w)m#ZT2ZBk8s0LQ"E0ORA-00279: 更改 46427504 (在 03/10/2006 23:17:56 生成) 对于线程 1 是必需的
2A3?"O0?.INzQjP0ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00003.001ITPUB个人空间 i:R{ Az,S'W
ORA-00280: 更改 46427504 对于线程 1 是按序列 # 3 进行的ITPUB个人空间n5@:U;a0{ o
ORA-00278: 此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00002.001'

ITPUB个人空间&ydg/C)n$~m D U
ORA-00328: 归档日志在更改 46367785 结束,需要稍后的更改 46427504
'Hv+p#ev.i0ORA-00334: 归档日志: 'F:ORACLEORADATATESTARCHIVEARC00003.001'

SQL> RECOVER DATABASE USING BACKUP CONTROLFILEITPUB个人空间2r&n!?(a d
ORA-00279: 更改 46427504 (在 03/10/2006 23:17:56 生成) 对于线程 1 是必需的
1D'H'hCz0ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00003.001
9y0\h#g+`qYI3qs} N0p0ORA-00280: 更改 46427504 对于线程 1 是按序列 # 3 进行的

ITPUB个人空间.q$F%b-~ }'eI8Yl
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}ITPUB个人空间M8i;S*Ma$q t5d
F:ORACLEORADATATESTREDO03.LOGITPUB个人空间 e7I#g1DS[-I8ms
已应用的日志。
(vI*nS*lX)Q+T'R!| f0完成介质恢复。

这个时候按照正常的步骤只需要以RESETLOGS方式打开数据库就完成了恢复工作。不过为了RESETLOGS之后,以前所有的备份就失效了,如果希望备份可以在RESETLOGS后继续生效,可以当前不要马上打开数据库,而是先关闭数据库,备份全库后,在以RESETLOGS方式打开。

SQL> SHUTDOWN IMMEDIATEITPUB个人空间&O@w2^;CF M3Y
ORA-01109: 数据库未打开


YZWaB5S0已经卸载数据库。ITPUB个人空间@+K {3\P
ORACLE 例程已经关闭。
d(aGj k'm7]5M!D h0SQL> HOST COPY F:ORACLEORADATATEST*.DBF F:ORACLEBACKUPTEST_BEF_RESETLOGS

SQL> STARTUP MOUNT
A2X+J!jr8Q@b/Z0ORACLE 例程已经启动。

Total System Global Area 76619308 bytes
2N&JE3{V,SS$M |0c8Ha0Fixed Size 454188 bytes
2a N| x1sJ%E:v6\0Variable Size 50331648 bytesITPUB个人空间w4V jg'?4uNEA
Database Buffers 25165824 bytes
4^O/sIl%P5|0Redo Buffers 667648 bytesITPUB个人空间$eP.S_(~;I XDy
数据库装载完毕。ITPUB个人空间Crd SX)s
SQL> ALTER DATABASE OPEN RESETLOGS;

数据库已更改。

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

COUNT(*)ITPUB个人空间[wG Df+j
----------ITPUB个人空间!W|O:J{p%u
6290

SQL> SELECT MIN(ID) FROM YANGTK.TEST_BACKUP;

MIN(ID)ITPUB个人空间&~x v1]Y
----------
pB$Ee H1mAx0 2

SQL> DELETE YANGTK.TEST_BACKUP;

已删除6290行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

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

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

数据库正常使用一段时间后发生故障,下面尝试利用RESETLOGS前的备份进行恢复:

SQL> SHUTDOWN IMMEDIATE
#OM1X0S^B0数据库已经关闭。ITPUB个人空间O0S.NR6vQ]3f#k
已经卸载数据库。
h{ JC+ux6AU.o0ORACLE 例程已经关闭。ITPUB个人空间 q]!Q|AU)h
SQL> HOST COPY F:ORACLEBACKUPTEST_BEF_RESETLOGS*.DBF F:ORACLEORADATATEST

SQL> STARTUP MOUNT
T#P*KH d;ES |4hu0ORACLE 例程已经启动。

Total System Global Area 76619308 bytes
l&P)Ny,T&^MO0Fixed Size 454188 bytes
_8C[z"Z&S uO0Variable Size 50331648 bytes
-~%c;ML/Jo+U'a~0Database Buffers 25165824 bytesITPUB个人空间k6L]j~|`!qF
Redo Buffers 667648 bytesITPUB个人空间-}vB G&Z7enP'I
数据库装载完毕。ITPUB个人空间E-L8WdTJ#n/Pg
SQL> RECOVER DATABASEITPUB个人空间)TPre$~h}_TJ
完成介质恢复。
j&~!Q4v:g Dr,a"Z0SQL> ALTER DATABASE OPEN;

数据库已更改。

SQL> SELECT * FROM YANGTK.TEST_BACKUP;

ID
De+TD,[n0----------ITPUB个人空间/t*a5_x(G%e:K
1


TAG:

 

评分:0

我来说两句

显示全部

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

Open Toolbar