在做案例之前,先查看v$archived_log记录,发现太多了,考虑清除这些归档然后生成一些再做实验。
在操作系统上删除这些归档并不会在控制文件中有记录,所以查看v$archived_log时还会有记录,考虑用RMAN来删除:
RMAN>delete archivelogall;
之后再查看v$archived_log发现还有记录。google了下怎么解决,有三种方法。
1.重建控制文件,例如 backup controlfileto trace后重建该控制文件,但要求有数据文件均存在。
2.设置control_file_record_keep_time=0 然后等待记录被重用,这样很不好。
3.使用包来清理,注意不要在生产库上这么做
PROCEDURE resetCfileSection(record_typeINbinary_integer);
– This procedure attemptsto reset the circular controlfilesection.
– Input parameters:
– record_type
– The circular record type whose controlfile sectionisto be reset.
execute sys.dbms_backup_restore.resetCfileSection(11); ==> 清理v$ARCHIVED_LOG对应的记录
execute sys.dbms_backup_restore.resetCfileSection(28); ==>清理v$rman_status对应的记录
模拟环境:
首先做一个冷备。
查看当前日志状态
select group#,sequence#,archived,statusfrom v$log;
GROUP# SEQUENCE# ARC STATUS
----------------------- ----------------
1 4 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE
查看归档日志
select name,sequence#from v$archived_log;
NAME SEQUENCE#
------------------------------------------------------------------------------------------
/u01/fast_recovery_area/MIKE/archivelog/2013_06_28/o1_mf_1_1_8wtf58m4_.arc 1
/u01/fast_recovery_area/MIKE/archivelog/2013_06_28/o1_mf_1_2_8wtf59cw_.arc 2
/u01/fast_recovery_area/MIKE/archivelog/2013_06_28/o1_mf_1_3_8wtf5ctc_.arc 3
此时我用test用户创建一个t1表,使用的是TEST表空间
create table t1(id number);
写一个循环插入数据
begin
for i in 1..10
loop
insert into t1 values(i);
end loop;
end;
/
提交
commit;
查看下当前日志
select group#,sequence#,archived,statusfrom v$log;
GROUP# SEQUENCE# ARC STATUS
----------------------- ----------------
1 4 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE
刚才的操作变化记录在了sequence为4的日志中。下面切一组日志,让其归档。
alter system switch logfile;
现在模拟介质失败
rm -f /u01/oradata/mike/*.dbf
关库
shutdown abort
起库
startup
出错
ORA-01157: cannot identify/lockdatafile1- see DBWR tracefile
ORA-01110:datafile1:'/u01/oradata/mike/system01.dbf'
查看所需要恢复的文件
select file#,error from v$recover_file;
FILE# ERROR
---------------------------------------------------------------------------
1 FILENOTFOUND
2 FILENOTFOUND
3 FILENOTFOUND
4 FILENOTFOUND
5 FILENOTFOUND
8 FILENOTFOUND
现在开始还原
cp /backup/cold/mike/*.dbf/u01/oradata/mike/
再查看控制文件头部和数据文件头部SCN的差异
sys@MIKE>selectfile#,checkpoint_change#from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1553122
2 1553122
3 1553122
4 1553122
5 1553122
8 1553122
sys@MIKE>selectfile#,checkpoint_change#from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1552527
2 1552527
3 1552527
4 1552527
5 1552527
8 1552527
下面恢复数据库
recover database;
ORA-00279: change1552528 generatedat06/28/201314:57:57 neededfor thread 1
ORA-00289: suggestion:/u01/fast_recovery_area/MIKE/archivelog/2013_06_28/o1_mf_1_1_8wtf58m4_.arc
ORA-00280: change1552528for thread1isinsequence #1
Specify log:{<RET>=suggested| filename | AUTO| CANCEL}...
一路回车下去,数据库使用归档日志来恢复数据库。最后打开数据库。
alter databaseopen;
最后用test用户连上查t1数据,数据回来了。
再查select file#,checkpoint_change#from v$datafile;
select file#,checkpoint_change#from v$datafile_header;
发现控制文件和数据文件头部的SCN是同步的。
模拟环境:
1.用test用户登录创建一个表再插入一些数据提交
create table t01(id int) tablespacetest;
insert into t01 values(1);
insert into t01 values(2);
insert into t01 values(3);
commit;
2.模拟介质失败
shutdown abort
rm -f /u01/oradata/siqian11g/test01.dbf
3.起库
出错:
ORA-01157: cannot identify/lockdatafile6- see DBWRtracefile
ORA-01110:datafile6:'/u01/oradata/siqian11g/test01.dbf'
查看下要恢复的数据文件:
select file#,error from v$recover_file;
FILE#ERROR
---------------------------------------------------------------------------
1 UNKNOWN ERROR
2 UNKNOWN ERROR
3 UNKNOWN ERROR
4 UNKNOWN ERROR
5 UNKNOWN ERROR
6 FILENOTFOUND
4.还原数据文件
cp /backup/cold/test01.dbf/u01/oradata/siqian11g/
5.将数据文件offline(模拟高可用性),然后起库
alter database datafile6offline;
起库
alter database open;
6.恢复表空间
recover tablespacetest;
ORA-00279: change2067764 generatedat06/29/201312:11:34 neededfor thread 1
ORA-00289: suggestion:/backup/arch/arch_1_819372290_12.log
ORA-00280: change2067764for thread1isin sequence #12
Specify log:{<RET>=suggested| filename | AUTO| CANCEL}...
一路回车下去来恢复表空间。
7.将数据文件online
alter database datafile6online;
8.验证
conn test/test
test@SIQIAN11>select*from t01;
ID
----------
1
2
3
----database open状态下恢复数据文件(除了system表空间)
模拟环境:
1.test用户登录
test@SIQIAN11>select*from t01;
ID
----------
1
2
3
插入一些数据:
insert into t01 values(4);
insert into t01 values(5);
insert into t01 values(6);
commit;
2.在database open状态下删除test01.dbf
[oracle@siqian siqian11g]$ rm-f/u01/oradata/siqian11g/test01.dbf
然后清除data buffer
sys@SIQIAN11>alter system flush buffer_cache;
sys@SIQIAN11>select*from test.t01;
select * from test.t01
*
ERROR at line 1:
ORA-01116: errorin opening databasefile6
ORA-01110:datafile6:'/u01/oradata/siqian11g/test01.dbf'
ORA-27041: unabletoopenfile
Linux Error: 2: No suchfileor directory
Additional information:3
3.将被损坏的datafile offline
alter database datafile6offline;
4.还原数据文件
[oracle@siqian siqian11g]$ cp/backup/cold/test01.dbf/u01/oradata/siqian11g/
5.恢复数据文件or表空间
recover datafile 6 或 recover tablespace test(这里我用的前者)
sys@SIQIAN11>recover datafile6;
ORA-00279: change2067764 generatedat06/29/201312:11:34 neededfor thread 1
ORA-00289: suggestion:/backup/arch/arch_1_819372290_12.log
ORA-00280: change2067764for thread1isinsequence #12
Specify log:{<RET>=suggested| filename | AUTO| CANCEL}
Log applied.
Media recovery complete.
6.将被脱机的数据文件online
alter database datafile6online;
7.验证
sys@SIQIAN11>select*from test.t01;
ID
----------
1
2
3
4
5
6
6 rows selected.
----新建一个表空间,没有备份,数据文件被删除
1.新建一个表空间
create tablespace ts_no_test datafile'/u01/oradata/siqian11g/ts_no_test01.dbf'size10m;
此时控制文件中有了这个表空间的信息。
2.用test用户在新建表空间中加表
test@SIQIAN11>createtable t02(idint) tablespace ts_no_test;
insert into t02 values(1);
insert into t02 values(2);
insert into t02 values(3);
commit;
3.关库并删除该表空间的数据文件
shutdown abort
rm -f /u01/oradata/siqian11g/ts_no_test01.dbf
4.起库
startup
出错:
ORA-01157: cannot identify/lockdatafile7- see DBWR tracefile
ORA-01110:datafile7:'/u01/oradata/siqian11g/ts_no_test01.dbf'
查看需要恢复的文件:
sys@SIQIAN11>selectfile#,errorfrom v$recover_file;
FILE# ERROR
---------------------------------------------------------------------------
1 UNKNOWN ERROR
2 UNKNOWN ERROR
3 UNKNOWN ERROR
4 UNKNOWN ERROR
5 UNKNOWN ERROR
6 UNKNOWN ERROR
7 FILENOTFOUND
7 rows selected.
5.恢复数据文件
sys@SIQIAN11>alter database datafile7offline;
sys@SIQIAN11>alter databaseopen;(高可用性)
由于我没做备份,所以不能做还原(resotre),但控制文件中记录了刚才创建的表空间的信息,所以可以先创建一个原来的数据文件,然后再来恢复。
alter database create datafile '/u01/oradata/siqian11g/ts_no_test01.dbf';
sys@SIQIAN11>recover datafile7;
Media recovery complete.
sys@SIQIAN11>alter database datafile7online;
6.验证
sys@SIQIAN11>select*from test.t02;
ID
----------
1
2
3
模拟环境:
1.用test用户在t01表中插入一些数据
test@SIQIAN11>begin
2 for iin 11..15
3 loop
4 insertinto t01 values(i);
5 endloop;
6 end;
7 /
PL/SQLprocedure successfully completed.
2.关库删除相关数据文件模拟介质失败
[oracle@siqian siqian11g]$ rm-f /u01/oradata/siqian11g/test01.dbf
3.起库
startup
出错:
ORA-01157: cannot identify/lockdata file6 - see DBWR tracefile
ORA-01110:data file6:'/u01/oradata/siqian11g/test01.dbf'
查看所要恢复的文件信息
sys@SIQIAN11>selectfile#,errorfrom v$recover_file;
FILE# ERROR
---------------------------------------------------------------------------
1 UNKNOWN ERROR
2 UNKNOWN ERROR
3 UNKNOWN ERROR
4 UNKNOWN ERROR
5 UNKNOWN ERROR
6 FILENOT FOUND
6 rows selected.
4.将失败的介质offline并还原到新位置
sys@SIQIAN11>alter database datafile6 offline;
sys@SIQIAN11>alter databaseopen;(高可用性)
[oracle@siqian siqian11g]$ cp/backup/cold/test01.dbf/u01/oradata/
5.将控制文件中的数据文件名重命名
alter database rename file'/u01/oradata/siqian11g/test01.dbf' to'/u01/oradata/test01.dbf';
6.恢复数据文件
sys@SIQIAN11>recover datafile6;
ORA-00279: change2067764 generated at06/29/201312:11:34 neededfor thread 1
ORA-00289: suggestion: /backup/arch/arch_1_819372290_12.log
ORA-00280: change2067764 for thread1 is in sequence #12
Specify log:{<RET>=suggested| filename | AUTO| CANCEL}...
回车下去恢复。。。
7.将被offline的数据文件online
sys@SIQIAN11>alter database datafile6 online;
8.验证
sys@SIQIAN11>select* from test.t01;
ID
----------
11
12
13
14
15
1
2
3
4
5
6
11 rows selected.