DB恢复实践系列。
使用冷备份和归档日志恢复数据库。
联机重做日志(redo log)没有丢失应使用完全恢复:
1.recover database
2.alter database open
如联机重演日志损坏,而又没有备份,就只能进行不完全恢复:
1.recover database until XXX
2.alter database open resetlogs
关键字:冷备份 归档日志 恢复数据库
[@more@]1.T1时刻全库冷备份backT1
2.T1时刻到T2时刻的归档日志
T2时刻数据库
创建backT1
T1时刻停库,将全库做冷备分为backT1
创建验证表
启动数据库,创建验证表
SQL> create table cold_test as select * from dba_objects where rownum < 4;
表已创建。
SQL> select count(1) from cold_test;
COUNT(1)
----------
3
切换日志并关闭数据库
SQL> alter system switch logfile;
系统已更改。
SQL> alter system checkpoint;
系统已更改。
SQL> shutdown immediate
全库备份
T2时刻停库,将全库做冷备分为backT2。恢复失败时可以直接使用backT2恢复。
本次应用的是不完全恢复。
应用不完成恢复前,必须将数据库做一次完全冷备份,因为应用不完全恢复后,联机重演日志将重置,以前的所有日志不可用。如果恢复不成功又没有在恢复前做备份(即无法回滚),数据库就不能使用了。
验证backT1的可用性
使用backT1启动数据库到open read only状态,其中控制文件可以用backT1中的,也可以用backT2中的。
SQL> startup mount
数据库装载完毕。
SQL> alter database open read only;
数据库已更改。
检查alterlog,查询数据字典,业务数据等验证backT1的可用性。
重启到mount状态
SQL> startup mount
数据库装载完毕。
此时控制文件,数据文件,数据文件头部的SCN号一致,可以不作恢复,直接打开,当然此时打开的话,只是T1时刻的数据库,在T1时刻后创建的测试表是不存在的。
SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
4356656
SQL> select file#,CHECKPOINT_CHANGE# from v$datafile where file#=1;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 4356656
SQL> select CHECKPOINT_CHANGE# from v$datafile_header where file#=1;
CHECKPOINT_CHANGE#
------------------
4356656
SQL> recover database
ORA-00283: 恢复会话因错误而取消
ORA-00264: 不要求恢复
恢复数据库到T2时刻的状态
SQL> recover database using backup controlfile;
ORA-00279: 更改 4356656 (在 08/30/2011 14:39:40 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2011_08_30O1_MF_1_7_%U_.ARC
ORA-00280: 更改 4356656 (用于线程 1) 在序列 #7 中
指定日志: {
选择auto。
应用了3个归档日志。
此时SCN不一致,open会有问题。
SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
4356656
SQL> select file#,CHECKPOINT_CHANGE# from v$datafile where file#=1;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 4356940
SQL> select CHECKPOINT_CHANGE# from v$datafile_header where file#=1;
CHECKPOINT_CHANGE#
------------------
4356940
SQL> alter database open read only;
alter database open read only
*
第 1 行出现错误:
ORA-16004: 备份数据库需要恢复
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF'
基于时间来做不完全恢复
SQL> recover database using backup controlfile until time '2011-08-30 15:01:00';
ORA-00279: 更改 4356940 (在 08/30/2011 14:59:57 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2011_08_30O1_MF_1_10_%U_.ARC
ORA-00280: 更改 4356940 (用于线程 1) 在序列 #10 中
指定日志: {
选择auto。
虽然没有应用任何归档日志,SCN号依然不一致,但是可以open read only了
SQL> alter database open read only;
数据库已更改。
SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
4356656
SQL> select file#,CHECKPOINT_CHANGE# from v$datafile where file#=1;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 4356940
SQL> select CHECKPOINT_CHANGE# from v$datafile_header where file#=1;
CHECKPOINT_CHANGE#
------------------
4356940
检查验证表,确认已恢复。
SQL> select count(1) from cold_test;
COUNT(1)
----------
3
打开数据库
重启到mount状态,再open resetlogs
SQL> alter database open resetlogs;
数据库已更改。
备份数据库
resetlogs操作后一定要备份数据库,因为resetlogs后redo信息就不再连续了,无法依靠resetlogs之前的备份和归档日志来将数据库恢复到resetlogs之后的状态。我们可以看到,resetlogs之后,归档日志的编号也不再连续了(重新开始编号)。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21129591/viewspace-1054572/ ,如需转载,请注明出处,否则将追究法律责任。