1.1 应用场景
1.1.1 应用场景条件
u 拥有数据库一个时间点上冷备份(注意:这里的全备份不是rman的full 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 创建生成controlfile的trace文件,编辑创建控制文件的脚本
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/