使用冷备份与冷备份后的数据库归档日志文件进行数据库不完整恢复

1.1 应用场景

1.1.1 应用场景条件

u 拥有数据库一个时间点上冷备份(注意:这里的全备份不是rmanfull database backup,而是全库数据文件的拷贝)

u 拥有从那个时间点开始的所有的归档日志文件。

1.1.2 应用场景目标

使用全库时间点全库备份和时间点后的归档日志文件,进行数据库恢复,恢复数据库到最后一个归档日志文件确定的时间点。

[@more@]

1.1 实验内容

1.1.1 实验环境初始状态

SQL> select * from v$version;

BANNER

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Prod

SQL> select name from v$datafile;

C:ORACLEORADATAAIDUSYSTEM01.DBF

C:ORACLEORADATAAIDUUNDOTBS01.DBF

C:ORACLEORADATAAIDUSYSAUX01.DBF

C:ORACLEORADATAAIDUUSERS01.DBF

C:ORACLEORADATAAIDUAIDU01.DBF

SQL> archive log list;

数据库日志模式 存档模式

自动存档 启用

存档终点 c:oraclearchivelog

最早的联机日志序列 1

下一个存档日志序列 1

当前日志序列 1

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#

201351

SQL> select checkpoint_change# from v$datafile;

CHECKPOINT_CHANGE#

201351

201351

201351

201351

201351

SQL> select username,default_tablespace from dba_users;

USERNAME DEFAULT_TABLESPACE

SYS SYSTEM

SYSTEM SYSTEM

DBSNMP SYSAUX

SYSMAN SYSAUX

AIDU AIDU

1.1.2 停止数据库运行,进行数据库全库冷备份

Sqlplus / as sysdba

SQL>shutdown immediate;

C:>cp c:oracleoradataaidu*.* c:oracleoradataaidu_bak

Sqlplus / as sysdba

SQL>startup

1.1.3 插入实验数据,生成两个归档日志文件

Sqlplus / as sysdba

SQL>startup

Sqlplus /nolog

SQL>conn aidu/*******

SQL>create table test01(id number(10,2),name varchar2(200),primary key(id));

SQL> insert into test01(id,name) values(1,’test for restore db from full db copy’);

已创建 1 行。

SQL> insert into test01(id,name) select id+(select count(1) from test01),name from test01;

已创建 1 行。

SQL> /

已创建2行。

SQL> /

已创建4行。

SQL> /

已创建8行。

SQL> /

已创建16行。

SQL> /

已创建32行。

SQL> commit;

提交完成。

SQL> select count(1) from test02;

COUNT(1)

----------

64

在表test02里插入了64条记录后,进行一次归档日志的切换,将这个变化保存到归档日志文件中。

SQL>conn / as sysdba

SQL> alter system switch logfile;

系统已更改。

再次向aidu.test02表中插入记录

SQL>conn aidu/*******

SQL> insert into test02(id,name) select id+(select count(1) from test02),name from t

已创建64行。

SQL> /

已创建128行。

SQL> /

已创建256行。 ####此时test01表里有512条记录.

再次进行归档日志的切换,将新的变化保存到数据库归档日志文件中.

SQL>conn / as sysdba

SQL>alter system switch logfile;

系统已更改。

SQL>alter system switch logfile;

系统已更改。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#

205547

SQL> select first_change#,next_change#,name,sequence# from v$archived_log

FIRST_CHANGE#NEXT_CHANGE# NAME SEQUENCE#

201348 203621 C:ORACLEARCHIVELOGARC00001_0751290496.001 1

203621 203684 C:ORACLEARCHIVELOGARC00002_0751290496.001 2

203684 204036 C:ORACLEARCHIVELOGARC00003_0751290496.001 3

204036 204387 C:ORACLEARCHIVELOGARC00004_0751290496.001 4

204387 204405 C:ORACLEARCHIVELOGARC00005_0751290496.001 5

204405 204885 C:ORACLEARCHIVELOGARC00006_0751290496.001 6

204885 205360 C:ORACLEARCHIVELOGARC00007_0751290496.001 7

205360 205383 C:ORACLEARCHIVELOGARC00008_0751290496.001 8

205383 205734 C:ORACLEARCHIVELOGARC00009_0751290496.001 9

1.1.4 关闭数据库,模拟灾难发生

1.1.4.1 停止数据库运行

Sqlplus / as sysdba

SQL>shutdown immediate;

此时可以去归档日志目录检查一下,在数据库停止时,会产生一个归档日志文件,本例为(c:oraclearchivelog ARC00009_0751290496.001),后面的恢复,如果使用到这个归档日志文件,则说明恢复是成功的。

1.1.4.2 模拟数据库灾难发生

修改当前的数据库文件目录名称,模拟数据库文件全部丢失(因为数据库文件目录c:oracleoradataaidu 已经不存在了)

Ren c:oracleoradataaidu c:oracleoradataaidu_new

1.1.4.3 模拟使用数据库冷备份进行数据库文件的物理恢复

将原来的冷备份目录更改为数据库文件目录名,模拟使用数据库的冷备份,将数据库文件恢复回来.

Ren c:oracleoradataaidu_bak c:oracleoradataaidu

注意:此时c:oracleoradataaidu 目录存放的数据库文件是冷备份的数据库文件.

1.1.5 进行数据库恢复操作

1.1.5.1 启动数据库到mount状态(注意千万不要启动到open状态)

SQL> startup mount;

ORACLE 例程已经启动。

Total System Global Area 612368384 bytes

Fixed Size 1304728 bytes

Variable Size 167774056 bytes

Database Buffers 436207616 bytes

Redo Buffers 7081984 bytes

数据库装载完毕。

数据库已经打开。

因为使用冷备份的介质,所以启动数据库到mount状态应该没有任何问题.启动到mount状态而不是open状态,是为了不更改数据文件的scn.(曾经尝试启动数据库到open状态,然后进行后面的恢复,结果失败,分析一下原因,发现问题出在了启动数据库后,很多数据库文件的scn发生了变化,导致与归档日志里的记录不吻合,从而导致恢复失败).

1.1.5.2 创建生成controlfiletrace文件,编辑创建控制文件的脚本

SQL> alter database backup controlfile to trace;

数据库已更改。

打开$ORACLE_BASE/admin/udump/目录下最新的trace文件,找出该文件中创建controlfile文件的脚本(注意选择resetlog那一节的脚本).创建新建控制文件的脚本,内容如下:

CREATE CONTROLFILE REUSE DATABASE "AIDU" RESETLOGS ARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 'C:ORACLEORADATAAIDUREDO01.LOG' SIZE 50M,

GROUP 2 'C:ORACLEORADATAAIDUREDO02.LOG' SIZE 50M,

GROUP 3 'C:ORACLEORADATAAIDUREDO03.LOG' SIZE 50M

-- STANDBY LOGFILE

DATAFILE

'C:ORACLEORADATAAIDUSYSTEM01.DBF',

'C:ORACLEORADATAAIDUUNDOTBS01.DBF',

'C:ORACLEORADATAAIDUSYSAUX01.DBF',

'C:ORACLEORADATAAIDUUSERS01.DBF',

'C:ORACLEORADATAAIDUAIDU01.DBF'

CHARACTER SET ZHS16GBK;

1.1.5.3 关闭数据库

SQL> shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

1.1.5.4 启动数据库到nomount状态,创建新的控制文件

SQL> startup nomount;

ORACLE 例程已经启动。

Total System Global Area 612368384 bytes

Fixed Size 1304728 bytes

Variable Size 167774056 bytes

Database Buffers 436207616 bytes

Redo Buffers 7081984 bytes

SQL> CREATE CONTROLFILE REUSE DATABASE "AIDU" RESETLOGS ARCHIVELOG

2 MAXLOGFILES 16

3 MAXLOGMEMBERS 3

4 MAXDATAFILES 100

5 MAXINSTANCES 8

6 MAXLOGHISTORY 292

7 LOGFILE

8 GROUP 1 'C:ORACLEORADATAAIDUREDO01.LOG' SIZE 50M,

9 GROUP 2 'C:ORACLEORADATAAIDUREDO02.LOG' SIZE 50M,

10 GROUP 3 'C:ORACLEORADATAAIDUREDO03.LOG' SIZE 50M

11 -- STANDBY LOGFILE

12 DATAFILE

13 'C:ORACLEORADATAAIDUSYSTEM01.DBF',

14 'C:ORACLEORADATAAIDUUNDOTBS01.DBF',

15 'C:ORACLEORADATAAIDUSYSAUX01.DBF',

16 'C:ORACLEORADATAAIDUUSERS01.DBF',

17 'C:ORACLEORADATAAIDUAIDU01.DBF'

18 CHARACTER SET ZHS16GBK;

控制文件已创建。

1.1.5.5 进行数据库恢复

SQL> recover database using backup controlfile until cancel;

ORA-00279: change 205046 generated at 05/16/2011 15:04:02 needed for thread 1

ORA-00289: suggestion : C:ORACLEARCHIVELOGARC00007_0751290496.001

ORA-00280: change 205046 for thread 1 is in sequence #7

Specify log: {=suggested | filename | AUTO | CANCEL}

AUTO ####注意:这里回答AUTO 就可以了

ORA-00279: change 205360 generated at 05/16/2011 15:13:05 needed for thread 1

ORA-00289: suggestion : C:ORACLEARCHIVELOGARC00008_0751290496.001

ORA-00280: change 205360 for thread 1 is in sequence #8

ORA-00278: log file 'C:ORACLEARCHIVELOGARC00007_0751290496.001' no longer

needed for this recovery

ORA-00279: change 205383 generated at 05/16/2011 15:14:10 needed for thread 1

ORA-00289: suggestion : C:ORACLEARCHIVELOGARC00009_0751290496.001

ORA-00280: change 205383 for thread 1 is in sequence #9

ORA-00278: log file 'C:ORACLEARCHIVELOGARC00008_0751290496.001' no longer

needed for this recovery

ORA-00279: change 205734 generated at 05/16/2011 15:18:32 needed for thread 1

ORA-00289: suggestion : C:ORACLEARCHIVELOGARC00010_0751290496.001

ORA-00280: change 205734 for thread 1 is in sequence #10

ORA-00278: log file 'C:ORACLEARCHIVELOGARC00009_0751290496.001' no longer

needed for this recovery

ORA-00308: cannot open archived log

'C:ORACLEARCHIVELOGARC00010_0751290496.001'

ORA-27041: unable to open file

最终以找不到新的归档日志序列文件的错误提示结束,这属于正常的情况,因为ORACLE 会在auto方式下穷尽寻找,直至最后,然后报一个找不到下一个的错误.

SQL> alter database open resetlogs;

Database altered.

1.1.5.6 检验数据库是否恢复到最新的数据状态.

u 检查恢复后的数据库SCN

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#

------------------

205738 ####大于停库前的205734

u 检查特征表的记录

SQL> conn aidu/*****

Connected.

SQL> select count(1) from test01;

COUNT(1)

512 ####与恢复前的数据记录数完全相同,恢复成功.

1.2 总结

通常我们使用数据库的冷备份,可以将数据库回复到冷备份的时间点。但如果只恢复到时间点还不满足要求,同时我们又有冷备份后的所有归档日志文件,我们就可以使用上文提到的方法,进行更有效的数据库不完整恢复,减少数据库数据的丢失。

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

转载于:http://blog.itpub.net/32980/viewspace-1049938/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值