v$recovery_log:在恢复时需要使用的归档日志信息,当一个数据文件需要恢复的时候,这里面才会有信息。
v$archived_log:包括所有的归档日志组信息。
v$recover_file:记录这所有需要被恢复的文件,是从控制文件得来的。要保证控制文件是最新的。
恢复命令:
在mount状态下,可以使用recover database或者recover datafile ‘/u01/oracle/guo/users01.dbf’;
在open状态下,可以使用recover tablespace users或者 recover datafile ‘/u01/oracle/guo/users01.dbf’;
建立测试环境:
创建一个表空间,增加一个用户;
建立一个表,插入一条数据,做次冷备份;
再插入一条记录,做次热备份;
再插入一条记录,手工切换联机重做日志文件;
1、创建一个表空间hckj(hckj01.dbf),创建一个用户usr1/usr1,建立一个表t,插入一条记录。
create tablespace hckj datafile '/u01/app/oracle/oradata/mdguo/hckj01.dbf’ size 10M extent management local uniform segment space management auto;
create user usr1 identified by usr1 default tablespace hckj;
grant connect,resource to usr1;
用usr1登录
create table t (id int,name varchar2(10));
insert into t values(0,’xue’);
commit;
2、做一次冷备
shutdown immediate
cp
3、用usr1登录,再增加一条记录:
insert into t values(1,’xue’);
commit;
4、做次热备
alter tablespace hckj begin backup;
把hckj01.dbf备份一份。cp到一个位置。
alter tablespace hckj end backup;
5、用usr1登录,再增加一条记录:
insert into t values(2,’yao’);
commit;
6、手工切换日志
alter system switch logfile;
环境搭建结束。
测试一、删除所有的数据文件,在数据库关闭的情况下完全恢复。
rm *。dbf
只有系统表空间或undo表空间发生故障,才需要在数据库关闭的情况下进行恢复。
步骤:
1、把冷备的文件cp回原位置,用冷备的文件加上archive文件就是删除前的文件。
步骤如下:
cp /u01/cold/*.dbf . #拷贝所有的dbf文件,到原位置。
2、登录数据库
sqlplus /nolog
conn /as sysdba
startup
3、查询哪些是需要恢复的文件
col error format a18
select * from v$recover_file; #这里面显示的都是需要恢复的。
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- ------------------ ---------- ---------
1 ONLINE ONLINE 883189 24-NOV-11
2 ONLINE ONLINE 883189 24-NOV-11
3 ONLINE ONLINE 883189 24-NOV-11
4 ONLINE ONLINE 883189 24-NOV-11
5 ONLINE ONLINE 883189 24-NOV-11
6 ONLINE ONLINE 883189 24-NOV-11
7 ONLINE ONLINE 883189 24-NOV-11
4、进行恢复:
recover database;
SQL> recover database; #一次性恢复所有。也可以使用recover datafile n;例如recover datafile 7;
ORA-00279: change 883189 generated at 11/24/2011 23:50:13 needed for thread 1
ORA-00289: suggestion : /u01/arcbackup/1_3_768088723.dbf
ORA-00280: change 883189 for thread 1 is in sequence #3
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: change 883933 generated at 11/25/2011 00:46:29 needed for thread 1
ORA-00289: suggestion : /u01/arcbackup/1_4_768088723.dbf
ORA-00280: change 883933 for thread 1 is in sequence #4
ORA-00278: log file '/u01/arcbackup/1_3_768088723.dbf' no longer needed for
this recovery
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 883935 generated at 11/25/2011 00:46:31 needed for thread 1
ORA-00289: suggestion : /u01/arcbackup/1_5_768088723.dbf
ORA-00280: change 883935 for thread 1 is in sequence #5
ORA-00278: log file '/u01/arcbackup/1_4_768088723.dbf' no longer needed for
this recovery
Log applied.
Media recovery complete.
4、恢复结束,查询结果,全部数据已正常恢复。
SQL> select * from usr1.t;
ID NAME
---------- ----------
1 wang
0 xue
2 yao
测试二、删除一个用户数据,在数据库打开的情况下恢复。
场景说明:数据库中,一个文件损坏,但其他还需正常工作,只能在数据库运行中进行恢复。
为了测试,我们在usr1中增加一条新纪录。
insert into t values(3,’zhang’);
commit;
alter system checkpoint;
步骤:
1、挂载数据库
正常情况下,文件损坏,自己是不知道的,我们直接startup
SQL> startup
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 71304784 bytes
Database Buffers 209715200 bytes
Redo Buffers 2973696 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
ORA-01110: data file 7: '/u01/app/oracle/oradata/mdguo/hckj01.dbf'
2、把损坏的数据离线,并打开数据库,是其他数据库正常工作。
SQL> alter database datafile 7 offline;
SQL> alter database open;
Database altered.
3、cp备份
[oracle@oral mdguo]$ cp /u01/cold/hckj01.dbf .
4、restore !
SQL> recover datafile 7;
5、把新恢复的数据设为在线:
SQL> alter database datafile 7 online;
Database altered.
6、测试 查询:
SQL> select * from usr1.t order by 1;
ID NAME
---------- ----------
0 xue
1 wang
2 yao
3 zhang
OK 恢复成功!!
测试三、数据文件损坏,但是没有备份。
前提:
1、不能是系统表空间,不能是老的控制文件。
2、数据库创建之后的所有的归档日志文件都在。
3、者控制文件里包含被损坏的文件的文件名(控制文件是当前的,或在损坏文件创建之后做的备份)。
环境搭建:
在创建一个新的表空间,在其上建立一个表,写入条记录。步骤同上,这里省略。
步骤:
1、把损坏的文件offline,
SQL> col name format a56;
SQL> select TS#,name from v$datafile;
TS# NAME
---------- --------------------------------------------------------
0 /u01/app/oracle/oradata/mdguo/system01.dbf
1 /u01/app/oracle/oradata/mdguo/undotbs01.dbf
2 /u01/app/oracle/oradata/mdguo/sysaux01.dbf
4 /u01/app/oracle/oradata/mdguo/users01.dbf
6 /u01/app/oracle/oradata/mdguo/example01.dbf
7 /u01/app/oracle/oradata/mdguo/guo.dbf
10 /u01/app/oracle/oradata/mdguo/hckj01.dbf
11 /u01/app/oracle/oradata/mdguo/hckj02.dbf
8 rows selected.
关闭数据库,在打开,发现datafile文件号和上述查出来的不一样。
SQL> startup
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 71304784 bytes
Database Buffers 209715200 bytes
Redo Buffers 2973696 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 8 - see DBWR trace file
ORA-01110: data file 8: '/u01/app/oracle/oradata/mdguo/hckj02.dbf'
或者 按照上例子中方法,关闭数据库,再挂载让oracle自动发现,然后在离线,但是这两种方法的datafile文件号不一样的。
SQL> alter database datafile 8 offline;
Database altered.
SQL> alter database open;
Database altered.
2、重新创建一个空白的文件,名字和之前的一样
SQL> alter database create datafile '/u01/app/oracle/oradata/mdguo/hckj02.dbf';
Database altered.
3、恢复
SQL> recover datafile 8;
Media recovery complete.
4、使恢复的文件online。
SQL> alter database datafile 8 online;
Database altered.
5、查询一下:
SQL> select * from usr1.t2;
ID NAME
---------- ----------
1 yang
OK,恢复正常!