ITPub博客

首页 > 应用开发 > IT综合 > DB恢复实践(1)

DB恢复实践(1)

原创 IT综合 作者:aspen1982 时间:2011-08-30 16:09:03 0 删除 编辑

DB恢复实践系列。

使用冷备份和归档日志恢复数据库。

联机重做日志(redo log)没有丢失应使用完全恢复:

1.recover database

2.alter database open

如联机重演日志损坏,而又没有备份,就只能进行不完全恢复:

1.recover database until XXX

2.alter database open resetlogs

关键字:冷备份 归档日志 恢复数据库

[@more@]

恢复基础材料

1T1时刻全库冷备份backT1

2T1时刻到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

指定日志: {=suggested | filename | AUTO | CANCEL}

选择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

指定日志: {=suggested | filename | AUTO | CANCEL}

选择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操作后一定要备份数据库,因为resetlogsredo信息就不再连续了,无法依靠resetlogs之前的备份和归档日志来将数据库恢复到resetlogs之后的状态。我们可以看到,resetlogs之后,归档日志的编号也不再连续了(重新开始编号)。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21129591/viewspace-1054572/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-07-06

  • 博文量
    24
  • 访问量
    60654